carbon-components-angular
Version:
Next generation components
247 lines • 25.2 kB
JavaScript
import { Component, HostBinding, Input, Output, EventEmitter, HostListener, ContentChild, Optional } from "@angular/core";
import { Subscription } from "rxjs";
import { ContextMenuComponent } from "./context-menu.component";
import * as i0 from "@angular/core";
import * as i1 from "./context-menu-selection.service";
import * as i2 from "@angular/common";
import * as i3 from "carbon-components-angular/icon";
export class ContextMenuItemComponent {
constructor(elementRef, contextMenuSelectionService) {
this.elementRef = elementRef;
this.contextMenuSelectionService = contextMenuSelectionService;
this.optionClass = true;
this.role = "menuitem";
this.tabindex = -1;
this.ariaHasPopup = null;
this.ariaExpanded = null;
this.disabled = false;
this.danger = false;
this.label = "";
this.info = "";
this.type = null;
this.checked = false;
this.icon = "";
this.value = "";
this.checkedChange = new EventEmitter();
this.itemClick = new EventEmitter();
this.hasChildren = false;
this.selectable = false;
this.subscriptions = new Subscription();
}
get ariaChecked() {
return this.type === "checkbox" ?
(this.checked ? true : false) : null;
}
get ariaDisabled() {
return this.disabled;
}
ngOnInit() {
switch (this.type) {
case "checkbox": {
this.role = "menuitemcheckbox";
this.selectable = true;
break;
}
case "radio": {
this.role = "menuitemradio";
this.selectable = true;
break;
}
default: {
this.role = "menuitem";
}
}
if (this.type && this.contextMenuSelectionService && this.value) {
const { selectionObservable } = this.contextMenuSelectionService;
const subscription = selectionObservable.subscribe((value) => {
if (this.type === "radio") {
this.handleSelection(value === this.value);
}
if (this.type === "checkbox") {
this.handleSelection(value.includes(this.value));
}
});
this.subscriptions.add(subscription);
}
}
ngAfterContentInit() {
if (this.childContextMenu) {
this.hasChildren = true;
this.ariaHasPopup = true;
this.ariaExpanded = false;
}
}
handleClick(event) {
event.stopPropagation();
if (this.disabled) {
return;
}
if (this.hasChildren) {
this.openSubMenu();
this.childContextMenu.focusMenu();
}
if (this.type) {
this.handleSelection(!this.checked);
}
if (this.contextMenuSelectionService) {
if (this.type === "radio") {
this.contextMenuSelectionService.selectRadio(this.value);
}
if (this.type === "checkbox") {
this.contextMenuSelectionService.selectCheckbox(this.value);
}
}
if (!this.disabled) {
this.itemClick.emit({
event,
label: this.label,
info: this.info,
value: this.value,
type: this.type
});
}
}
handleSelection(selected) {
this.checked = selected;
this.checkedChange.emit(this.checked);
}
openSubMenu() {
if (this.childContextMenu) {
this.childContextMenu.open = true;
this.ariaExpanded = true;
const dimensions = this.elementRef.nativeElement.getBoundingClientRect();
this.childContextMenu.position.left = dimensions.left + dimensions.width;
// subtract 4px to account for margins
this.childContextMenu.position.top = dimensions.top - 4;
}
}
closeSubMenu() {
if (this.childContextMenu) {
this.childContextMenu.open = false;
this.ariaExpanded = false;
}
}
handleMouseOver() {
this.openSubMenu();
}
handleMouseOut() {
this.closeSubMenu();
}
handleFocus() {
this.tabindex = 0;
if (this.hasChildren && this.ariaExpanded) {
this.closeSubMenu();
}
}
handleBlur() {
this.tabindex = -1;
}
focusItem() {
this.elementRef.nativeElement.focus();
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
ContextMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.ContextMenuSelectionService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
ContextMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ContextMenuItemComponent, selector: "cds-menu-item, cds-context-menu-item, ibm-context-menu-item", inputs: { disabled: "disabled", danger: "danger", label: "label", info: "info", type: "type", checked: "checked", icon: "icon", value: "value" }, outputs: { checkedChange: "checkedChange", itemClick: "itemClick" }, host: { listeners: { "keydown.enter": "handleClick($event)", "keydown.space": "handleClick($event)", "click": "handleClick($event)", "mouseover": "handleMouseOver()", "mouseout": "handleMouseOut()", "focus": "handleFocus()", "blur": "handleBlur()" }, properties: { "class.cds--menu-item": "this.optionClass", "attr.role": "this.role", "attr.tabindex": "this.tabindex", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-checked": "this.ariaChecked", "attr.aria-disabled": "this.ariaDisabled", "class.cds--menu-item--disabled": "this.disabled", "class.cds--menu-item--danger": "this.danger" } }, queries: [{ propertyName: "childContextMenu", first: true, predicate: ContextMenuComponent, descendants: true, static: true }], ngImport: i0, template: `
<div class="cds--menu-item__icon">
<svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg>
<svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg>
</div>
<div class="cds--menu-item__label" [title]="label">{{label}}</div>
<div class="cds--menu-item__shortcut">
<ng-container *ngIf="info">{{info}}</ng-container>
<svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg>
</div>
<ng-content></ng-content>
`, isInline: true, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, decorators: [{
type: Component,
args: [{ selector: "cds-menu-item, cds-context-menu-item, ibm-context-menu-item", template: `
<div class="cds--menu-item__icon">
<svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg>
<svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg>
</div>
<div class="cds--menu-item__label" [title]="label">{{label}}</div>
<div class="cds--menu-item__shortcut">
<ng-container *ngIf="info">{{info}}</ng-container>
<svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg>
</div>
<ng-content></ng-content>
`, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ContextMenuSelectionService, decorators: [{
type: Optional
}] }]; }, propDecorators: { optionClass: [{
type: HostBinding,
args: ["class.cds--menu-item"]
}], role: [{
type: HostBinding,
args: ["attr.role"]
}], tabindex: [{
type: HostBinding,
args: ["attr.tabindex"]
}], ariaHasPopup: [{
type: HostBinding,
args: ["attr.aria-haspopup"]
}], ariaExpanded: [{
type: HostBinding,
args: ["attr.aria-expanded"]
}], ariaChecked: [{
type: HostBinding,
args: ["attr.aria-checked"]
}], ariaDisabled: [{
type: HostBinding,
args: ["attr.aria-disabled"]
}], disabled: [{
type: Input
}, {
type: HostBinding,
args: ["class.cds--menu-item--disabled"]
}], danger: [{
type: Input
}, {
type: HostBinding,
args: ["class.cds--menu-item--danger"]
}], label: [{
type: Input
}], info: [{
type: Input
}], type: [{
type: Input
}], checked: [{
type: Input
}], icon: [{
type: Input
}], value: [{
type: Input
}], checkedChange: [{
type: Output
}], itemClick: [{
type: Output
}], childContextMenu: [{
type: ContentChild,
args: [ContextMenuComponent, { static: true }]
}], handleClick: [{
type: HostListener,
args: ["keydown.enter", ["$event"]]
}, {
type: HostListener,
args: ["keydown.space", ["$event"]]
}, {
type: HostListener,
args: ["click", ["$event"]]
}], handleMouseOver: [{
type: HostListener,
args: ["mouseover"]
}], handleMouseOut: [{
type: HostListener,
args: ["mouseout"]
}], handleFocus: [{
type: HostListener,
args: ["focus"]
}], handleBlur: [{
type: HostListener,
args: ["blur"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBSVIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUF1QmhFLE1BQU0sT0FBTyx3QkFBd0I7SUE4QnBDLFlBQ1csVUFBc0IsRUFDViwyQkFBd0Q7UUFEcEUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUEvQjFDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFNBQUksR0FBRyxVQUFVLENBQUM7UUFDZCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQVFDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUM1RCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFNBQUksR0FBZ0MsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDVixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDNUMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRXpELGdCQUFX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O3NCQUFsRCxXQUFXO3VCQUFDLG9CQUFvQjtnQkFHdUIsUUFBUTtzQkFBL0QsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxnQ0FBZ0M7Z0JBQ0EsTUFBTTtzQkFBM0QsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyw4QkFBOEI7Z0JBQzNDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFLK0MsZ0JBQWdCO3NCQUFyRSxZQUFZO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFtRHBELFdBQVc7c0JBSFYsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUN4QyxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3hDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTREakMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVc7Z0JBTXpCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxVQUFVO2dCQU14QixXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTztnQkFTckIsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEhvc3RCaW5kaW5nLFxuXHRJbnB1dCxcblx0T3V0cHV0LFxuXHRFdmVudEVtaXR0ZXIsXG5cdEVsZW1lbnRSZWYsXG5cdEhvc3RMaXN0ZW5lcixcblx0Q29udGVudENoaWxkLFxuXHRPcHRpb25hbCxcblx0T25Jbml0LFxuXHRBZnRlckNvbnRlbnRJbml0LFxuXHRPbkRlc3Ryb3lcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9jb250ZXh0LW1lbnUtc2VsZWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSBcIi4vY29udGV4dC1tZW51LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSXRlbUNsaWNrRXZlbnQgfSBmcm9tIFwiLi9jb250ZXh0LW1lbnUudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1tZW51LWl0ZW0sIGNkcy1jb250ZXh0LW1lbnUtaXRlbSwgaWJtLWNvbnRleHQtbWVudS1pdGVtXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdiBjbGFzcz1cImNkcy0tbWVudS1pdGVtX19pY29uXCI+XG5cdFx0XHQ8c3ZnICpuZ0lmPVwic2VsZWN0YWJsZSAmJiBjaGVja2VkXCIgY2RzSWNvbj1cImNoZWNrbWFya1wiIHNpemU9XCIxNlwiPjwvc3ZnPlxuXHRcdFx0PHN2ZyAqbmdJZj1cIiFzZWxlY3RhYmxlICYmIGljb25cIiBbY2RzSWNvbl09XCJpY29uXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImNkcy0tbWVudS1pdGVtX19sYWJlbFwiIFt0aXRsZV09XCJsYWJlbFwiPnt7bGFiZWx9fTwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLW1lbnUtaXRlbV9fc2hvcnRjdXRcIj5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJpbmZvXCI+e3tpbmZvfX08L25nLWNvbnRhaW5lcj5cblx0XHRcdDxzdmcgKm5nSWY9XCJoYXNDaGlsZHJlblwiIGNkc0ljb249XCJjYXJldC0tcmlnaHRcIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHQ8L2Rpdj5cblx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cdGAsXG5cdHN0eWxlczogW2Bcblx0XHQ6aG9zdCB7XG5cdFx0XHRncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFyZW0gMWZyIG1heC1jb250ZW50O1xuXHRcdH1cblx0YF1cbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLW1lbnUtaXRlbVwiKSBvcHRpb25DbGFzcyA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImF0dHIucm9sZVwiKSByb2xlID0gXCJtZW51aXRlbVwiO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIHRhYmluZGV4ID0gLTE7XG5cdEBIb3N0QmluZGluZyhcImF0dHIuYXJpYS1oYXNwb3B1cFwiKSBhcmlhSGFzUG9wdXAgPSBudWxsO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtZXhwYW5kZWRcIikgYXJpYUV4cGFuZGVkID0gbnVsbDtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWNoZWNrZWRcIikgZ2V0IGFyaWFDaGVja2VkKCkge1xuXHRcdHJldHVybiB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiA/XG5cdFx0XHQodGhpcy5jaGVja2VkID8gdHJ1ZSA6IGZhbHNlKSA6IG51bGw7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWRpc2FibGVkXCIpIGdldCBhcmlhRGlzYWJsZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG5cdH1cblx0QElucHV0KCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1tZW51LWl0ZW0tLWRpc2FibGVkXCIpIGRpc2FibGVkID0gZmFsc2U7XG5cdEBJbnB1dCgpIEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tbWVudS1pdGVtLS1kYW5nZXJcIikgZGFuZ2VyID0gZmFsc2U7XG5cdEBJbnB1dCgpIGxhYmVsID0gXCJcIjtcblx0QElucHV0KCkgaW5mbyA9IFwiXCI7XG5cdEBJbnB1dCgpIHR5cGU6IG51bGwgfCBcImNoZWNrYm94XCIgfCBcInJhZGlvXCIgPSBudWxsO1xuXHRASW5wdXQoKSBjaGVja2VkID0gZmFsc2U7XG5cdEBJbnB1dCgpIGljb24gPSBcIlwiO1xuXHRASW5wdXQoKSB2YWx1ZSA9IFwiXCI7XG5cdEBPdXRwdXQoKSBjaGVja2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXHRAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJdGVtQ2xpY2tFdmVudD4oKTtcblxuXHRoYXNDaGlsZHJlbiA9IGZhbHNlO1xuXHRzZWxlY3RhYmxlID0gZmFsc2U7XG5cblx0QENvbnRlbnRDaGlsZChDb250ZXh0TWVudUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgY2hpbGRDb250ZXh0TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQ7XG5cdHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcblx0XHRAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgY29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlOiBDb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2Vcblx0KSB7fVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHN3aXRjaCAodGhpcy50eXBlKSB7XG5cdFx0XHRjYXNlIFwiY2hlY2tib3hcIjoge1xuXHRcdFx0XHR0aGlzLnJvbGUgPSBcIm1lbnVpdGVtY2hlY2tib3hcIjtcblx0XHRcdFx0dGhpcy5zZWxlY3RhYmxlID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwicmFkaW9cIjoge1xuXHRcdFx0XHR0aGlzLnJvbGUgPSBcIm1lbnVpdGVtcmFkaW9cIjtcblx0XHRcdFx0dGhpcy5zZWxlY3RhYmxlID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdHRoaXMucm9sZSA9IFwibWVudWl0ZW1cIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy50eXBlICYmIHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlICYmIHRoaXMudmFsdWUpIHtcblx0XHRcdGNvbnN0IHsgc2VsZWN0aW9uT2JzZXJ2YWJsZSB9ID0gdGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2U7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSBzZWxlY3Rpb25PYnNlcnZhYmxlLnN1YnNjcmliZSgodmFsdWUpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJyYWRpb1wiKSB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb24odmFsdWUgPT09IHRoaXMudmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb24odmFsdWUuaW5jbHVkZXModGhpcy52YWx1ZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3Vic2NyaXB0aW9uKTtcblx0XHR9XG5cdH1cblxuXHRuZ0FmdGVyQ29udGVudEluaXQoKSB7XG5cdFx0aWYgKHRoaXMuY2hpbGRDb250ZXh0TWVudSkge1xuXHRcdFx0dGhpcy5oYXNDaGlsZHJlbiA9IHRydWU7XG5cdFx0XHR0aGlzLmFyaWFIYXNQb3B1cCA9IHRydWU7XG5cdFx0XHR0aGlzLmFyaWFFeHBhbmRlZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJrZXlkb3duLmVudGVyXCIsIFtcIiRldmVudFwiXSlcblx0QEhvc3RMaXN0ZW5lcihcImtleWRvd24uc3BhY2VcIiwgW1wiJGV2ZW50XCJdKVxuXHRASG9zdExpc3RlbmVyKFwiY2xpY2tcIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCAmIEtleWJvYXJkRXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRpZiAodGhpcy5kaXNhYmxlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5oYXNDaGlsZHJlbikge1xuXHRcdFx0dGhpcy5vcGVuU3ViTWVudSgpO1xuXHRcdFx0dGhpcy5jaGlsZENvbnRleHRNZW51LmZvY3VzTWVudSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnR5cGUpIHtcblx0XHRcdHRoaXMuaGFuZGxlU2VsZWN0aW9uKCF0aGlzLmNoZWNrZWQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZSkge1xuXHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gXCJyYWRpb1wiKSB7XG5cdFx0XHRcdHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJhZGlvKHRoaXMudmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcblx0XHRcdFx0dGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Q2hlY2tib3godGhpcy52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmRpc2FibGVkKSB7XG5cdFx0XHR0aGlzLml0ZW1DbGljay5lbWl0KHtcblx0XHRcdFx0ZXZlbnQsXG5cdFx0XHRcdGxhYmVsOiB0aGlzLmxhYmVsLFxuXHRcdFx0XHRpbmZvOiB0aGlzLmluZm8sXG5cdFx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0XHR0eXBlOiB0aGlzLnR5cGVcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZVNlbGVjdGlvbihzZWxlY3RlZDogYm9vbGVhbikge1xuXHRcdHRoaXMuY2hlY2tlZCA9IHNlbGVjdGVkO1xuXHRcdHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KHRoaXMuY2hlY2tlZCk7XG5cdH1cblxuXHRvcGVuU3ViTWVudSgpIHtcblx0XHRpZiAodGhpcy5jaGlsZENvbnRleHRNZW51KSB7XG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUub3BlbiA9IHRydWU7XG5cdFx0XHR0aGlzLmFyaWFFeHBhbmRlZCA9IHRydWU7XG5cdFx0XHRjb25zdCBkaW1lbnNpb25zID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUucG9zaXRpb24ubGVmdCA9IGRpbWVuc2lvbnMubGVmdCArIGRpbWVuc2lvbnMud2lkdGg7XG5cdFx0XHQvLyBzdWJ0cmFjdCA0cHggdG8gYWNjb3VudCBmb3IgbWFyZ2luc1xuXHRcdFx0dGhpcy5jaGlsZENvbnRleHRNZW51LnBvc2l0aW9uLnRvcCA9IGRpbWVuc2lvbnMudG9wIC0gNDtcblx0XHR9XG5cdH1cblxuXHRjbG9zZVN1Yk1lbnUoKSB7XG5cdFx0aWYgKHRoaXMuY2hpbGRDb250ZXh0TWVudSkge1xuXHRcdFx0dGhpcy5jaGlsZENvbnRleHRNZW51Lm9wZW4gPSBmYWxzZTtcblx0XHRcdHRoaXMuYXJpYUV4cGFuZGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcIm1vdXNlb3ZlclwiKVxuXHRoYW5kbGVNb3VzZU92ZXIoKSB7XG5cdFx0dGhpcy5vcGVuU3ViTWVudSgpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcIm1vdXNlb3V0XCIpXG5cdGhhbmRsZU1vdXNlT3V0KCkge1xuXHRcdHRoaXMuY2xvc2VTdWJNZW51KCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwiZm9jdXNcIilcblx0aGFuZGxlRm9jdXMoKSB7XG5cdFx0dGhpcy50YWJpbmRleCA9IDA7XG5cdFx0aWYgKHRoaXMuaGFzQ2hpbGRyZW4gJiYgdGhpcy5hcmlhRXhwYW5kZWQpIHtcblx0XHRcdHRoaXMuY2xvc2VTdWJNZW51KCk7XG5cdFx0fVxuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImJsdXJcIilcblx0aGFuZGxlQmx1cigpIHtcblx0XHR0aGlzLnRhYmluZGV4ID0gLTE7XG5cdH1cblxuXHRmb2N1c0l0ZW0oKSB7XG5cdFx0dGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXHR9XG59XG4iXX0=