carbon-components-angular
Version:
Next generation components
208 lines (204 loc) • 16.8 kB
JavaScript
import { HostBinding, Component, Input, Output, EventEmitter } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* Available HTML anchor targets
*/
export var Target;
(function (Target) {
Target["self"] = "_self";
Target["blank"] = "_blank";
Target["parent"] = "_parent";
Target["top"] = "_top";
})(Target || (Target = {}));
/**
* Security HTML anchor rel when target is set
*/
const REL = "noreferrer noopener";
/**
* `OverflowMenuOption` represents a single option in an overflow menu
*
* Presently it has three possible states - normal, disabled, and danger:
* ```
* <cds-overflow-menu-option>Simple option</cds-overflow-menu-option>
* <cds-overflow-menu-option disabled="true">Disabled</cds-overflow-menu-option>
* <cds-overflow-menu-option type="danger">Danger option</cds-overflow-menu-option>
* ```
*
* For content that expands beyond the overflow menu `OverflowMenuOption` automatically adds a title attribute.
*/
export class OverflowMenuOption {
constructor(elementRef) {
this.elementRef = elementRef;
this.optionClass = true;
this.role = "presentation";
/**
* Set to `true` to display a dividing line above this option
*/
this.divider = false;
/**
* toggles between `normal` and `danger` states
*/
this.type = "normal";
/**
* disable/enable interactions
*/
this.disabled = false;
/**
* Apply a custom class to the inner button/anchor
*/
this.innerClass = "";
this.selected = new EventEmitter();
this.tabIndex = -1;
// note: title must be a real attribute (i.e. not a getter) as of Angular@6 due to
// change after checked errors
this.title = null;
}
get isDanger() {
return this.type === "danger";
}
get isDisabled() {
return this.disabled;
}
/**
* Allows to add a target to the anchor
*/
set target(value) {
if (!Object.values(Target).includes(value)) {
console.warn(`\`target\` must have one of the following values: ${Object.values(Target).join(", ")}.
Please use the \`Target\` enum exported by carbon-components-angular`);
return;
}
this._target = value;
}
get target() {
return this._target;
}
/**
* rel only returns its value if target is defined
*/
get rel() {
return this._target ? REL : null;
}
onClick() {
this.selected.emit();
}
onFocus() {
setTimeout(() => this.tabIndex = 0);
}
onBlur() {
setTimeout(() => this.tabIndex = -1);
}
ngAfterViewInit() {
const button = this.elementRef.nativeElement.querySelector("button, a");
const textContainer = button.querySelector(".cds--overflow-menu-options__option-content");
if (textContainer.scrollWidth > textContainer.offsetWidth) {
this.title = button.textContent;
}
}
}
OverflowMenuOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OverflowMenuOption, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
OverflowMenuOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OverflowMenuOption, selector: "cds-overflow-menu-option, ibm-overflow-menu-option", inputs: { divider: "divider", type: "type", disabled: "disabled", href: "href", target: "target", innerClass: "innerClass" }, outputs: { selected: "selected" }, host: { properties: { "class.cds--overflow-menu-options__option": "this.optionClass", "attr.role": "this.role", "class.cds--overflow-menu-options__option--danger": "this.isDanger", "class.cds--overflow-menu-options__option--disabled": "this.isDisabled", "class.cds--overflow-menu--divider": "this.divider" } }, ngImport: i0, template: `
<button
*ngIf="!href"
class="cds--overflow-menu-options__btn {{innerClass}}"
role="menuitem"
[]="tabIndex"
(focus)="onFocus()"
(blur)="onBlur()"
(click)="onClick()"
[]="disabled"
[]="title">
<ng-container *ngTemplateOutlet="tempOutlet"></ng-container>
</button>
<a
*ngIf="href"
class="cds--overflow-menu-options__btn {{innerClass}}"
role="menuitem"
[]="tabIndex"
(focus)="onFocus()"
(blur)="onBlur()"
(click)="onClick()"
[]="disabled"
[]="href"
[]="target"
[]="rel"
[]="title">
<ng-container *ngTemplateOutlet="tempOutlet"></ng-container>
</a>
<ng-template
<div class="cds--overflow-menu-options__option-content">
<ng-content></ng-content>
</div>
</ng-template>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OverflowMenuOption, decorators: [{
type: Component,
args: [{
selector: "cds-overflow-menu-option, ibm-overflow-menu-option",
template: `
<button
*ngIf="!href"
class="cds--overflow-menu-options__btn {{innerClass}}"
role="menuitem"
[]="tabIndex"
(focus)="onFocus()"
(blur)="onBlur()"
(click)="onClick()"
[]="disabled"
[]="title">
<ng-container *ngTemplateOutlet="tempOutlet"></ng-container>
</button>
<a
*ngIf="href"
class="cds--overflow-menu-options__btn {{innerClass}}"
role="menuitem"
[]="tabIndex"
(focus)="onFocus()"
(blur)="onBlur()"
(click)="onClick()"
[]="disabled"
[]="href"
[]="target"
[]="rel"
[]="title">
<ng-container *ngTemplateOutlet="tempOutlet"></ng-container>
</a>
<ng-template
<div class="cds--overflow-menu-options__option-content">
<ng-content></ng-content>
</div>
</ng-template>
`
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { optionClass: [{
type: HostBinding,
args: ["class.cds--overflow-menu-options__option"]
}], role: [{
type: HostBinding,
args: ["attr.role"]
}], isDanger: [{
type: HostBinding,
args: ["class.cds--overflow-menu-options__option--danger"]
}], isDisabled: [{
type: HostBinding,
args: ["class.cds--overflow-menu-options__option--disabled"]
}], divider: [{
type: HostBinding,
args: ["class.cds--overflow-menu--divider"]
}, {
type: Input
}], type: [{
type: Input
}], disabled: [{
type: Input
}], href: [{
type: Input
}], target: [{
type: Input
}], innerClass: [{
type: Input
}], selected: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctbWVudS1vcHRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RpYWxvZy9vdmVyZmxvdy1tZW51L292ZXJmbG93LW1lbnUtb3B0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxLQUFLLEVBRUwsTUFBTSxFQUNOLFlBQVksRUFFWixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksTUFLWDtBQUxELFdBQVksTUFBTTtJQUNqQix3QkFBYyxDQUFBO0lBQ2QsMEJBQWdCLENBQUE7SUFDaEIsNEJBQWtCLENBQUE7SUFDbEIsc0JBQVksQ0FBQTtBQUNiLENBQUMsRUFMVyxNQUFNLEtBQU4sTUFBTSxRQUtqQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7O0dBV0c7QUF3Q0gsTUFBTSxPQUFPLGtCQUFrQjtJQWtFOUIsWUFBc0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWpFYSxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNsRCxTQUFJLEdBQUcsY0FBYyxDQUFDO1FBV2hEOztXQUVHO1FBQ3dELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDM0U7O1dBRUc7UUFDTSxTQUFJLEdBQXdCLFFBQVEsQ0FBQztRQUM5Qzs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFrQjFCOztXQUVHO1FBQ00sZUFBVSxHQUFHLEVBQUUsQ0FBQztRQVlmLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckIsa0ZBQWtGO1FBQ2xGLDhCQUE4QjtRQUN2QixVQUFLLEdBQUcsSUFBSSxDQUFDO0lBSTJCLENBQUM7SUE5RGhELElBQ1csUUFBUTtRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUNXLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3RCLENBQUM7SUFpQkQ7O09BRUc7SUFDSCxJQUFhLE1BQU0sQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUNmLHFEQUFxRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUVBQ2hCLENBQUMsQ0FBQztZQUNwRSxPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBTUQsSUFBSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JCLENBQUM7SUFDRDs7T0FFRztJQUNILElBQUksR0FBRztRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQWFELE9BQU87UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPO1FBQ04sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU07UUFDTCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxlQUFlO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUMxRixJQUFJLGFBQWEsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUMxRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7U0FDaEM7SUFDRixDQUFDOzsrR0F0Rlcsa0JBQWtCO21HQUFsQixrQkFBa0Isa2pCQXJDcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbUNUOzJGQUVXLGtCQUFrQjtrQkF2QzlCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLG9EQUFvRDtvQkFDOUQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1DVDtpQkFDRDtpR0FFeUQsV0FBVztzQkFBbkUsV0FBVzt1QkFBQywwQ0FBMEM7Z0JBQzdCLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVztnQkFHYixRQUFRO3NCQURsQixXQUFXO3VCQUFDLGtEQUFrRDtnQkFNcEQsVUFBVTtzQkFEcEIsV0FBVzt1QkFBQyxvREFBb0Q7Z0JBT04sT0FBTztzQkFBakUsV0FBVzt1QkFBQyxtQ0FBbUM7O3NCQUFHLEtBQUs7Z0JBSS9DLElBQUk7c0JBQVosS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQWFHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBWUksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEhvc3RCaW5kaW5nLFxuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRFbGVtZW50UmVmLFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0QWZ0ZXJWaWV3SW5pdFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG4vKipcbiAqIEF2YWlsYWJsZSBIVE1MIGFuY2hvciB0YXJnZXRzXG4gKi9cbmV4cG9ydCBlbnVtIFRhcmdldCB7XG5cdHNlbGYgPSBcIl9zZWxmXCIsXG5cdGJsYW5rID0gXCJfYmxhbmtcIixcblx0cGFyZW50ID0gXCJfcGFyZW50XCIsXG5cdHRvcCA9IFwiX3RvcFwiXG59XG5cbi8qKlxuICogU2VjdXJpdHkgSFRNTCBhbmNob3IgcmVsIHdoZW4gdGFyZ2V0IGlzIHNldFxuICovXG5jb25zdCBSRUwgPSBcIm5vcmVmZXJyZXIgbm9vcGVuZXJcIjtcblxuLyoqXG4gKiBgT3ZlcmZsb3dNZW51T3B0aW9uYCByZXByZXNlbnRzIGEgc2luZ2xlIG9wdGlvbiBpbiBhbiBvdmVyZmxvdyBtZW51XG4gKlxuICogUHJlc2VudGx5IGl0IGhhcyB0aHJlZSBwb3NzaWJsZSBzdGF0ZXMgLSBub3JtYWwsIGRpc2FibGVkLCBhbmQgZGFuZ2VyOlxuICogYGBgXG4gKiA8Y2RzLW92ZXJmbG93LW1lbnUtb3B0aW9uPlNpbXBsZSBvcHRpb248L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvbj5cbiAqIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24gZGlzYWJsZWQ9XCJ0cnVlXCI+RGlzYWJsZWQ8L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvbj5cbiAqIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24gdHlwZT1cImRhbmdlclwiPkRhbmdlciBvcHRpb248L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvbj5cbiAqIGBgYFxuICpcbiAqIEZvciBjb250ZW50IHRoYXQgZXhwYW5kcyBiZXlvbmQgdGhlIG92ZXJmbG93IG1lbnUgYE92ZXJmbG93TWVudU9wdGlvbmAgYXV0b21hdGljYWxseSBhZGRzIGEgdGl0bGUgYXR0cmlidXRlLlxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLW92ZXJmbG93LW1lbnUtb3B0aW9uLCBpYm0tb3ZlcmZsb3ctbWVudS1vcHRpb25cIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8YnV0dG9uXG5cdFx0XHQqbmdJZj1cIiFocmVmXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1vdmVyZmxvdy1tZW51LW9wdGlvbnNfX2J0biB7e2lubmVyQ2xhc3N9fVwiXG5cdFx0XHRyb2xlPVwibWVudWl0ZW1cIlxuXHRcdFx0W3RhYmluZGV4XT1cInRhYkluZGV4XCJcblx0XHRcdChmb2N1cyk9XCJvbkZvY3VzKClcIlxuXHRcdFx0KGJsdXIpPVwib25CbHVyKClcIlxuXHRcdFx0KGNsaWNrKT1cIm9uQ2xpY2soKVwiXG5cdFx0XHRbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuXHRcdFx0W2F0dHIudGl0bGVdPVwidGl0bGVcIj5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wT3V0bGV0XCI+PC9uZy1jb250YWluZXI+XG5cdFx0PC9idXR0b24+XG5cblx0XHQ8YVxuXHRcdFx0Km5nSWY9XCJocmVmXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1vdmVyZmxvdy1tZW51LW9wdGlvbnNfX2J0biB7e2lubmVyQ2xhc3N9fVwiXG5cdFx0XHRyb2xlPVwibWVudWl0ZW1cIlxuXHRcdFx0W3RhYmluZGV4XT1cInRhYkluZGV4XCJcblx0XHRcdChmb2N1cyk9XCJvbkZvY3VzKClcIlxuXHRcdFx0KGJsdXIpPVwib25CbHVyKClcIlxuXHRcdFx0KGNsaWNrKT1cIm9uQ2xpY2soKVwiXG5cdFx0XHRbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG5cdFx0XHRbaHJlZl09XCJocmVmXCJcblx0XHRcdFthdHRyLnRhcmdldF09XCJ0YXJnZXRcIlxuXHRcdFx0W2F0dHIucmVsXT1cInJlbFwiXG5cdFx0XHRbYXR0ci50aXRsZV09XCJ0aXRsZVwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBPdXRsZXRcIj48L25nLWNvbnRhaW5lcj5cblx0XHQ8L2E+XG5cblx0XHQ8bmctdGVtcGxhdGUgI3RlbXBPdXRsZXQ+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1vdmVyZmxvdy1tZW51LW9wdGlvbnNfX29wdGlvbi1jb250ZW50XCI+XG5cdFx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHRcdDwvZGl2PlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdGBcbn0pXG5leHBvcnQgY2xhc3MgT3ZlcmZsb3dNZW51T3B0aW9uIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tb3ZlcmZsb3ctbWVudS1vcHRpb25zX19vcHRpb25cIikgb3B0aW9uQ2xhc3MgPSB0cnVlO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLnJvbGVcIikgcm9sZSA9IFwicHJlc2VudGF0aW9uXCI7XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1vdmVyZmxvdy1tZW51LW9wdGlvbnNfX29wdGlvbi0tZGFuZ2VyXCIpXG5cdHB1YmxpYyBnZXQgaXNEYW5nZXIoKTogQm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZSA9PT0gXCJkYW5nZXJcIjtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tb3ZlcmZsb3ctbWVudS1vcHRpb25zX19vcHRpb24tLWRpc2FibGVkXCIpXG5cdHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBCb29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kaXNhYmxlZDtcblx0fVxuXHQvKipcblx0ICogU2V0IHRvIGB0cnVlYCB0byBkaXNwbGF5IGEgZGl2aWRpbmcgbGluZSBhYm92ZSB0aGlzIG9wdGlvblxuXHQgKi9cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1vdmVyZmxvdy1tZW51LS1kaXZpZGVyXCIpIEBJbnB1dCgpIGRpdmlkZXIgPSBmYWxzZTtcblx0LyoqXG5cdCAqIHRvZ2dsZXMgYmV0d2VlbiBgbm9ybWFsYCBhbmQgYGRhbmdlcmAgc3RhdGVzXG5cdCAqL1xuXHRASW5wdXQoKSB0eXBlOiBcIm5vcm1hbFwiIHwgXCJkYW5nZXJcIiA9IFwibm9ybWFsXCI7XG5cdC8qKlxuXHQgKiBkaXNhYmxlL2VuYWJsZSBpbnRlcmFjdGlvbnNcblx0ICovXG5cdEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBJZiBpdCdzIGFuIGFuY2hvciwgdGhpcyBpcyBpdHMgbG9jYXRpb25cblx0ICovXG5cdEBJbnB1dCgpIGhyZWY6IHN0cmluZztcblx0LyoqXG5cdCAqIEFsbG93cyB0byBhZGQgYSB0YXJnZXQgdG8gdGhlIGFuY2hvclxuXHQgKi9cblx0QElucHV0KCkgc2V0IHRhcmdldCh2YWx1ZTogVGFyZ2V0KSB7XG5cdFx0aWYgKCFPYmplY3QudmFsdWVzKFRhcmdldCkuaW5jbHVkZXModmFsdWUpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5gXFxgdGFyZ2V0XFxgIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICR7T2JqZWN0LnZhbHVlcyhUYXJnZXQpLmpvaW4oXCIsIFwiKX0uXG5QbGVhc2UgdXNlIHRoZSBcXGBUYXJnZXRcXGAgZW51bSBleHBvcnRlZCBieSBjYXJib24tY29tcG9uZW50cy1hbmd1bGFyYCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fdGFyZ2V0ID0gdmFsdWU7XG5cdH1cblx0LyoqXG5cdCAqIEFwcGx5IGEgY3VzdG9tIGNsYXNzIHRvIHRoZSBpbm5lciBidXR0b24vYW5jaG9yXG5cdCAqL1xuXHRASW5wdXQoKSBpbm5lckNsYXNzID0gXCJcIjtcblxuXHRnZXQgdGFyZ2V0KCkge1xuXHRcdHJldHVybiB0aGlzLl90YXJnZXQ7XG5cdH1cblx0LyoqXG5cdCAqIHJlbCBvbmx5IHJldHVybnMgaXRzIHZhbHVlIGlmIHRhcmdldCBpcyBkZWZpbmVkXG5cdCAqL1xuXHRnZXQgcmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl90YXJnZXQgPyBSRUwgOiBudWxsO1xuXHR9XG5cblx0QE91dHB1dCgpIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRwdWJsaWMgdGFiSW5kZXggPSAtMTtcblx0Ly8gbm90ZTogdGl0bGUgbXVzdCBiZSBhIHJlYWwgYXR0cmlidXRlIChpLmUuIG5vdCBhIGdldHRlcikgYXMgb2YgQW5ndWxhckA2IGR1ZSB0b1xuXHQvLyBjaGFuZ2UgYWZ0ZXIgY2hlY2tlZCBlcnJvcnNcblx0cHVibGljIHRpdGxlID0gbnVsbDtcblxuXHRwcm90ZWN0ZWQgX3RhcmdldDogVGFyZ2V0O1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG5cdG9uQ2xpY2soKSB7XG5cdFx0dGhpcy5zZWxlY3RlZC5lbWl0KCk7XG5cdH1cblxuXHRvbkZvY3VzKCkge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YWJJbmRleCA9IDApO1xuXHR9XG5cblx0b25CbHVyKCkge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YWJJbmRleCA9IC0xKTtcblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRjb25zdCBidXR0b24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiYnV0dG9uLCBhXCIpO1xuXHRcdGNvbnN0IHRleHRDb250YWluZXIgPSBidXR0b24ucXVlcnlTZWxlY3RvcihcIi5jZHMtLW92ZXJmbG93LW1lbnUtb3B0aW9uc19fb3B0aW9uLWNvbnRlbnRcIik7XG5cdFx0aWYgKHRleHRDb250YWluZXIuc2Nyb2xsV2lkdGggPiB0ZXh0Q29udGFpbmVyLm9mZnNldFdpZHRoKSB7XG5cdFx0XHR0aGlzLnRpdGxlID0gYnV0dG9uLnRleHRDb250ZW50O1xuXHRcdH1cblx0fVxufVxuIl19