UNPKG

angular-admin-lte-teliqo

Version:
597 lines (596 loc) 60.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, NgZone, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core'; import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router'; import { RoutingService } from '../../services/routing.service'; import { WrapperService } from '../wrapper/wrapper.service'; import { HeaderService } from '../header/header.service'; import { LayoutStore } from '../layout.store'; import { removeListeners, removeSubscriptions } from '../../helpers'; import { SidebarLeftToggleDirective } from './sidebar-left.directive'; /** * @record */ export function Item() { } function Item_tsickle_Closure_declarations() { /** @type {?} */ Item.prototype.id; /** @type {?} */ Item.prototype.parentId; /** @type {?} */ Item.prototype.label; /** @type {?|undefined} */ Item.prototype.route; /** @type {?|undefined} */ Item.prototype.iconClasses; /** @type {?|undefined} */ Item.prototype.children; /** @type {?|undefined} */ Item.prototype.isActive; /** @type {?|undefined} */ Item.prototype.isCollapsed; /** @type {?|undefined} */ Item.prototype.disableCollapse; } var SidebarLeftComponent = /** @class */ (function () { /** * @method constructor * @param changeDetectorRef [description] * @param layoutStore [description] * @param ngZone [description] * @param renderer2 [description] * @param router [description] * @param routingService [description] * @param wrapperService [description] * @param headerService [description] */ function SidebarLeftComponent(changeDetectorRef, layoutStore, ngZone, renderer2, router, routingService, wrapperService, headerService) { this.changeDetectorRef = changeDetectorRef; this.layoutStore = layoutStore; this.ngZone = ngZone; this.renderer2 = renderer2; this.router = router; this.routingService = routingService; this.wrapperService = wrapperService; this.headerService = headerService; this.collapsedItems = []; this.activatedItems = []; this.toggleListeners = []; this.listeners = []; this.itemsByIds = {}; this.runningAnimations = 0; this.subscriptions = []; } /** * @method ngOnInit */ /** * \@method ngOnInit * @return {?} */ SidebarLeftComponent.prototype.ngOnInit = /** * \@method ngOnInit * @return {?} */ function () { var _this = this; this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(function (value) { _this.menu = value; _this.monkeyPatchMenu(_this.menu); if (_this.initialized) { _this.setMenuListeners(_this.activeUrl); _this.setSidebarListeners(); _this.setMenuTogglesListeners(); } _this.initialized = true; })); this.subscriptions.push(this.layoutStore.sidebarLeftMenuActiveUrl.subscribe(function (value) { _this.activeUrl = value; _this.setMenuListeners(value); })); this.subscriptions.push(this.routingService.events.subscribe(function (event) { if (event instanceof NavigationEnd) { _this.activeUrl = event.url; _this.setMenuListeners(event.url); } })); this.setSidebarListeners(); }; /** * @method ngAfterViewInit */ /** * \@method ngAfterViewInit * @return {?} */ SidebarLeftComponent.prototype.ngAfterViewInit = /** * \@method ngAfterViewInit * @return {?} */ function () { this.setMenuTogglesListeners(); this.checkMenuWithoutChildren(); }; /** * @method ngOnDestroy */ /** * \@method ngOnDestroy * @return {?} */ SidebarLeftComponent.prototype.ngOnDestroy = /** * \@method ngOnDestroy * @return {?} */ function () { this.subscriptions = removeSubscriptions(this.subscriptions); this.listeners = removeListeners(this.listeners); this.toggleListeners = removeListeners(this.toggleListeners); }; /** * [setSidebarListeners description] * @method setSidebarListeners */ /** * [setSidebarListeners description] * \@method setSidebarListeners * @return {?} */ SidebarLeftComponent.prototype.setSidebarListeners = /** * [setSidebarListeners description] * \@method setSidebarListeners * @return {?} */ function () { var _this = this; this.subscriptions.push(this.layoutStore.layout.subscribe(function (value) { _this.layout = value; _this.setSidebarHeight(); })); this.subscriptions.push(this.layoutStore.windowInnerHeight.subscribe(function (value) { _this.windowInnerHeight = value; _this.setSidebarHeight(); })); this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(function () { _this.changeDetectorRef.detectChanges(); })); this.ngZone.runOutsideAngular(function () { _this.listeners.push(_this.renderer2.listen(_this.sidebarElement.nativeElement, 'mouseenter', function () { _this.layoutStore.sidebarLeftMouseOver(true); })); _this.listeners.push(_this.renderer2.listen(_this.sidebarElement.nativeElement, 'mouseleave', function () { _this.layoutStore.sidebarLeftMouseOver(false); })); }); this.subscriptions.push(this.layoutStore.windowInnerWidth.subscribe(function (value) { _this.windowInnerWidth = value; if (!_this.isSidebarLeftCollapsed && _this.windowInnerWidth <= 767) { _this.layoutStore.sidebarLeftCollapsed(true); } else if (_this.windowInnerWidth > 767 && _this.isSidebarLeftCollapsed && !_this.isSidebarLeftExpandOnOver) { _this.layoutStore.sidebarLeftCollapsed(false); } })); this.subscriptions.push(this.layoutStore.isSidebarLeftMouseOver.subscribe(function (value) { _this.isSidebarLeftMouseOver = value; if (_this.isSidebarLeftExpandOnOver) { _this.layoutStore.sidebarLeftCollapsed(!value); } })); this.subscriptions.push(this.layoutStore.isSidebarLeftExpandOnOver.subscribe(function (value) { _this.isSidebarLeftExpandOnOver = value; if (_this.windowInnerWidth > 767 && _this.isSidebarLeftCollapsed !== undefined) { _this.layoutStore.sidebarLeftCollapsed(value); } })); this.subscriptions.push(this.layoutStore.isSidebarLeftCollapsed.subscribe(function (value) { _this.isSidebarLeftCollapsed = value; if (_this.windowInnerWidth <= 767) { if (value) { _this.renderer2.removeClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open'); } else { _this.renderer2.addClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open'); } } else { if (_this.isSidebarLeftExpandOnOver && !_this.isSidebarLeftMouseOver && !value) { _this.layoutStore.sidebarLeftExpandOnOver(false); } if (value) { _this.renderer2.addClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse'); if (_this.isSidebarLeftExpandOnOver) { _this.renderer2.removeClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover'); } } else { _this.renderer2.removeClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse'); if (_this.isSidebarLeftExpandOnOver) { _this.renderer2.addClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover'); } } } })); this.subscriptions.push(this.layoutStore.isSidebarLeftMini.subscribe(function (value) { if (value) { _this.renderer2.addClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini'); } else { _this.renderer2.removeClass(_this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini'); } })); }; /** * [setMenuListeners description] * @method setMenuListeners */ /** * [setMenuListeners description] * \@method setMenuListeners * @param {?} url * @return {?} */ SidebarLeftComponent.prototype.setMenuListeners = /** * [setMenuListeners description] * \@method setMenuListeners * @param {?} url * @return {?} */ function (url) { if (url === '/') { this.activeItems(url); this.changeDetectorRef.detectChanges(); } else { var /** @type {?} */ primaryOutlet = this.router.parseUrl(url).root.children[PRIMARY_OUTLET]; if (primaryOutlet) { this.activeItems(primaryOutlet.toString()); this.changeDetectorRef.detectChanges(); } } if (this.windowInnerWidth <= 767 || this.isSidebarLeftExpandOnOver) { this.layoutStore.sidebarLeftCollapsed(true); } }; /** * [getIconClasses description] * \@method getIconClasses * @param {?} item [description] * @return {?} [description] */ SidebarLeftComponent.prototype.getIconClasses = /** * [getIconClasses description] * \@method getIconClasses * @param {?} item [description] * @return {?} [description] */ function (item) { if (item.iconClasses || item.iconClasses === '') { return item.iconClasses; } else { return 'fa fa-circle-o'; } }; /** * [visibilityStateStart description] * \@method visibilityStateStart * @param {?} event [description] * @return {?} */ SidebarLeftComponent.prototype.visibilityStateStart = /** * [visibilityStateStart description] * \@method visibilityStateStart * @param {?} event [description] * @return {?} */ function (event) { var _this = this; this.runningAnimations++; this.ngZone.runOutsideAngular(function () { setTimeout(function () { _this.runningAnimations--; if (!_this.runningAnimations) { _this.layoutStore.setSidebarLeftElementHeight(_this.sidebarElement.nativeElement.offsetHeight); } }, event.totalTime); }); }; /** * [uncollapseItemParents description] * \@method uncollapseItemParents * @param {?} item [description] * @param {?=} isActive [description] * @return {?} */ SidebarLeftComponent.prototype.uncollapseItemParents = /** * [uncollapseItemParents description] * \@method uncollapseItemParents * @param {?} item [description] * @param {?=} isActive [description] * @return {?} */ function (item, isActive) { if (isActive === void 0) { isActive = false; } if (isActive) { item.isActive = true; this.activatedItems.push(item); } item.isCollapsed = false; this.collapsedItems.push(item); if (item.parentId) { this.uncollapseItemParents(this.itemsByIds[item.parentId], isActive); } }; /** * [findItemsByUrl description] * \@method findItemsByUrl * @param {?} url [description] * @param {?} items [description] * @param {?=} returnItems [description] * @return {?} [description] */ SidebarLeftComponent.prototype.findItemsByUrl = /** * [findItemsByUrl description] * \@method findItemsByUrl * @param {?} url [description] * @param {?} items [description] * @param {?=} returnItems [description] * @return {?} [description] */ function (url, items, returnItems) { var _this = this; if (returnItems === void 0) { returnItems = []; } items.forEach(function (item) { if (item.route === url) { returnItems.push(item); } else if (item.children) { _this.findItemsByUrl(url, item.children, returnItems); } }); return returnItems; }; /** * [activeItems description] * \@method activeItems * @param {?} url [description] * @return {?} */ SidebarLeftComponent.prototype.activeItems = /** * [activeItems description] * \@method activeItems * @param {?} url [description] * @return {?} */ function (url) { var _this = this; this.activatedItems.forEach(function (item) { item.isActive = false; }); this.activatedItems = []; this.collapsedItems.forEach(function (item) { item.isActive = false; item.isCollapsed = true; }); this.collapsedItems = []; var /** @type {?} */ items = this.findItemsByUrl(url, this.menu); items.forEach(function (item) { item.isActive = true; _this.uncollapseItemParents(item, true); _this.activatedItems.push(item); }); }; /** * [monkeyPatchMenu description] * \@method monkeyPatchMenu * @param {?} items [description] * @param {?=} parentId [description] * @return {?} */ SidebarLeftComponent.prototype.monkeyPatchMenu = /** * [monkeyPatchMenu description] * \@method monkeyPatchMenu * @param {?} items [description] * @param {?=} parentId [description] * @return {?} */ function (items, parentId) { var _this = this; items.forEach(function (item, index) { item.id = parentId ? Number(parentId + '' + index) : index; if (parentId) { item.parentId = parentId; } if (!item.disableCollapse) { item.isCollapsed = true; } item.isActive = false; if (parentId || item.children) { _this.itemsByIds[item.id] = item; } if (item.children) { _this.monkeyPatchMenu(item.children, item.id); } }); }; /** * [setMenuTogglesListeners description] * \@method setMenuTogglesListeners * @return {?} */ SidebarLeftComponent.prototype.setMenuTogglesListeners = /** * [setMenuTogglesListeners description] * \@method setMenuTogglesListeners * @return {?} */ function () { var _this = this; this.toggleListeners = removeListeners(this.toggleListeners); this.ngZone.runOutsideAngular(function () { _this.sidebarLeftToggleDirectives.forEach(function (menuToggle) { _this.toggleListeners.push(_this.renderer2.listen(menuToggle.elementRef.nativeElement, 'click', function (event) { event.preventDefault(); if (menuToggle.item.isCollapsed) { _this.collapsedItems.forEach(function (item) { if (!item.disableCollapse) { item.isCollapsed = true; } }); _this.collapsedItems = []; _this.uncollapseItemParents(menuToggle.item); } else { menuToggle.item.isCollapsed = !menuToggle.item.isCollapsed; } _this.changeDetectorRef.detectChanges(); })); }); }); }; /** * [checkMenuWithoutChildren description] * \@method checkMenuWithoutChildren * @return {?} */ SidebarLeftComponent.prototype.checkMenuWithoutChildren = /** * [checkMenuWithoutChildren description] * \@method checkMenuWithoutChildren * @return {?} */ function () { var _this = this; var /** @type {?} */ menuHaveChildren; this.menu.forEach(function (item) { if (item.children) { return menuHaveChildren = true; } }); if (!menuHaveChildren) { this.ngZone.runOutsideAngular(function () { setTimeout(function () { _this.layoutStore.setSidebarLeftElementHeight(_this.sidebarElement.nativeElement.offsetHeight); }); }); } }; /** * [setSidebarHeight description] * \@method setSidebarHeight * @return {?} */ SidebarLeftComponent.prototype.setSidebarHeight = /** * [setSidebarHeight description] * \@method setSidebarHeight * @return {?} */ function () { if (this.layout === 'fixed') { var /** @type {?} */ height = this.windowInnerHeight - this.headerService.offsetHeight; if (height && height !== this.sidebarHeight) { this.sidebarHeight = height; this.sidebarOverflow = 'auto'; this.changeDetectorRef.detectChanges(); } } else if (this.sidebarHeight) { this.sidebarOverflow = this.sidebarHeight = null; this.changeDetectorRef.detectChanges(); } }; SidebarLeftComponent.decorators = [ { type: Component, args: [{ selector: 'mk-layout-sidebar-left', template: "<aside class=\"main-sidebar\">\n <section class=\"sidebar\" #sidebarElement [style.height.px]=\"sidebarHeight\" [style.overflow]=\"sidebarOverflow\">\n <ng-content></ng-content>\n \t<ul class=\"sidebar-menu\">\n <ng-container *ngFor=\"let item of menu\">\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\n </ng-container>\n \t</ul>\n </section>\n</aside>\n\n<ng-template #sidebarInner let-item=\"item\">\n <li [class.active]=\"item.isActive\" [class.header]=\"item.separator\" [class.menu-open]=\"!item.isCollapsed\">\n <span *ngIf=\"item.separator\">{{item.label}}</span>\n <a *ngIf=\"!item.separator && item.route\" [routerLink]=\"item.route\">\n \t<i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\n \t<span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\n \t\t<span *ngFor=\"let rightItem of item.pullRights\" class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\n \t <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\n \t</span>\n </a>\n <a *ngIf=\"!item.separator && !item.route\" href=\"#\" [mkMenuToggle]=\"item\">\n \t<i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\n \t<span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\n \t\t<span *ngFor=\"let rightItem of item.pullRights\" class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\n \t <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\n \t</span>\n </a>\n <ul *ngIf=\"item.children\" [collapseAnimation]=\"item.isCollapsed\" (collapseAnimation.start)=\"visibilityStateStart($event)\" class=\"treeview-menu\">\n <ng-container *ngFor=\"let item of item.children\">\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\n </ng-container>\n </ul>\n </li>\n</ng-template>\n", styles: [".treeview-menu.collapse{display:none}.treeview-menu,.treeview-menu.collapse.in{display:block}"], changeDetection: ChangeDetectionStrategy.OnPush },] }, ]; /** @nocollapse */ SidebarLeftComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef, }, { type: LayoutStore, }, { type: NgZone, }, { type: Renderer2, }, { type: Router, }, { type: RoutingService, }, { type: WrapperService, }, { type: HeaderService, }, ]; }; SidebarLeftComponent.propDecorators = { "sidebarElement": [{ type: ViewChild, args: ['sidebarElement',] },], "sidebarLeftToggleDirectives": [{ type: ViewChildren, args: [SidebarLeftToggleDirective,] },], }; return SidebarLeftComponent; }()); export { SidebarLeftComponent }; function SidebarLeftComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ SidebarLeftComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ SidebarLeftComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ SidebarLeftComponent.propDecorators; /** @type {?} */ SidebarLeftComponent.prototype.menu; /** @type {?} */ SidebarLeftComponent.prototype.sidebarHeight; /** @type {?} */ SidebarLeftComponent.prototype.sidebarOverflow; /** @type {?} */ SidebarLeftComponent.prototype.layout; /** @type {?} */ SidebarLeftComponent.prototype.isSidebarLeftCollapsed; /** @type {?} */ SidebarLeftComponent.prototype.isSidebarLeftExpandOnOver; /** @type {?} */ SidebarLeftComponent.prototype.isSidebarLeftMouseOver; /** @type {?} */ SidebarLeftComponent.prototype.windowInnerWidth; /** @type {?} */ SidebarLeftComponent.prototype.windowInnerHeight; /** @type {?} */ SidebarLeftComponent.prototype.collapsedItems; /** @type {?} */ SidebarLeftComponent.prototype.activatedItems; /** @type {?} */ SidebarLeftComponent.prototype.toggleListeners; /** @type {?} */ SidebarLeftComponent.prototype.listeners; /** @type {?} */ SidebarLeftComponent.prototype.itemsByIds; /** @type {?} */ SidebarLeftComponent.prototype.runningAnimations; /** @type {?} */ SidebarLeftComponent.prototype.subscriptions; /** @type {?} */ SidebarLeftComponent.prototype.activeUrl; /** @type {?} */ SidebarLeftComponent.prototype.initialized; /** @type {?} */ SidebarLeftComponent.prototype.sidebarElement; /** @type {?} */ SidebarLeftComponent.prototype.sidebarLeftToggleDirectives; /** @type {?} */ SidebarLeftComponent.prototype.changeDetectorRef; /** @type {?} */ SidebarLeftComponent.prototype.layoutStore; /** @type {?} */ SidebarLeftComponent.prototype.ngZone; /** @type {?} */ SidebarLeftComponent.prototype.renderer2; /** @type {?} */ SidebarLeftComponent.prototype.router; /** @type {?} */ SidebarLeftComponent.prototype.routingService; /** @type {?} */ SidebarLeftComponent.prototype.wrapperService; /** @type {?} */ SidebarLeftComponent.prototype.headerService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1sZWZ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYWRtaW4tbHRlLXRlbGlxby8iLCJzb3VyY2VzIjpbImxpYi9sYXlvdXQvc2lkZWJhci1sZWZ0L3NpZGViYXItbGVmdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFNUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0ZsRTs7Ozs7Ozs7OztPQVVHO0lBQ0gsOEJBQ1UsbUJBQ0EsYUFDQSxRQUNBLFdBQ0EsUUFDQSxnQkFDQSxnQkFDQTtRQVBBLHNCQUFpQixHQUFqQixpQkFBaUI7UUFDakIsZ0JBQVcsR0FBWCxXQUFXO1FBQ1gsV0FBTSxHQUFOLE1BQU07UUFDTixjQUFTLEdBQVQsU0FBUztRQUNULFdBQU0sR0FBTixNQUFNO1FBQ04sbUJBQWMsR0FBZCxjQUFjO1FBQ2QsbUJBQWMsR0FBZCxjQUFjO1FBQ2Qsa0JBQWEs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O2FBQ3hDO1NBQ0Y7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7OztnQkFuYUosU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFFBQVEsRUFBRSx3N0RBbUNYO29CQUNDLE1BQU0sRUFBRSxDQUFDLCtGQUErRixDQUFDO29CQUN6RyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7Ozs7Z0JBL0VDLGlCQUFpQjtnQkFrQlgsV0FBVztnQkFmakIsTUFBTTtnQkFJTixTQUFTO2dCQUlrRCxNQUFNO2dCQUUzRCxjQUFjO2dCQUVkLGNBQWM7Z0JBQ2QsYUFBYTs7O21DQXFGbEIsU0FBUyxTQUFDLGdCQUFnQjtnREFFMUIsWUFBWSxTQUFDLDBCQUEwQjs7K0JBMUcxQzs7U0FtRmEsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RXZlbnQgYXMgUm91dGVyRXZlbnQsIE5hdmlnYXRpb25FbmQsIFBSSU1BUllfT1VUTEVULCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7Um91dGluZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JvdXRpbmcuc2VydmljZSc7XG5cbmltcG9ydCB7V3JhcHBlclNlcnZpY2V9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBlci5zZXJ2aWNlJztcbmltcG9ydCB7SGVhZGVyU2VydmljZX0gZnJvbSAnLi4vaGVhZGVyL2hlYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHtMYXlvdXRTdG9yZX0gZnJvbSAnLi4vbGF5b3V0LnN0b3JlJztcblxuaW1wb3J0IHtBbmltYXRpb25FdmVudH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9hbmltYXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge3JlbW92ZUxpc3RlbmVycywgcmVtb3ZlU3Vic2NyaXB0aW9uc30gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cbmltcG9ydCB7U2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmV9IGZyb20gJy4vc2lkZWJhci1sZWZ0LmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbSB7XG4gIGlkOiBudW1iZXI7XG4gIHBhcmVudElkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJvdXRlPzogc3RyaW5nO1xuICBpY29uQ2xhc3Nlcz86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBBcnJheTxJdGVtPjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBpc0NvbGxhcHNlZD86IGJvb2xlYW47XG4gIGRpc2FibGVDb2xsYXBzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEl0ZW1zID0gQXJyYXk8SXRlbT47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLWxheW91dC1zaWRlYmFyLWxlZnQnLFxuICB0ZW1wbGF0ZTogYDxhc2lkZSBjbGFzcz1cIm1haW4tc2lkZWJhclwiPlxuICA8c2VjdGlvbiBjbGFzcz1cInNpZGViYXJcIiAjc2lkZWJhckVsZW1lbnQgW3N0eWxlLmhlaWdodC5weF09XCJzaWRlYmFySGVpZ2h0XCIgW3N0eWxlLm92ZXJmbG93XT1cInNpZGViYXJPdmVyZmxvd1wiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgXHQ8dWwgY2xhc3M9XCJzaWRlYmFyLW1lbnVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWVudVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2lkZWJhcklubmVyOyBjb250ZXh0OiB7aXRlbTogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICBcdDwvdWw+XG4gIDwvc2VjdGlvbj5cbjwvYXNpZGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2lkZWJhcklubmVyIGxldC1pdGVtPVwiaXRlbVwiPlxuICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJpdGVtLmlzQWN0aXZlXCIgW2NsYXNzLmhlYWRlcl09XCJpdGVtLnNlcGFyYXRvclwiIFtjbGFzcy5tZW51LW9wZW5dPVwiIWl0ZW0uaXNDb2xsYXBzZWRcIj5cbiAgICA8c3BhbiAqbmdJZj1cIml0ZW0uc2VwYXJhdG9yXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XG4gICAgPGEgKm5nSWY9XCIhaXRlbS5zZXBhcmF0b3IgJiYgaXRlbS5yb3V0ZVwiIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVcIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhICpuZ0lmPVwiIWl0ZW0uc2VwYXJhdG9yICYmICFpdGVtLnJvdXRlXCIgaHJlZj1cIiNcIiBbbWtNZW51VG9nZ2xlXT1cIml0ZW1cIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDx1bCAqbmdJZj1cIml0ZW0uY2hpbGRyZW5cIiBbY29sbGFwc2VBbmltYXRpb25dPVwiaXRlbS5pc0NvbGxhcHNlZFwiIChjb2xsYXBzZUFuaW1hdGlvbi5zdGFydCk9XCJ2aXNpYmlsaXR5U3RhdGVTdGFydCgkZXZlbnQpXCIgY2xhc3M9XCJ0cmVldmlldy1tZW51XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNpZGViYXJJbm5lcjsgY29udGV4dDoge2l0ZW06IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3VsPlxuICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbmAsXG4gIHN0eWxlczogW2AudHJlZXZpZXctbWVudS5jb2xsYXBzZXtkaXNwbGF5Om5vbmV9LnRyZWV2aWV3LW1lbnUsLnRyZWV2aWV3LW1lbnUuY29sbGFwc2UuaW57ZGlzcGxheTpibG9ja31gXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU2lkZWJhckxlZnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBtZW51OiBBcnJheTxhbnk+O1xuICBwdWJsaWMgc2lkZWJhckhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgc2lkZWJhck92ZXJmbG93OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpc1NpZGViYXJMZWZ0Q29sbGFwc2VkOiBib29sZWFuO1xuICBwcml2YXRlIGlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgaXNTaWRlYmFyTGVmdE1vdXNlT3ZlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3aW5kb3dJbm5lcldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgd2luZG93SW5uZXJIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xsYXBzZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSB0b2dnbGVMaXN0ZW5lcnM6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIHByaXZhdGUgaXRlbXNCeUlkczoge1twcm9wS2V5OiBudW1iZXJdOiBJdGVtfSA9IHt9O1xuICBwcml2YXRlIHJ1bm5pbmdBbmltYXRpb25zID0gMDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gW107XG4gIHByaXZhdGUgYWN0aXZlVXJsOiBTdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgQFZpZXdDaGlsZCgnc2lkZWJhckVsZW1lbnQnKSBwdWJsaWMgc2lkZWJhckVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihTaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZSkgcHVibGljIHNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PFNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogQG1ldGhvZCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gIGNoYW5nZURldGVjdG9yUmVmICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgbGF5b3V0U3RvcmUgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICBuZ1pvbmUgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHJlbmRlcmVyMiAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgcm91dGVyICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICByb3V0aW5nU2VydmljZSAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHdyYXBwZXJTZXJ2aWNlICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgaGVhZGVyU2VydmljZSAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbGF5b3V0U3RvcmU6IExheW91dFN0b3JlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgd3JhcHBlclNlcnZpY2U6IFdyYXBwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVhZGVyU2VydmljZTogSGVhZGVyU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdPbkluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51LnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLm1lbnUgPSB2YWx1ZTtcbiAgICAgIHRoaXMubW9ua2V5UGF0Y2hNZW51KHRoaXMubWVudSk7XG4gICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnNldE1lbnVMaXN0ZW5lcnModGhpcy5hY3RpdmVVcmwpO1xuICAgICAgICB0aGlzLnNldFNpZGViYXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51QWN0aXZlVXJsLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZVVybCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRNZW51TGlzdGVuZXJzKHZhbHVlKTtcbiAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5yb3V0aW5nU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVVcmwgPSBldmVudC51cmw7XG4gICAgICAgIHRoaXMuc2V0TWVudUxpc3RlbmVycyhldmVudC51cmwpO1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIHRoaXMuc2V0U2lkZWJhckxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgIHRoaXMuY2hlY2tNZW51V2l0aG91dENoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gcmVtb3ZlU3Vic2NyaXB0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbnMpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICB0aGlzLnRvZ2dsZUxpc3RlbmVycyA9IHJlbW92ZUxpc3RlbmVycyh0aGlzLnRvZ2dsZUxpc3RlbmVycyk7XG4gIH1cblxuICAvKipcbiAgICogW3NldFNpZGViYXJMaXN0ZW5lcnMgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0U2lkZWJhckxpc3RlbmVyc1xuICAgKi9cbiAgc2V0U2lkZWJhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmxheW91dC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubGF5b3V0ID0gdmFsdWU7XG4gICAgICB0aGlzLnNldFNpZGViYXJIZWlnaHQoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLndpbmRvd0lubmVySGVpZ2h0LnN1YnNjcmliZSgodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy53aW5kb3dJbm5lckhlaWdodCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRTaWRlYmFySGVpZ2h0KCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1lbnUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKHRoaXMuc2lkZWJhckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNb3VzZU92ZXIodHJ1ZSk7XG4gICAgICB9KSk7XG4gICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0TW91c2VPdmVyKGZhbHNlKTtcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUud2luZG93SW5uZXJXaWR0aC5zdWJzY3JpYmUoKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMud2luZG93SW5uZXJXaWR0aCA9IHZhbHVlO1xuICAgICAgaWYgKCF0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgJiYgdGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPiA3NjcgJiYgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkICYmICF0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0TW91c2VPdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdE1vdXNlT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKCF2YWx1ZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMud2luZG93SW5uZXJXaWR0aCA+IDc2NyAmJiB0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkID0gdmFsdWU7XG4