angular-admin-lte-teliqo
Version:
npm# angular-admin-lte
597 lines (596 loc) • 60.1 kB
JavaScript
/**
* @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