systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
81 lines • 22.6 kB
JavaScript
import { Component } from '@angular/core';
import { ContextMenuActionData } from './context-menu-action-data';
import { AbstractContextMenuComponent } from './abstract-context-menu.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "./context-menu-submenu-item.component";
import * as i3 from "./context-menu-item.component";
export class ContextMenuComponent extends AbstractContextMenuComponent {
constructor(el, myRenderer, cdr) {
super(el, myRenderer, cdr);
this.el = el;
this.myRenderer = myRenderer;
this.cdr = cdr;
}
openWithOptions(event, newContextMenuOptions) {
this.contextMenuOptions = newContextMenuOptions;
this.open(event);
}
getSelfReference() {
return this;
}
existsAtLeastOneActionEnabled() {
if (this.contextMenuOptions) {
return this.contextMenuOptions.some(opt => this.isEnabled(this.elementID, opt.actionId));
}
else {
return false;
}
}
isEnabled(elementId, actionId) {
const option = this.getOption(actionId);
return (option && option.isActionEnabled) ? option.isActionEnabled(elementId, actionId) : true;
}
isIconEnabled(elementId, actionId) {
const option = this.getOption(actionId);
return (option && option.isIconEnabled) ? option.isIconEnabled(elementId, actionId) : true;
}
executeAction(event, elementId, actionId) {
const option = this.getOption(actionId);
if (option && option.hasChildren()) {
this.doMouseOver(event, elementId, actionId);
}
else {
this.closeDropDown();
event.stopPropagation();
event.preventDefault();
if (option && option.action) {
option.action(new ContextMenuActionData(elementId, actionId));
}
else {
this.action.emit(new ContextMenuActionData(elementId, actionId));
}
}
}
checkIfHasIcons() {
this.hasIcons = this.contextMenuOptions.some(opt => opt.iconClass !== undefined && opt.iconClass !== null);
}
getOption(actionId, parentAction) {
if (actionId) {
const actions = actionId.split(this.levelSeparator);
let level = 1;
let menuLevel = this.contextMenuOptions.find(opt => opt.actionId === actions[level - 1]);
level++;
while (level <= actions.length) {
menuLevel = menuLevel.childrenContextMenuOptions.find(opt => opt.actionId === actions[level - 1]);
level++;
}
return menuLevel;
}
else {
return undefined;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: ContextMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.9", type: ContextMenuComponent, selector: "systelab-context-menu", usesInheritance: true, ngImport: i0, template: "<div #dropdownparent id=\"{{elementID}}\" class=\"dropdown\">\n <div class=\"dropdown-toggle slab-context-menu\" data-toggle=\"dropdown\" (click)=\"dotsClicked($event)\">\n <i class=\"icon-context-menu\" [ngClass]=\"{'d-none': isEmbedded}\" [style.font-size]=\"fontSize\"\n [style.color]=\"fontColor\"></i>\n </div>\n <div #dropdownmenu class=\"dropdown-menu slab-dropdown-menu\">\n <div #dropdown class=\"slab-dropdown slab-dropdown-fixed\">\n <div *ngIf=\"isOpened\">\n <div #ngcontent (click)=\"ngContentStopPropagation($event)\">\n <ng-content></ng-content>\n </div>\n <ul #scrollableList class=\"slab-dropdown-scroll\" [ngClass]=\"{'slab-dropdown-overflow': overflow}\">\n @for (action of contextMenuOptions; track action.actionId) {\n <li class=\"d-flex align-items-center m-0\"\n [class.disabled]=\"!isEnabled(elementID, action.actionId) || action.isDivider\"\n (click)=\"doClickWithAction($event, elementID, action.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, action.actionId)\">\n <div *ngIf=\"isEnabled(elementID, action.actionId)\" class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"action\"\n [isEnabled]=\"isEnabled(elementID, action.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, action.actionId)\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n <ul *ngIf=\"action.hasChildren()\" #childdropdownmenu id=\"{{action.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"action\"\n [actionName]=\"action.actionId\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"getSelfReference()\"\n [parentId]=\"elementID\"\n ></systelab-context-menu-submenu-item>\n </ul>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ContextMenuSubmenuItemComponent, selector: "systelab-context-menu-submenu-item", inputs: ["action", "actionName", "hasIcons", "hasChildren", "contextMenuOriginal", "parentId", "elementID"] }, { kind: "component", type: i3.ContextMenuItemComponent, selector: "systelab-context-menu-item", inputs: ["action", "hasIcons", "isEnabled", "isIconEnabled", "hasChildren"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: ContextMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-context-menu', template: "<div #dropdownparent id=\"{{elementID}}\" class=\"dropdown\">\n <div class=\"dropdown-toggle slab-context-menu\" data-toggle=\"dropdown\" (click)=\"dotsClicked($event)\">\n <i class=\"icon-context-menu\" [ngClass]=\"{'d-none': isEmbedded}\" [style.font-size]=\"fontSize\"\n [style.color]=\"fontColor\"></i>\n </div>\n <div #dropdownmenu class=\"dropdown-menu slab-dropdown-menu\">\n <div #dropdown class=\"slab-dropdown slab-dropdown-fixed\">\n <div *ngIf=\"isOpened\">\n <div #ngcontent (click)=\"ngContentStopPropagation($event)\">\n <ng-content></ng-content>\n </div>\n <ul #scrollableList class=\"slab-dropdown-scroll\" [ngClass]=\"{'slab-dropdown-overflow': overflow}\">\n @for (action of contextMenuOptions; track action.actionId) {\n <li class=\"d-flex align-items-center m-0\"\n [class.disabled]=\"!isEnabled(elementID, action.actionId) || action.isDivider\"\n (click)=\"doClickWithAction($event, elementID, action.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, action.actionId)\">\n <div *ngIf=\"isEnabled(elementID, action.actionId)\" class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"action\"\n [isEnabled]=\"isEnabled(elementID, action.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, action.actionId)\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n <ul *ngIf=\"action.hasChildren()\" #childdropdownmenu id=\"{{action.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"action\"\n [actionName]=\"action.actionId\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"getSelfReference()\"\n [parentId]=\"elementID\"\n ></systelab-context-menu-submenu-item>\n </ul>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5c3RlbGFiLWNvbXBvbmVudHMvc3JjL2xpYi9jb250ZXh0bWVudS9jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2NvbnRleHRtZW51L2NvbnRleHQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBNEMsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7O0FBTWpGLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSw0QkFBK0M7SUFFeEYsWUFBK0IsRUFBYyxFQUFxQixVQUFxQixFQUFxQixHQUFzQjtRQUNqSSxLQUFLLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQURHLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBcUIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUFxQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUVsSSxDQUFDO0lBRU0sZUFBZSxDQUFDLEtBQWlCLEVBQUUscUJBQStDO1FBQ3hGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFZSxnQkFBZ0I7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRVMsNkJBQTZCO1FBQ3RDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUN6RjthQUFNO1lBQ04sT0FBTyxLQUFLLENBQUM7U0FDYjtJQUNGLENBQUM7SUFFTSxTQUFTLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUNuRCxNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoRyxDQUFDO0lBRU0sYUFBYSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDdkQsTUFBTSxNQUFNLEdBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUYsQ0FBQztJQUVNLGFBQWEsQ0FBQyxLQUFVLEVBQUUsU0FBaUIsRUFBRSxRQUFnQjtRQUVuRSxNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQXFCLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDOUQ7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUNqRTtTQUNEO0lBQ0YsQ0FBQztJQUVrQixlQUFlO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVTLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFlBQXFCO1FBQzFELElBQUksUUFBUSxFQUFFO1lBQ2IsTUFBTSxPQUFPLEdBQWEsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRWQsSUFBSSxTQUFTLEdBQXNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RyxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQy9CLFNBQVMsR0FBRyxTQUFTLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xHLEtBQUssRUFBRSxDQUFDO2FBQ1I7WUFDRCxPQUFPLFNBQVMsQ0FBQztTQUNqQjthQUFNO1lBQ04sT0FBTyxTQUFTLENBQUM7U0FDakI7SUFDRixDQUFDOzhHQXRFVyxvQkFBb0I7a0dBQXBCLG9CQUFvQixvRkNUakMsa2lHQXlDQTs7MkZEaENhLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDSSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudUFjdGlvbkRhdGEgfSBmcm9tICcuL2NvbnRleHQtbWVudS1hY3Rpb24tZGF0YSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudU9wdGlvbiB9IGZyb20gJy4vY29udGV4dC1tZW51LW9wdGlvbic7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9hYnN0cmFjdC1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAgICAnc3lzdGVsYWItY29udGV4dC1tZW51Jyxcblx0dGVtcGxhdGVVcmw6ICdjb250ZXh0LW1lbnUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q29udGV4dE1lbnVDb21wb25lbnQ8Q29udGV4dE1lbnVPcHRpb24+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBvdmVycmlkZSBlbDogRWxlbWVudFJlZiwgcHJvdGVjdGVkIG92ZXJyaWRlIG15UmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJvdGVjdGVkIG92ZXJyaWRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRzdXBlcihlbCwgbXlSZW5kZXJlciwgY2RyKTtcblx0fVxuXG5cdHB1YmxpYyBvcGVuV2l0aE9wdGlvbnMoZXZlbnQ6IE1vdXNlRXZlbnQsIG5ld0NvbnRleHRNZW51T3B0aW9uczogQXJyYXk8Q29udGV4dE1lbnVPcHRpb24+KTogdm9pZCB7XG5cdFx0dGhpcy5jb250ZXh0TWVudU9wdGlvbnMgPSBuZXdDb250ZXh0TWVudU9wdGlvbnM7XG5cdFx0dGhpcy5vcGVuKGV2ZW50KTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBnZXRTZWxmUmVmZXJlbmNlKCk6IEFic3RyYWN0Q29udGV4dE1lbnVDb21wb25lbnQ8Q29udGV4dE1lbnVPcHRpb24+IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByb3RlY3RlZCBleGlzdHNBdExlYXN0T25lQWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5jb250ZXh0TWVudU9wdGlvbnMpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRleHRNZW51T3B0aW9ucy5zb21lKG9wdCA9PiB0aGlzLmlzRW5hYmxlZCh0aGlzLmVsZW1lbnRJRCwgb3B0LmFjdGlvbklkKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNFbmFibGVkKGVsZW1lbnRJZDogc3RyaW5nLCBhY3Rpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgb3B0aW9uOiBDb250ZXh0TWVudU9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uKGFjdGlvbklkKTtcblx0XHRyZXR1cm4gKG9wdGlvbiAmJiBvcHRpb24uaXNBY3Rpb25FbmFibGVkKSA/IG9wdGlvbi5pc0FjdGlvbkVuYWJsZWQoZWxlbWVudElkLCBhY3Rpb25JZCkgOiB0cnVlO1xuXHR9XG5cblx0cHVibGljIGlzSWNvbkVuYWJsZWQoZWxlbWVudElkOiBzdHJpbmcsIGFjdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBvcHRpb246IENvbnRleHRNZW51T3B0aW9uID0gdGhpcy5nZXRPcHRpb24oYWN0aW9uSWQpO1xuXHRcdHJldHVybiAob3B0aW9uICYmIG9wdGlvbi5pc0ljb25FbmFibGVkKSA/IG9wdGlvbi5pc0ljb25FbmFibGVkKGVsZW1lbnRJZCwgYWN0aW9uSWQpIDogdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlQWN0aW9uKGV2ZW50OiBhbnksIGVsZW1lbnRJZDogc3RyaW5nLCBhY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG5cblx0XHRjb25zdCBvcHRpb246IENvbnRleHRNZW51T3B0aW9uID0gdGhpcy5nZXRPcHRpb24oYWN0aW9uSWQpO1xuXG5cdFx0aWYgKG9wdGlvbiAmJiBvcHRpb24uaGFzQ2hpbGRyZW4oKSkge1xuXHRcdFx0dGhpcy5kb01vdXNlT3ZlcihldmVudCwgZWxlbWVudElkLCBhY3Rpb25JZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5jbG9zZURyb3BEb3duKCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKG9wdGlvbiAmJiBvcHRpb24uYWN0aW9uKSB7XG5cdFx0XHRcdG9wdGlvbi5hY3Rpb24obmV3IENvbnRleHRNZW51QWN0aW9uRGF0YShlbGVtZW50SWQsIGFjdGlvbklkKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmFjdGlvbi5lbWl0KG5ldyBDb250ZXh0TWVudUFjdGlvbkRhdGEoZWxlbWVudElkLCBhY3Rpb25JZCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBvdmVycmlkZSBjaGVja0lmSGFzSWNvbnMoKTogdm9pZCB7XG5cdFx0dGhpcy5oYXNJY29ucyA9IHRoaXMuY29udGV4dE1lbnVPcHRpb25zLnNvbWUob3B0ID0+IG9wdC5pY29uQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBvcHQuaWNvbkNsYXNzICE9PSBudWxsKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRPcHRpb24oYWN0aW9uSWQ6IHN0cmluZywgcGFyZW50QWN0aW9uPzogc3RyaW5nKTogQ29udGV4dE1lbnVPcHRpb24ge1xuXHRcdGlmIChhY3Rpb25JZCkge1xuXHRcdFx0Y29uc3QgYWN0aW9uczogc3RyaW5nW10gPSBhY3Rpb25JZC5zcGxpdCh0aGlzLmxldmVsU2VwYXJhdG9yKTtcblx0XHRcdGxldCBsZXZlbCA9IDE7XG5cblx0XHRcdGxldCBtZW51TGV2ZWw6IENvbnRleHRNZW51T3B0aW9uID0gdGhpcy5jb250ZXh0TWVudU9wdGlvbnMuZmluZChvcHQgPT4gb3B0LmFjdGlvbklkID09PSBhY3Rpb25zW2xldmVsIC0gMV0pO1xuXHRcdFx0bGV2ZWwrKztcblx0XHRcdHdoaWxlIChsZXZlbCA8PSBhY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRtZW51TGV2ZWwgPSBtZW51TGV2ZWwuY2hpbGRyZW5Db250ZXh0TWVudU9wdGlvbnMuZmluZChvcHQgPT4gb3B0LmFjdGlvbklkID09PSBhY3Rpb25zW2xldmVsIC0gMV0pO1xuXHRcdFx0XHRsZXZlbCsrO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1lbnVMZXZlbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxufVxuIiwiPGRpdiAjZHJvcGRvd25wYXJlbnQgaWQ9XCJ7e2VsZW1lbnRJRH19XCIgY2xhc3M9XCJkcm9wZG93blwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10b2dnbGUgc2xhYi1jb250ZXh0LW1lbnVcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgKGNsaWNrKT1cImRvdHNDbGlja2VkKCRldmVudClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJpY29uLWNvbnRleHQtbWVudVwiIFtuZ0NsYXNzXT1cInsnZC1ub25lJzogaXNFbWJlZGRlZH1cIiBbc3R5bGUuZm9udC1zaXplXT1cImZvbnRTaXplXCJcbiAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImZvbnRDb2xvclwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNkcm9wZG93bm1lbnUgY2xhc3M9XCJkcm9wZG93bi1tZW51IHNsYWItZHJvcGRvd24tbWVudVwiPlxuICAgICAgICA8ZGl2ICNkcm9wZG93biBjbGFzcz1cInNsYWItZHJvcGRvd24gc2xhYi1kcm9wZG93bi1maXhlZFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzT3BlbmVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAjbmdjb250ZW50IChjbGljayk9XCJuZ0NvbnRlbnRTdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHVsICNzY3JvbGxhYmxlTGlzdCBjbGFzcz1cInNsYWItZHJvcGRvd24tc2Nyb2xsXCIgW25nQ2xhc3NdPVwieydzbGFiLWRyb3Bkb3duLW92ZXJmbG93Jzogb3ZlcmZsb3d9XCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGFjdGlvbiBvZiBjb250ZXh0TWVudU9wdGlvbnM7IHRyYWNrIGFjdGlvbi5hY3Rpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNFbmFibGVkKGVsZW1lbnRJRCwgYWN0aW9uLmFjdGlvbklkKSB8fCBhY3Rpb24uaXNEaXZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9DbGlja1dpdGhBY3Rpb24oJGV2ZW50LCBlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiZG9Nb3VzZU92ZXIoJGV2ZW50LCBlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFbmFibGVkKGVsZW1lbnRJRCwgYWN0aW9uLmFjdGlvbklkKVwiIGNsYXNzPVwic2xhYi1mbGV4LTFcIiBzdHlsZT1cImZsZXg6MSAxIGF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbGFiLWNvbnRleHQtbWVudS1pdGVtIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0VuYWJsZWRdPVwiaXNFbmFibGVkKGVsZW1lbnRJRCwgYWN0aW9uLmFjdGlvbklkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNJY29uRW5hYmxlZF09XCJpc0ljb25FbmFibGVkKGVsZW1lbnRJRCwgYWN0aW9uLmFjdGlvbklkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiYWN0aW9uLmhhc0NoaWxkcmVuKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc0ljb25zXT1cImhhc0ljb25zXCI+PC9zeXN0ZWxhYi1jb250ZXh0LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsICpuZ0lmPVwiYWN0aW9uLmhhc0NoaWxkcmVuKClcIiAjY2hpbGRkcm9wZG93bm1lbnUgaWQ9XCJ7e2FjdGlvbi5hY3Rpb25JZCtlbGVtZW50SUR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNsYWItZHJvcGRvd24gZHJvcGRvd24tbWVudSBzbGFiLWRyb3Bkb3duLW1lbnUgc2xhYi1kcm9wZG93bi1zY3JvbGwgc2xhYi1kcm9wZG93bi1hYnNvbHV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbGFiLWNvbnRleHQtbWVudS1zdWJtZW51LWl0ZW0gW2FjdGlvbl09XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbk5hbWVdPVwiYWN0aW9uLmFjdGlvbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNDaGlsZHJlbl09XCJhY3Rpb24uaGFzQ2hpbGRyZW4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzSWNvbnNdPVwiaGFzSWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRNZW51T3JpZ2luYWxdPVwiZ2V0U2VsZlJlZmVyZW5jZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRJZF09XCJlbGVtZW50SURcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3lzdGVsYWItY29udGV4dC1tZW51LXN1Ym1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=