@luminela/menu
Version:
A simple menubar component for Angular.
133 lines • 20.1 kB
JavaScript
import { Component, ContentChildren, ElementRef, HostBinding, HostListener, Input } from "@angular/core";
import { MenuComponent } from "../menu/menu.component";
import { ActiveDescendantKeyManager } from "@angular/cdk/a11y";
export class MenuBarComponent {
constructor(hostElementRef) {
this.hostElementRef = hostElementRef;
this.menuThemeClass = "theme-light";
this.menuTheme = "light";
this.menuClass = "";
}
set theme(theme) {
this.menuTheme = theme;
this.menuThemeClass = theme === "dark" ? "theme-dark" : "theme-light";
}
get lt() {
return this.menuThemeClass === "theme-light";
}
get dt() {
return this.menuThemeClass === "theme-dark";
}
ngOnInit() {
}
ngAfterContentInit() {
console.log(this.menuList);
}
ngAfterViewInit() {
this.keyManager = new ActiveDescendantKeyManager(this.menuList.toArray()).withWrap(true).skipPredicate(m => m.disabled);
}
onMenuChange(data) {
this.menuChangeData = data;
}
onMenuClose(data) {
this.keyManager.setActiveItem(null);
this.previousMenuData = null;
if (!!this.currentMenu) {
this.currentMenu.focused = false;
this.currentMenu = null;
}
this.menuChangeData = null;
}
onMenuClick(event, menu) {
var _a;
if (this.previousMenuElement === event.target.closest(`[data-uid='${menu.uid}']`)) {
menu.focused = !menu.focused;
if (!menu.focused) {
(_a = this.previousMenuData) === null || _a === void 0 ? void 0 : _a.contextMenuRef.popupRef.close();
}
return;
}
this.previousMenuElement = event.target.closest("li").firstChild;
this.keyManager.setActiveItem(this.menuList.find(m => m.uid === menu.uid));
this.currentMenu = menu;
}
onMenuMouseEnter(event, menu) {
var _a;
if (this.previousMenuData) {
if (this.previousMenuElement === event.target.closest(`[data-uid='${menu.uid}']`)) {
return;
}
(_a = this.previousMenuData) === null || _a === void 0 ? void 0 : _a.contextMenuRef.popupRef.close();
event.target.dispatchEvent(new MouseEvent("click", Object.assign({}, event)));
this.keyManager.setActiveItem(this.menuList.find(m => m.uid === menu.uid));
}
this.previousMenuElement = event.target.closest("li").firstChild;
this.currentMenu = menu;
}
onMenuMouseLeave(event, menu) {
// this.currentMenu = null;
// menu.focused = false;
// this.keyManager.setActiveItem(null);
}
onMenuOpen(data) {
if (data.depth > 0) {
return;
}
this.previousMenuData = data;
}
onKeydown(event) {
var _a, _b, _c;
if (!this.previousMenuData) {
return;
}
switch (event.key) {
case "Enter":
case "NumEnter":
case " ":
this.keyManager.setActiveItem(null);
return;
case "ArrowUp":
case "ArrowDown":
console.log("Ignore " + event.key);
return;
case "ArrowLeft":
if (((_a = this.menuChangeData) === null || _a === void 0 ? void 0 : _a.depth) > 1) {
return;
}
this.keyManager.setPreviousItemActive();
break;
case "ArrowRight":
if (((_c = (_b = this.menuChangeData) === null || _b === void 0 ? void 0 : _b.item.menuItems) === null || _c === void 0 ? void 0 : _c.length) > 0) {
return;
}
this.keyManager.setNextItemActive();
break;
default:
this.keyManager.onKeydown(event);
break;
}
if (this.keyManager.activeItem) {
this.currentMenu = this.keyManager.activeItem;
document.querySelector(`[data-uid='${this.currentMenu.uid}']`).dispatchEvent(new MouseEvent("mouseenter"));
}
}
}
MenuBarComponent.decorators = [
{ type: Component, args: [{
selector: "yui-menu-bar",
template: "<div class=\"wrapper\">\n <ul class=\"menubar-list\" *ngIf=\"menuList?.length > 0\">\n <li *ngFor=\"let item of menuList\" #listElement (mouseenter)=\"onMenuMouseEnter($event, item)\"\n (mouseleave)=\"onMenuMouseLeave($event, item)\" (click)=\"onMenuClick($event, item)\"\n [attr.data-uid]=\"item.uid\"\n [ngClass]=\"{'active': item.focused && !item.disabled, 'disabled': item.disabled}\">\n <span *ngIf=\"!item.textTemplate\">{{item.text}}</span>\n <ng-container [ngTemplateOutlet]=\"item.textTemplate\" *ngIf=\"!!item.textTemplate\"></ng-container>\n <yui-contextmenu [target]=\"listElement\" [menuItems]=\"item.menuItems\" [theme]=\"menuTheme\" [menuClass]=\"menuClass\"\n [precise]=\"false\" trigger=\"click\" (menuOpen)=\"onMenuOpen($event)\"\n (menuClose)=\"onMenuClose($event)\" (menuChange)=\"onMenuChange($event)\"></yui-contextmenu>\n </li>\n </ul>\n</div>\n",
styles: ["div.wrapper{height:25px;width:100%}div.wrapper,div.wrapper *{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;box-sizing:border-box;user-select:none}ul.menubar-list{justify-content:flex-start;width:100%}ul.menubar-list,ul.menubar-list>li{align-items:center;display:flex;height:100%}ul.menubar-list>li{border-left:1px solid transparent;border-right:1px solid transparent;font-size:13px;font-weight:600;justify-content:center;padding:0 10px}ul.menubar-list>li.disabled{pointer-events:none}:host-context(.theme-light) ul.menubar-list{background:#e8e8e8;border-bottom:1px solid #d1d1d1}:host-context(.theme-light) ul.menubar-list>li{color:#383848}:host-context(.theme-light) ul.menubar-list>li.active,:host-context(.theme-light) ul.menubar-list>li:hover:not(.disabled){background:#f2f2f4}:host-context(.theme-light) ul.menubar-list>li.active:not(:first-child),:host-context(.theme-light) ul.menubar-list>li:hover:not(.disabled):not(:first-child){border-left:1px solid #d1d1d1}:host-context(.theme-light) ul.menubar-list>li.disabled{color:#a7a7af}:host-context(.theme-dark) ul.menubar-list{background:#383838;border-bottom:1px solid #585858}:host-context(.theme-dark) ul.menubar-list>li{color:#c0c0c6}:host-context(.theme-dark) ul.menubar-list>li.active,:host-context(.theme-dark) ul.menubar-list>li:hover:not(.disabled){background:#47474f}:host-context(.theme-dark) ul.menubar-list>li.active:not(:first-child),:host-context(.theme-dark) ul.menubar-list>li:hover:not(.disabled):not(:first-child){border-left:1px solid #585858}:host-context(.theme-dark) ul.menubar-list>li.disabled{color:#6a6a70}"]
},] }
];
MenuBarComponent.ctorParameters = () => [
{ type: ElementRef }
];
MenuBarComponent.propDecorators = {
menuList: [{ type: ContentChildren, args: [MenuComponent,] }],
menuClass: [{ type: Input }],
theme: [{ type: Input }],
lt: [{ type: HostBinding, args: ["class.theme-light",] }],
dt: [{ type: HostBinding, args: ["class.theme-dark",] }],
onKeydown: [{ type: HostListener, args: ["window:keydown", ["$event"],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL3l1aS1tZW51L3l1aS1tZW51L3Byb2plY3RzL3l1aS1tZW51L3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL21lbnUtYmFyL21lbnUtYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBR1IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBUTdELE1BQU0sT0FBTyxnQkFBZ0I7SUF5QnpCLFlBQ3FCLGNBQTBCO1FBQTFCLG1CQUFjLEdBQWQsY0FBYyxDQUFZO1FBdkJ2QyxtQkFBYyxHQUFtQixhQUFhLENBQUM7UUFHaEQsY0FBUyxHQUFjLE9BQU8sQ0FBQztRQUk3QixjQUFTLEdBQVcsRUFBRSxDQUFDO0lBa0JoQyxDQUFDO0lBaEJELElBQWEsS0FBSyxDQUFDLEtBQWdCO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQXNDLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLGFBQWEsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBcUMsRUFBRTtRQUNuQyxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWSxDQUFDO0lBQ2hELENBQUM7SUFPRCxRQUFRO0lBQ1IsQ0FBQztJQUVELGtCQUFrQjtRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxD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VSxFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDOUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM5RztJQUNMLENBQUM7OztZQXZJSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLDgvQkFBd0M7O2FBRTNDOzs7WUFoQkcsVUFBVTs7O3VCQTBCVCxlQUFlLFNBQUMsYUFBYTt3QkFDN0IsS0FBSztvQkFFTCxLQUFLO2lCQUtMLFdBQVcsU0FBQyxtQkFBbUI7aUJBSS9CLFdBQVcsU0FBQyxrQkFBa0I7d0JBMEU5QixZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBRdWVyeUxpc3Rcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7TWVudUNvbXBvbmVudH0gZnJvbSBcIi4uL21lbnUvbWVudS5jb21wb25lbnRcIjtcbmltcG9ydCB7SUNvbnRleHRNZW51RGF0YSwgSU1lbnVDaGFuZ2VFdmVudCwgSU1lbnVDbG9zZUV2ZW50LCBJTWVudU9wZW5FdmVudH0gZnJvbSBcIkBsdW1pbmVsYS9jb250ZXh0bWVudVwiO1xuaW1wb3J0IHtBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQge01lbnVUaGVtZSwgTWVudVRoZW1lQ2xhc3N9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL01lbnVUaGVtZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJ5dWktbWVudS1iYXJcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL21lbnUtYmFyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL21lbnUtYmFyLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gICAgcHJpdmF0ZSBrZXlNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxNZW51Q29tcG9uZW50PjtcbiAgICBwcml2YXRlIG1lbnVUaGVtZUNsYXNzOiBNZW51VGhlbWVDbGFzcyA9IFwidGhlbWUtbGlnaHRcIjtcbiAgICBwdWJsaWMgY3VycmVudE1lbnU6IE1lbnVDb21wb25lbnQ7XG4gICAgcHVibGljIG1lbnVDaGFuZ2VEYXRhOiBJTWVudUNoYW5nZUV2ZW50O1xuICAgIHB1YmxpYyBtZW51VGhlbWU6IE1lbnVUaGVtZSA9IFwibGlnaHRcIjtcbiAgICBwdWJsaWMgcHJldmlvdXNNZW51RGF0YTogSUNvbnRleHRNZW51RGF0YTtcbiAgICBwdWJsaWMgcHJldmlvdXNNZW51RWxlbWVudDogSFRNTExJRWxlbWVudDtcbiAgICBAQ29udGVudENoaWxkcmVuKE1lbnVDb21wb25lbnQpIG1lbnVMaXN0OiBRdWVyeUxpc3Q8TWVudUNvbXBvbmVudD47XG4gICAgQElucHV0KCkgbWVudUNsYXNzOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgQElucHV0KCkgc2V0IHRoZW1lKHRoZW1lOiBNZW51VGhlbWUpIHtcbiAgICAgICAgdGhpcy5tZW51VGhlbWUgPSB0aGVtZTtcbiAgICAgICAgdGhpcy5tZW51VGhlbWVDbGFzcyA9IHRoZW1lID09PSBcImRhcmtcIiA/IFwidGhlbWUtZGFya1wiIDogXCJ0aGVtZS1saWdodFwiO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLnRoZW1lLWxpZ2h0XCIpIGdldCBsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVudVRoZW1lQ2xhc3MgPT09IFwidGhlbWUtbGlnaHRcIjtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy50aGVtZS1kYXJrXCIpIGdldCBkdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVudVRoZW1lQ2xhc3MgPT09IFwidGhlbWUtZGFya1wiO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50UmVmOiBFbGVtZW50UmVmXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLm1lbnVMaXN0KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMua2V5TWFuYWdlciA9IG5ldyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxNZW51Q29tcG9uZW50Pih0aGlzLm1lbnVMaXN0LnRvQXJyYXkoKSkud2l0aFdyYXAodHJ1ZSkuc2tpcFByZWRpY2F0ZShtID0+IG0uZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1lbnVDaGFuZ2UoZGF0YTogSU1lbnVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVDaGFuZ2VEYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25NZW51Q2xvc2UoZGF0YTogSU1lbnVDbG9zZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG51bGwpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTWVudURhdGEgPSBudWxsO1xuICAgICAgICBpZiAoISF0aGlzLmN1cnJlbnRNZW51KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNZW51LmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1lbnUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVudUNoYW5nZURhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1lbnVDbGljayhldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c01lbnVFbGVtZW50ID09PSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGBbZGF0YS11aWQ9JyR7bWVudS51aWR9J11gKSkge1xuICAgICAgICAgICAgbWVudS5mb2N1c2VkID0gIW1lbnUuZm9jdXNlZDtcbiAgICAgICAgICAgIGlmICghbWVudS5mb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c01lbnVEYXRhPy5jb250ZXh0TWVudVJlZi5wb3B1cFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlvdXNNZW51RWxlbWVudCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJsaVwiKS5maXJzdENoaWxkIGFzIEhUTUxMSUVsZW1lbnQ7XG4gICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMubWVudUxpc3QuZmluZChtID0+IG0udWlkID09PSBtZW51LnVpZCkpO1xuICAgICAgICB0aGlzLmN1cnJlbnRNZW51ID0gbWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25NZW51TW91c2VFbnRlcihldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c01lbnVEYXRhKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c01lbnVFbGVtZW50ID09PSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGBbZGF0YS11aWQ9JyR7bWVudS51aWR9J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNNZW51RGF0YT8uY29udGV4dE1lbnVSZWYucG9wdXBSZWYuY2xvc2UoKTtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIiwgey4uLmV2ZW50fSkpO1xuICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5tZW51TGlzdC5maW5kKG0gPT4gbS51aWQgPT09IG1lbnUudWlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2aW91c01lbnVFbGVtZW50ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcImxpXCIpLmZpcnN0Q2hpbGQgYXMgSFRNTExJRWxlbWVudDtcbiAgICAgICAgdGhpcy5jdXJyZW50TWVudSA9IG1lbnU7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgb25NZW51TW91c2VMZWF2ZShldmVudDogTW91c2VFdmVudCwgbWVudTogTWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmN1cnJlbnRNZW51ID0gbnVsbDtcbiAgICAgICAgLy8gbWVudS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1lbnVPcGVuKGRhdGE6IElNZW51T3BlbkV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXRhLmRlcHRoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlvdXNNZW51RGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzprZXlkb3duXCIsIFtcIiRldmVudFwiXSlcbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wcmV2aW91c01lbnVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgY2FzZSBcIk51bUVudGVyXCI6XG4gICAgICAgICAgICBjYXNlIFwiIFwiOlxuICAgICAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJZ25vcmUgXCIgKyBldmVudC5rZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW51Q2hhbmdlRGF0YT8uZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW51Q2hhbmdlRGF0YT8uaXRlbS5tZW51SXRlbXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmtleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNZW51ID0gdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW07XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS11aWQ9JyR7dGhpcy5jdXJyZW50TWVudS51aWR9J11gKS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwibW91c2VlbnRlclwiKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=