UNPKG

ngx-mat-menu

Version:

⚡ Try it on [StackBlitz](https://stackblitz.com/edit/angular-lnjubx)!

252 lines 34.7 kB
import { __decorate } from "tslib"; import { Component, Input, HostListener, Output, EventEmitter } from '@angular/core'; import { Router } from '@angular/router'; import { NgxMatMenuService } from './ngx-mat-menu.service'; import { trigger, transition, style, animate } from '@angular/animations'; var NgxMatMenuComponent = /** @class */ (function () { function NgxMatMenuComponent(menuService, router) { var _this = this; this.menuService = menuService; this.router = router; this.showMenu = false; this.widthSidebar = '0px'; this.posSidebar = 'relative'; this.showHeader = true; this.hover = false; this.themeSidebarHeader = { background: 'white', color: '' }; this.openNotif = new EventEmitter(); this.logoutEvent = new EventEmitter(); this.profileClick = new EventEmitter(); this.selectItem = new EventEmitter(); this.activeMenu = this.menuService.getSelectedMenu(); // Sidebar selection change this.menuService.changeMenuSelect.subscribe(function (data) { _this.activeMenu = data; }); // Header,sidebar show/hide this.menuService.changeShowMenu.subscribe(function (data) { _this.show = data; }); } NgxMatMenuComponent.prototype.ngOnInit = function () { this.checkSidebarPos(); }; NgxMatMenuComponent.prototype.ngOnChanges = function () { console.log(this.lang); switch (this.lang) { case 'en': this.textLogout = 'Logout'; break; case 'hu': this.textLogout = 'Kijelentkezés'; break; default: this.textLogout = 'Logout'; break; } }; NgxMatMenuComponent.prototype.onResize = function () { this.checkSidebarPos(); }; NgxMatMenuComponent.prototype.checkSidebarPos = function () { var width = document.getElementById('cont').offsetWidth; if (width <= 700) { this.posSidebar = 'absolute'; } else { this.posSidebar = 'relative'; } }; NgxMatMenuComponent.prototype.setMenu = function (event) { var _this = this; if (event !== undefined) { if (event === true) { this.widthSidebar = this.defaultWidth ? this.defaultWidth : '200px'; this.showMenu = !this.showMenu; } else { setTimeout(function () { _this.showMenu = !_this.showMenu; }, 200); this.widthSidebar = '0px'; } } else { if (this.showMenu) { this.widthSidebar = '0px'; setTimeout(function () { _this.showMenu = !_this.showMenu; }, 200); } else { this.widthSidebar = this.defaultWidth ? this.defaultWidth : '200px'; setTimeout(function () { _this.showMenu = !_this.showMenu; }, 200); } } }; /** * Expandable menu item height change * @param id Id of item and expandable element */ NgxMatMenuComponent.prototype.expandMenu = function (id) { console.log(document.getElementById(id.toString()).offsetHeight); if (document.getElementById(id.toString()).offsetHeight === 0) { document.getElementById(id.toString()).style.height = 'auto'; document.getElementById(id.toString()).style.display = 'block'; } else { document.getElementById(id.toString()).style.height = '0px'; document.getElementById(id.toString()).style.display = 'none'; } }; NgxMatMenuComponent.prototype.msSelect_SelectionChange = function (value) { this.selectItem.emit(value); }; // Output: NgxMatMenuComponent.prototype.showNotif = function (event) { this.openNotif.emit(event); }; NgxMatMenuComponent.prototype.selectMenu = function (selected, route) { console.log(route); if (route) { this.menuService.selectMenu(selected); this.router.navigate(["" + route]); } }; NgxMatMenuComponent.prototype.profile_Click = function (event) { this.profileClick.emit(event); }; NgxMatMenuComponent.prototype.logout = function () { this.setMenu(false); this.logoutEvent.next(); }; NgxMatMenuComponent.prototype.hovered = function () { if (this.hover == true) { return this.badgeColor; } }; NgxMatMenuComponent.ctorParameters = function () { return [ { type: NgxMatMenuService }, { type: Router } ]; }; __decorate([ Input() ], NgxMatMenuComponent.prototype, "themeSidebar", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "themeHeader", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "themeSidebarHeader", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "arrMenuOptions", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "logoutIcon", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "badgeColor", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "srcLogo", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "heightLogo", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "widthLogo", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "lang", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "visibleNotif", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "badge", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "defaultWidth", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "borderHeader", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "borderSidebar", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "borderSidebarHeader", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "borderSidebarFooter", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "borderMenuItems", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "headerPicture", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "headerTitle", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "headerTitleColor", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "headerSubtitle", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "headerSubtitleColor", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "selectPlaceholder", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "arrSelectItems", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "defaultSelectValue", void 0); __decorate([ Input() ], NgxMatMenuComponent.prototype, "showSelectValue", void 0); __decorate([ Output() ], NgxMatMenuComponent.prototype, "openNotif", void 0); __decorate([ Output() ], NgxMatMenuComponent.prototype, "logoutEvent", void 0); __decorate([ Output() ], NgxMatMenuComponent.prototype, "profileClick", void 0); __decorate([ Output() ], NgxMatMenuComponent.prototype, "selectItem", void 0); __decorate([ HostListener('window:resize', ['']) ], NgxMatMenuComponent.prototype, "onResize", null); NgxMatMenuComponent = __decorate([ Component({ selector: 'ngx-mat-menu', template: "<div id=\"cont\" style=\"height: 100%;width: 100%;\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\r\n <!-- SIDEBAR -->\r\n <div style=\"overflow-x: hidden; max-width: 90vw; box-shadow: 0px 0px 10px #777777;\" [style.width]=\"widthSidebar\"\r\n [style.position]=\"posSidebar\" [ngStyle]=\"themeSidebar\" fxLayout=\"column\" fxLayoutAlign=\"start start\"\r\n class=\"app-sidebar\" *ngIf=\"show\" [style.border]=\"borderSidebar\">\r\n\r\n <!-- SIDEBAR HEADER -->\r\n <div class=\"app-sidebar-header\" [style.border-bottom]=\"borderSidebarHeader\" [ngStyle]=\"themeSidebarHeader\">\r\n <!-- \r\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\">\r\n <mat-icon style=\"margin-right: 10px;\" *ngIf=\"headerIcon\">{{headerIcon}}</mat-icon> {{headerText}}\r\n </div>\r\n -->\r\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" style=\"height: 100%;\">\r\n <div fxFlex *ngIf=\"headerPicture\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\r\n <div [ngStyle]=\"{ 'background-image': 'url(' + headerPicture + ')'}\" class=\"app-header-picture\"\r\n (click)=\"profile_Click($event)\">\r\n </div>\r\n </div>\r\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"center start\">\r\n <span class=\"app-header-title\" [style.color]=\"headerTitleColor\">{{headerTitle}}</span>\r\n <span class=\"app-header-subtitle\" [style.color]=\"headerSubtitleColor\">{{headerSubtitle}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"arrSelectItems\" fxLayout=\"column\" fxLayoutAlign=\"start start\" style=\"width: 100%; background: white; height: 70px;\">\r\n <mat-form-field style=\"height: 45px;\r\n width: calc(100% - 40px);\r\n margin-left: 15px; \r\n margin-right: 15px;\" >\r\n <mat-select \r\n (selectionChange)=\"msSelect_SelectionChange($event.value)\"\r\n [placeholder]=\"selectPlaceholder\" [(ngModel)]=\"defaultSelectValue\" name=\"item\">\r\n <mat-option *ngFor=\"let item of arrSelectItems\" [value]=\"item.value\">\r\n {{item.title}} <span *ngIf=\"showSelectValue\"> - {{item.value}}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n \r\n </div>\r\n\r\n\r\n <!-- SIDEBAR LIST -->\r\n <div fxFlex fxLayout=\"column\" fxLayoutAlign=\"start start\"\r\n class=\"app-sidebar-body\"\r\n >\r\n\r\n <div *ngFor=\"let item of arrMenuOptions\" [style.border-top]=\"borderMenuItems\" style=\"width: 100%;\"\r\n fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\r\n\r\n\r\n <!-- EXPENDABLE ITEM -->\r\n <mat-expansion-panel #meph *ngIf=\"item.children && !item.divider\" [ngStyle]=\"themeSidebar\"\r\n class=\"expandable-item\" hideToggle=\"true\" style=\"width: 100%;padding: 0px\">\r\n\r\n <!-- BASE ITEM -->\r\n <mat-expansion-panel-header class=\"app-sidebar-item\" style=\"padding-left: 0px;\"\r\n (click)=\"selectMenu(item.id,item.route)\" libColor>\r\n <div style=\"width: 100%; height: 45px;\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\"\r\n [ngClass]=\"{'material-selected-menu': activeMenu === item.id}\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\r\n <div style=\"width: 50px;\" fxLayout=\"row\" fxLayoutAlign=\"center center\"\r\n *ngIf=\"item.icon\">\r\n <mat-icon *ngIf=\"item.icon\">{{item.icon}}</mat-icon>\r\n </div>\r\n <div fxFlex fxLayout=\"row\" fxLayoutAlign=\"start center\" style=\"margin-left: 10px;\">\r\n {{item.title}}\r\n </div>\r\n </div>\r\n <div>\r\n <mat-icon style=\"margin: 10px;\" *ngIf=\"meph.expanded\">expand_less</mat-icon>\r\n <mat-icon style=\"margin: 10px;\" *ngIf=\"!meph.expanded\">expand_more</mat-icon>\r\n\r\n </div>\r\n </div>\r\n\r\n </mat-expansion-panel-header>\r\n\r\n\r\n\r\n\r\n <!-- SUB ITEMS -->\r\n <div fxFlex style=\"width: 100%;\" [id]=\"item.id\" class=\"sub-item-list\">\r\n\r\n <div class=\"app-sidebar-item\" *ngFor=\"let sub of item.children\" style=\"width: 100%;\"\r\n fxLayout=\"column\" fxLayoutAlign=\"start stretch\"\r\n [ngClass]=\"{'material-selected-menu': activeMenu === sub.id}\"\r\n (click)=\"selectMenu(sub.id,sub.route)\" libColor>\r\n\r\n <!-- DIVIDER IF NEEDED .. TODO: HEIGHT!\r\n <div *ngIf=\"sub.divider\" style=\"width: 100%;\r\n border-bottom: 0.5px solid lightgray;\">\r\n </div> -->\r\n\r\n <div class=\"app-sidebar-item\" fxLayout=\"row\" fxLayoutAlign=\"start stretch\"\r\n style=\"width: 100%;\">\r\n <div style=\"width: 50px;\" fxLayout=\"row\" fxLayoutAlign=\"center center\" *ngIf=\"sub.icon\">\r\n <mat-icon *ngIf=\"sub.icon\">{{sub.icon}}</mat-icon>\r\n </div>\r\n <div fxFlex fxLayout=\"row\" fxLayoutAlign=\"start center\" style=\"margin-left: 10px;\">\r\n {{sub.title}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- DIVIDER IF NEEDED .. TODO: SET COLOR -->\r\n <div *ngIf=\"item.divider\" style=\"width: 100%;\r\n border-bottom: 0.5px solid lightgray;\">\r\n\r\n </div>\r\n\r\n\r\n\r\n\r\n <!-- SIMPLE MENU ITEMS -->\r\n <div class=\"app-sidebar-item\" *ngIf=\"!item.children && !item.divider\" fxLayout=\"row\"\r\n fxLayoutAlign=\"start stretch\" [ngClass]=\"{'material-selected-menu': activeMenu === item.id}\"\r\n (click)=\"selectMenu(item.id,item.route)\" libColor>\r\n <div style=\"width: 50px;\" fxLayout=\"row\" fxLayoutAlign=\"center center\" *ngIf=\"item.icon\">\r\n <mat-icon *ngIf=\"item.icon\">{{item.icon}}</mat-icon>\r\n </div>\r\n <div fxFlex fxLayout=\"row\" fxLayoutAlign=\"start center\" style=\"margin-left: 10px;\">\r\n {{item.title}}\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- SIDEBAR FOOTER -->\r\n <div class=\"app-sidebar-footer\" style=\"overflow-x: hidden;\" [style.border-top]=\"borderSidebarFooter\"\r\n fxLayout=\"row\" fxLayoutAlign=\"center center\">\r\n <button mat-button (click)=\"logout()\">\r\n <mat-icon style=\"margin-right: 10px;\" *ngIf=\"logoutIcon\">{{logoutIcon}}</mat-icon>{{textLogout}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- HEADER -->\r\n <div style=\"height: 100%;width:100%; min-width: 0px !important;\" fxLayout=\"column\"\r\n fxLayoutAlign=\"space-between stretch\">\r\n <div *ngIf=\"show\" class=\"app-header\">\r\n <ngx-mat-menu-header [theme]=\"themeHeader\" [visibleNotif]=\"visibleNotif\" [srcLogo]=\"srcLogo\"\r\n [widthLogo]=\"widthLogo\" [heightLogo]=\"heightLogo\" (showMenu)=\"setMenu($event)\"\r\n (showNotif)=\"showNotif($event)\" [badge]=\"badge\" [borderHeader]=\"borderHeader\"></ngx-mat-menu-header>\r\n </div>\r\n <div fxFlex (swipeleft)=\"showMenu ? setMenu(false) : ''\" (swiperight)=\"show === true ? setMenu(true) : null\"\r\n style=\"height: 100%; width: 100%;\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"app-small-blur\" style=\"height: 100%;width: 100%; position: absolute;\"\r\n *ngIf=\"showMenu && showHeader && posSidebar === 'absolute'\" (click)=\"setMenu(false)\"\r\n (swipeleft)=\"setMenu(false)\">\r\n </div>\r\n</div>", animations: [ trigger('enterAnimation', [ transition(':enter', [ style({ transform: 'translateX(100%)', opacity: 0 }), animate('250ms', style({ transform: 'translateX(0)', opacity: 1 })) ]), transition(':leave', [ style({ transform: 'translateX(0)', opacity: 1 }), animate('250ms', style({ transform: 'translateX(100%)', opacity: 0 })) ]) ]) ], styles: [".app-sidebar{-webkit-transition:.4s;transition:.4s;overflow:auto;margin:0!important;height:100%;background:#fff;z-index:900}.app-sidebar-header{height:150px;width:100%;white-space:nowrap;display:block;overflow:hidden;-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out}.app-sidebar-body{white-space:nowrap;display:block;overflow:hidden;-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;width:100%}.app-sidebar-footer{height:60px;width:100%}.app-sidebar-item{height:45px;width:calc(100% - 10px);margin:5px;cursor:pointer}.app-sidebar-item:hover{font-weight:500}.app-small-blur{z-index:800;background-color:#000;opacity:.4}.app-header{-webkit-transition:.5s;transition:.5s;height:60px;background:#fff}.material-selected-menu{border-radius:5px;background-color:rgba(138,138,138,.4)}.app-header-picture{width:50px;height:50px;border-radius:100%;background-size:cover;margin-left:15px;cursor:pointer}.app-header-title{margin-left:15px;font-size:large;font-weight:500}.app-header-subtitle{margin-left:15px;margin-top:5px;font-size:medium}.expandable-item{border:0 solid transparent;background:0 0;box-shadow:none;border-radius:0!important}.sub-item-list{-webkit-transition:.4s;transition:.4s}.mat-expansion-panel-header{padding:0!important;height:60px}"] }) ], NgxMatMenuComponent); return NgxMatMenuComponent; }()); export { NgxMatMenuComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtbWVudS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbWF0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUV4RyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBc0IxRTtJQWtERSw2QkFDVSxXQUE4QixFQUM5QixNQUFjO1FBRnhCLGlCQWdCQztRQWZTLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBaER4QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFDeEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVsQixVQUFLLEdBQVksS0FBSyxDQUFDO1FBS2QsdUJBQWtCLEdBQVUsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQztRQStCNUQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVF4QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7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QUFBLEFBakxELElBaUxDO1NBakxZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRoZW1lLCBNZW51T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9tZW51LW1vZGVscyc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5neE1hdE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtbWF0LW1lbnUuc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1tYXQtbWVudScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1tYXQtbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LW1hdC1tZW51LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcihcclxuICAgICAgJ2VudGVyQW5pbWF0aW9uJywgW1xyXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCcyNTBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKScsIG9wYWNpdHk6IDEgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJywgb3BhY2l0eTogMSB9KSxcclxuICAgICAgICBhbmltYXRlKCcyNTBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pXHJcbiAgICBdXHJcbiAgICApXHJcblxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neE1hdE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIGFjdGl2ZU1lbnU6IG51bWJlcjtcclxuICBzaG93OiBib29sZWFuO1xyXG4gIHNob3dNZW51ID0gZmFsc2U7XHJcbiAgd2lkdGhTaWRlYmFyID0gJzBweCc7XHJcbiAgcG9zU2lkZWJhciA9ICdyZWxhdGl2ZSc7XHJcbiAgc2hvd0hlYWRlciA9IHRydWU7XHJcbiAgdGV4dExvZ291dDogc3RyaW5nO1xyXG4gIGhvdmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICBASW5wdXQoKSB0aGVtZVNpZGViYXI6IFRoZW1lO1xyXG4gIEBJbnB1dCgpIHRoZW1lSGVhZGVyOiBUaGVtZTtcclxuICBASW5wdXQoKSB0aGVtZVNpZGViYXJIZWFkZXI6IFRoZW1lID0ge2JhY2tncm91bmQ6ICd3aGl0ZScsIGNvbG9yOiAnJ307XHJcblxyXG4gIEBJbnB1dCgpIGFyck1lbnVPcHRpb25zOiBBcnJheTxNZW51T3B0aW9ucz47IC8vIHJlcXVpcmVkXHJcbiAgQElucHV0KCkgbG9nb3V0SWNvbjogc3RyaW5nOyAvLyBvcHRpb25hbFxyXG4gIEBJbnB1dCgpIGJhZGdlQ29sb3I6IHN0cmluZzsgLy8gb3B0aW9uYWwsIGRlZmF1bHQgaXMgYmxhY2tcclxuICBASW5wdXQoKSBzcmNMb2dvOiBzdHJpbmc7IC8vIG9wdGlvbmFsXHJcbiAgQElucHV0KCkgaGVpZ2h0TG9nbzogc3RyaW5nOyAvLyBvcHRpb25hbFxyXG4gIEBJbnB1dCgpIHdpZHRoTG9nbzogc3RyaW5nOyAvLyBvcHRpb25hbFxyXG4gIEBJbnB1dCgpIGxhbmc6IHN0cmluZzsgLy8gb3B0aW9uYWwgZGVmYXVsdCBpcyBlbiAoc2VlIGJlbG93IGluIHN3aXRjaClcclxuICBASW5wdXQoKSB2aXNpYmxlTm90aWY6IGJvb2xlYW47IC8vIG9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlL3VuZGVmaW5lZFxyXG4gIEBJbnB1dCgpIGJhZGdlOiBudW1iZXI7IC8vIG51bWJlciBvZiBub3RpZmljYXRpb25zXHJcbiAgQElucHV0KCkgZGVmYXVsdFdpZHRoOiBzdHJpbmc7IC8vIGRlZmF1bHQgd2lkdGggb2YgdGhlIG1lbnUgc2lkZWJhclxyXG4gIEBJbnB1dCgpIGJvcmRlckhlYWRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvcmRlclNpZGViYXI6IHN0cmluZztcclxuICBASW5wdXQoKSBib3JkZXJTaWRlYmFySGVhZGVyOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYm9yZGVyU2lkZWJhckZvb3Rlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvcmRlck1lbnVJdGVtczogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhlYWRlclBpY3R1cmU6IHN0cmluZzsgXHJcbiAgQElucHV0KCkgaGVhZGVyVGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBoZWFkZXJUaXRsZUNvbG9yOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaGVhZGVyU3VidGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBoZWFkZXJTdWJ0aXRsZUNvbG9yOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHNlbGVjdFBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXJyU2VsZWN0SXRlbXM6IGFueTtcclxuICBASW5wdXQoKSBkZWZhdWx0U2VsZWN0VmFsdWU6IHN0cmluZztcclxuICBASW5wdXQoKSBzaG93U2VsZWN0VmFsdWU6IGJvb2xlYW47XHJcblxyXG4gIFxyXG5cclxuXHJcbiAgQE91dHB1dCgpIG9wZW5Ob3RpZiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgbG9nb3V0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHByb2ZpbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0SXRlbSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1lbnVTZXJ2aWNlOiBOZ3hNYXRNZW51U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxuICApIHtcclxuXHJcblxyXG4gICAgdGhpcy5hY3RpdmVNZW51ID0gdGhpcy5tZW51U2VydmljZS5nZXRTZWxlY3RlZE1lbnUoKTtcclxuICAgIC8vIFNpZGViYXIgc2VsZWN0aW9uIGNoYW5nZVxyXG4gICAgdGhpcy5tZW51U2VydmljZS5jaGFuZ2VNZW51U2VsZWN0LnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5hY3RpdmVNZW51ID0gZGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEhlYWRlcixzaWRlYmFyIHNob3cvaGlkZVxyXG4gICAgdGhpcy5tZW51U2VydmljZS5jaGFuZ2VTaG93TWVudS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvdyA9IGRhdGE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jaGVja1NpZGViYXJQb3MoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5sYW5nKTtcclxuICAgIHN3aXRjaCAodGhpcy5sYW5nKSB7XHJcbiAgICAgIGNhc2UgJ2VuJzpcclxuICAgICAgICB0aGlzLnRleHRMb2dvdXQgPSAnTG9nb3V0JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaHUnOlxyXG4gICAgICAgIHRoaXMudGV4dExvZ291dCA9ICdLaWplbGVudGtlesOpcyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy50ZXh0TG9nb3V0ID0gJ0xvZ291dCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWycnXSlcclxuICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tTaWRlYmFyUG9zKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja1NpZGViYXJQb3MoKSB7XHJcbiAgICBjb25zdCB3aWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250Jykub2Zmc2V0V2lkdGg7XHJcbiAgICBpZiAod2lkdGggPD0gNzAwKSB7XHJcbiAgICAgIHRoaXMucG9zU2lkZWJhciA9ICdhYnNvbHV0ZSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvc1NpZGViYXIgPSAncmVsYXRpdmUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TWVudShldmVudCkge1xyXG4gICAgaWYgKGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGV2ZW50ID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGhTaWRlYmFyID0gdGhpcy5kZWZhdWx0V2lkdGggPyB0aGlzLmRlZmF1bHRXaWR0aCA6ICcyMDBweCc7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9ICF0aGlzLnNob3dNZW51O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVudSA9ICF0aGlzLnNob3dNZW51O1xyXG4gICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgdGhpcy53aWR0aFNpZGViYXIgPSAnMHB4JztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd01lbnUpIHtcclxuICAgICAgICB0aGlzLndpZHRoU2lkZWJhciA9ICcwcHgnO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVudSA9ICF0aGlzLnNob3dNZW51O1xyXG4gICAgICAgIH0sIDIwMCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy53aWR0aFNpZGViYXIgPSB0aGlzLmRlZmF1bHRXaWR0aCA/IHRoaXMuZGVmYXVsdFdpZHRoIDogJzIwMHB4JztcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hvd01lbnUgPSAhdGhpcy5zaG93TWVudTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwYW5kYWJsZSBtZW51IGl0ZW0gaGVpZ2h0IGNoYW5nZVxyXG4gICAqIEBwYXJhbSBpZCBJZCBvZiBpdGVtIGFuZCBleHBhbmRhYmxlIGVsZW1lbnRcclxuICAgKi9cclxuICBleHBhbmRNZW51KGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnNvbGUubG9nKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkLnRvU3RyaW5nKCkpLm9mZnNldEhlaWdodCk7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQudG9TdHJpbmcoKSkub2Zmc2V0SGVpZ2h0ID09PSAwKSB7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkLnRvU3RyaW5nKCkpLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQudG9TdHJpbmcoKSkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQudG9TdHJpbmcoKSkuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkLnRvU3RyaW5nKCkpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbiAgICBcclxuICB9XHJcblxyXG4gIG1zU2VsZWN0X1NlbGVjdGlvbkNoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdEl0ZW0uZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBPdXRwdXQ6XHJcbiAgc2hvd05vdGlmKGV2ZW50KSB7XHJcbiAgICB0aGlzLm9wZW5Ob3RpZi5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE1lbnUoc2VsZWN0ZWQ6IG51bWJlciwgcm91dGU/OiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKHJvdXRlKTtcclxuICAgIGlmIChyb3V0ZSkge1xyXG4gICAgICB0aGlzLm1lbnVTZXJ2aWNlLnNlbGVjdE1lbnUoc2VsZWN0ZWQpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7cm91dGV9YF0pOyBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2ZpbGVfQ2xpY2soZXZlbnQpIHtcclxuICAgIHRoaXMucHJvZmlsZUNsaWNrLmVtaXQoZXZlbnQpXHJcbiAgfVxyXG5cclxuICBsb2dvdXQoKSB7XHJcbiAgICB0aGlzLnNldE1lbnUoZmFsc2UpO1xyXG4gICAgdGhpcy5sb2dvdXRFdmVudC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBob3ZlcmVkKCkge1xyXG4gICAgaWYgKHRoaXMuaG92ZXIgPT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5iYWRnZUNvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=