UNPKG

ngx-material-drawer

Version:

[npm_img]: https://img.shields.io/npm/v/ngx-material-drawer.svg?colorB=0E7FBF [npm_url]: https://www.npmjs.com/package/ngx-material-drawer

163 lines 21.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild, ElementRef } from '@angular/core'; import { NgxNavService } from '../utils/nav.service'; import { NgxMaterialDrawerEventEmitter } from '../utils/mat-event-emitter.service'; import { trigger, style, animate, transition } from '@angular/animations'; import { NgxUtilsService } from '../utils/utils.service'; export class NgxTopNavComponent { /** * @param {?} matEventEmitterService * @param {?} navService * @param {?} ngxUtilsService */ constructor(matEventEmitterService, navService, ngxUtilsService) { this.matEventEmitterService = matEventEmitterService; this.navService = navService; this.ngxUtilsService = ngxUtilsService; this.searchValue = ""; } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterViewInit() { this.matEventEmitterService.onNavStateChange.subscribe((/** * @param {?} flag * @return {?} */ (flag) => { this.isDrawerOpened = flag.isOpened; })); this.matEventEmitterService.onSideNavClosed.subscribe((/** * @param {?} flag * @return {?} */ (flag) => { this.isDrawerOpened = flag.isOpened; })); this.matEventEmitterService.onSideNavClosed.subscribe((/** * @param {?} flag * @return {?} */ (flag) => { this.isDrawerOpened = flag.isOpened; })); } /** * @param {?} item * @return {?} */ onItemSelected(item) { if (!item.children || !item.children.length) { this.matEventEmitterService.menuItemClick(item); } } /** * @return {?} */ toggleSearchBar() { this.isSearchActive = !this.isSearchActive; /** @type {?} */ let searchObject = { value: this.searchValue, inputRef: this.ngxSearchBox }; if (this.isSearchActive) { this.matEventEmitterService.serachInputOpen(searchObject); } else { this.matEventEmitterService.serachInputClosed(searchObject); } } /** * @param {?} event * @return {?} */ onSearchValueChange(event) { /** @type {?} */ let searchObject = { value: this.searchValue, inputRef: this.ngxSearchBox }; this.matEventEmitterService.searchValueChange(searchObject); } /** * @param {?} event * @return {?} */ onSerachFocusIn(event) { /** @type {?} */ let searchObject = { value: this.searchValue, inputRef: this.ngxSearchBox }; this.matEventEmitterService.serachFocusIn(searchObject); } /** * @param {?} event * @return {?} */ onSerachFocusOut(event) { /** @type {?} */ let searchObject = { value: this.searchValue, inputRef: this.ngxSearchBox }; this.matEventEmitterService.serachFocusOut(searchObject); } } NgxTopNavComponent.decorators = [ { type: Component, args: [{ selector: 'lib-top-nav', template: "<mat-toolbar\r\n color=\"primary\"\r\n class=\"mat-elevation-z1 ngx-material-toolbar\"\r\n>\r\n <ng-container *ngIf=\"!isSearchActive\">\r\n <!-- DrawerToggle menu -->\r\n <button\r\n class=\"btn-toggle\"\r\n mat-icon-button\r\n id=\"menu\"\r\n (click)=\"navService.toggleNav()\"\r\n >\r\n <!-- <mat-icon>{{config?.toggleIcon ? config.toggleIcon : 'menu'}}</mat-icon> -->\r\n <div\r\n class=\"wrapper-menu\"\r\n *ngIf=\"!config?.toggleIcon\"\r\n [ngClass]=\"isDrawerOpened ? 'open' : 'close'\"\r\n >\r\n <div class=\"line-menu half start\"></div>\r\n <div class=\"line-menu\"></div>\r\n <div class=\"line-menu half end\"></div>\r\n </div>\r\n <ng-container *ngIf=\"config?.toggleIcon\">\r\n <mat-icon>\r\n {{!isDrawerOpened ? config.toggleIcon : config?.closedToggleIcon ? config?.closedToggleIcon : 'close'}}\r\n </mat-icon>\r\n </ng-container>\r\n </button>\r\n <span>\r\n {{config?.appName ? config.appName : 'Default name'}}\r\n </span>\r\n <!-- Right Menu -->\r\n <span class=\"toolbar-spacer\"></span>\r\n <div\r\n class=\"right-nav\"\r\n [ngStyle]=\"config?.rightMenus?.style? config?.rightMenus.style : ''\"\r\n >\r\n <button\r\n *ngIf=\"config?.search?.isEnable\"\r\n mat-button\r\n mat-icon-button\r\n (click)=\"toggleSearchBar()\"\r\n >\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <ng-container *ngIf=\"config?.rightMenus?.data\">\r\n <span *ngFor=\"let item of config?.rightMenus?.data\">\r\n <!-- Handle branch node buttons here -->\r\n <span *ngIf=\"item.children && item.children.length > 0\">\r\n <ng-container *ngIf=\"item.component; else elseBlock\">\r\n <lib-card-holder\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"\r\n ></lib-card-holder>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <button\r\n *ngIf=\"item.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n <span>{{item.displayName}}</span>\r\n </button>\r\n <button\r\n *ngIf=\"!item?.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-icon-button\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n </button>\r\n </ng-template>\r\n <lib-menu-list-item\r\n #menu\r\n [menus]=\"item.children\"\r\n ></lib-menu-list-item>\r\n </span>\r\n <!-- Leaf node buttons here -->\r\n <span *ngIf=\"!item.children || item.children.length === 0\">\r\n <ng-container *ngIf=\"item.component; else elseBlock\">\r\n <lib-card-holder [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"></lib-card-holder>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <button\r\n *ngIf=\"item.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-button\r\n (click)=\"onItemSelected(item)\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n <span>{{item.displayName}}</span>\r\n </button>\r\n <button\r\n *ngIf=\"!item?.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-icon-button\r\n (click)=\"onItemSelected(item)\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n </button>\r\n </ng-template>\r\n </span>\r\n </span>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSearchActive\">\r\n <div\r\n class=\"searchBarMain\"\r\n [ngStyle]=\"config?.search?.style ? config?.search?.style : ''\"\r\n [@enterAnimation]\r\n >\r\n <i\r\n (click)=\"toggleSearchBar()\"\r\n class=\"material-icons searchBarSearchIcon\"\r\n >\r\n {{config?.search?.backIcon ? config?.search?.backIcon : 'arrow_back'}}\r\n </i>\r\n <input\r\n type=\"text\"\r\n #ngxSearchBox\r\n name=\"header-search\"\r\n [(ngModel)]=\"searchValue\"\r\n class=\"searchBarInput\"\r\n (input)=\"onSearchValueChange($event)\"\r\n (focus)=\"onSerachFocusIn($event)\"\r\n (focusout)=\"onSerachFocusOut($event)\"\r\n [placeholder]=\"config?.search?.placeHolder ? config?.search?.placeHolder : 'Search, discover, explore...'\"\r\n >\r\n <i\r\n *ngIf=\"searchValue.length\"\r\n (click)=\"searchValue = ''\"\r\n class=\"material-icons clearSearchBarField\"\r\n >\r\n {{config?.search?.clearIcon ? config?.search?.clearIcon : 'clear'}}\r\n </i>\r\n </div>\r\n </ng-container>\r\n</mat-toolbar>\r\n", animations: [ trigger('enterAnimation', [ transition(':enter', [ style({ transform: 'translateX(100%)', opacity: 0 }), animate('500ms', style({ transform: 'translateX(0)', opacity: 1 })) ]), transition(':leave', [ style({ transform: 'translateX(0)', opacity: 1 }), animate('500ms', style({ transform: 'translateX(100%)', opacity: 0 })) ]) ]) ], styles: [".ngx-material-toolbar .wrapper-menu{width:40px;height:25px;display:flex;flex-direction:column;justify-content:space-between;cursor:pointer;transition:transform 330ms ease-out}.ngx-material-toolbar .wrapper-menu.open{transform:rotate(-45deg)}.ngx-material-toolbar .line-menu{background-color:#fff;border-radius:5px;width:100%;height:4px}.ngx-material-toolbar .line-menu.half{width:50%}.ngx-material-toolbar .line-menu.start{transition:transform 330ms cubic-bezier(.54,-.81,.57,.57);transform-origin:right}.ngx-material-toolbar .open .line-menu.start{transform:rotate(-90deg) translateX(3px)}.ngx-material-toolbar .line-menu.end{align-self:flex-end;transition:transform 330ms cubic-bezier(.54,-.81,.57,.57);transform-origin:left}.ngx-material-toolbar .open .line-menu.end{transform:rotate(-90deg) translateX(-3px)}.ngx-material-toolbar .btn-toggle{margin-right:5px}.ngx-material-toolbar .toolbar-spacer{flex:1 1 auto}.ngx-material-toolbar .right-nav{display:flex}.ngx-material-toolbar .searchBarMain{background:#fff;width:90%;margin:11px auto 0;height:42px;border-radius:2px;box-shadow:0 1px 8px 0 rgba(0,0,0,.14);position:fixed;left:0;right:0;top:0}.ngx-material-toolbar .searchBarMain i.searchBarSearchIcon{height:100%;line-height:42px;float:left;width:52px;cursor:pointer;text-align:center;color:rgba(68,68,68,.5)}.ngx-material-toolbar .searchBarMain input.searchBarInput{height:42px;padding:0 32px 0 0;margin:0;border:0;box-sizing:border-box;background:0 0;width:calc(100% - 52px);outline:0;font-size:16px;color:rgba(0,0,0,.76);font-weight:400;font-family:Roboto,sans-serif}.ngx-material-toolbar .searchBarMain i.clearSearchBarField{position:absolute;right:12px;top:11px;color:rgba(0,0,0,.84);font-size:20px;cursor:pointer}"] }] } ]; /** @nocollapse */ NgxTopNavComponent.ctorParameters = () => [ { type: NgxMaterialDrawerEventEmitter }, { type: NgxNavService }, { type: NgxUtilsService } ]; NgxTopNavComponent.propDecorators = { ngxSearchBox: [{ type: ViewChild, args: ["ngxSearchBox", { static: false },] }], config: [{ type: Input }] }; if (false) { /** @type {?} */ NgxTopNavComponent.prototype.ngxSearchBox; /** @type {?} */ NgxTopNavComponent.prototype.config; /** @type {?} */ NgxTopNavComponent.prototype.isDrawerOpened; /** @type {?} */ NgxTopNavComponent.prototype.isSearchActive; /** @type {?} */ NgxTopNavComponent.prototype.searchValue; /** @type {?} */ NgxTopNavComponent.prototype.matEventEmitterService; /** @type {?} */ NgxTopNavComponent.prototype.navService; /** @type {?} */ NgxTopNavComponent.prototype.ngxUtilsService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLW5hdi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWwtZHJhd2VyLyIsInNvdXJjZXMiOlsibGliL2FwcC90b3AtbmF2L3RvcC1uYXYuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0J6RCxNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7SUFPN0IsWUFBbUIsc0JBQXFELEVBQy9ELFVBQXlCLEVBQ3pCLGVBQWdDO1FBRnRCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBK0I7UUFDL0QsZUFBVSxHQUFWLFVBQVUsQ0FBZTtRQUN6QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFKbEMsZ0JBQVcsR0FBVyxFQUFFLENBQUM7SUFJYSxDQUFDOzs7O0lBRTlDLFFBQVE7SUFDUixDQUFDOzs7O0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNuRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdEMsQ0FBQyxFQUFDLENBQUE7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ2xFLElBQUksQ0FBQyxjQUFjLEdB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QUU7cUJBQzNDLEtBQUs7Ozs7SUFETiwwQ0FBdUU7O0lBQ3ZFLG9DQUFxQjs7SUFDckIsNENBQXNCOztJQUN0Qiw0Q0FBK0I7O0lBQy9CLHlDQUFnQzs7SUFFcEIsb0RBQTREOztJQUN0RSx3Q0FBZ0M7O0lBQ2hDLDZDQUF1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5neE5hdlNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9uYXYuc2VydmljZSc7XHJcbmltcG9ydCB7IE5neE1hdGVyaWFsRHJhd2VyRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvbWF0LWV2ZW50LWVtaXR0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHN0eWxlLCBhbmltYXRlLCB0cmFuc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE5neFV0aWxzU2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRvcC1uYXYnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90b3AtbmF2LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90b3AtbmF2LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcihcclxuICAgICAgJ2VudGVyQW5pbWF0aW9uJywgW1xyXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCc1MDBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKScsIG9wYWNpdHk6IDEgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJywgb3BhY2l0eTogMSB9KSxcclxuICAgICAgICBhbmltYXRlKCc1MDBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pXHJcbiAgICBdXHJcbiAgICApXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFRvcE5hdkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChcIm5neFNlYXJjaEJveFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbmd4U2VhcmNoQm94OiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogYW55O1xyXG4gIHB1YmxpYyBpc0RyYXdlck9wZW5lZDtcclxuICBwdWJsaWMgaXNTZWFyY2hBY3RpdmU6IGJvb2xlYW47XHJcbiAgcHVibGljIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWF0RXZlbnRFbWl0dGVyU2VydmljZTogTmd4TWF0ZXJpYWxEcmF3ZXJFdmVudEVtaXR0ZXIsXHJcbiAgICBwdWJsaWMgbmF2U2VydmljZTogTmd4TmF2U2VydmljZSxcclxuICAgIHB1YmxpYyBuZ3hVdGlsc1NlcnZpY2U6IE5neFV0aWxzU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm9uTmF2U3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKChmbGFnOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pc0RyYXdlck9wZW5lZCA9IGZsYWcuaXNPcGVuZWQ7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm9uU2lkZU5hdkNsb3NlZC5zdWJzY3JpYmUoKGZsYWc6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmlzRHJhd2VyT3BlbmVkID0gZmxhZy5pc09wZW5lZDtcclxuICAgIH0pXHJcbiAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uub25TaWRlTmF2Q2xvc2VkLnN1YnNjcmliZSgoZmxhZzogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEcmF3ZXJPcGVuZWQgPSBmbGFnLmlzT3BlbmVkO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZChpdGVtOiBhbnkpIHtcclxuICAgIGlmICghaXRlbS5jaGlsZHJlbiB8fCAhaXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm1lbnVJdGVtQ2xpY2soaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2VhcmNoQmFyKCkge1xyXG4gICAgdGhpcy5pc1NlYXJjaEFjdGl2ZSA9ICF0aGlzLmlzU2VhcmNoQWN0aXZlO1xyXG4gICAgbGV0IHNlYXJjaE9iamVjdCA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUsXHJcbiAgICAgIGlucHV0UmVmOiB0aGlzLm5neFNlYXJjaEJveFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNTZWFyY2hBY3RpdmUpIHtcclxuICAgICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLnNlcmFjaElucHV0T3BlbihzZWFyY2hPYmplY3QpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uuc2VyYWNoSW5wdXRDbG9zZWQoc2VhcmNoT2JqZWN0KVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlYXJjaFZhbHVlQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICBsZXQgc2VhcmNoT2JqZWN0ID0ge1xyXG4gICAgICB2YWx1ZTogdGhpcy5zZWFyY2hWYWx1ZSxcclxuICAgICAgaW5wdXRSZWY6IHRoaXMubmd4U2VhcmNoQm94XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uuc2VhcmNoVmFsdWVDaGFuZ2Uoc2VhcmNoT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlcmFjaEZvY3VzSW4oZXZlbnQpIHtcclxuICAgIGxldCBzZWFyY2hPYmplY3QgPSB7XHJcbiAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICBpbnB1dFJlZjogdGhpcy5uZ3hTZWFyY2hCb3hcclxuICAgIH1cclxuICAgIHRoaXMubWF0RXZlbnRFbWl0dGVyU2VydmljZS5zZXJhY2hGb2N1c0luKHNlYXJjaE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZXJhY2hGb2N1c091dChldmVudCkge1xyXG4gICAgbGV0IHNlYXJjaE9iamVjdCA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUsXHJcbiAgICAgIGlucHV0UmVmOiB0aGlzLm5neFNlYXJjaEJveFxyXG4gICAgfVxyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLnNlcmFjaEZvY3VzT3V0KHNlYXJjaE9iamVjdCk7XHJcbiAgfVxyXG59Il19