UNPKG

angular-admin-lte-teliqo

Version:
525 lines (523 loc) 56.5 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; } export class SidebarLeftComponent { /** * \@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] */ constructor(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 * @return {?} */ ngOnInit() { this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(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(value => { this.activeUrl = value; this.setMenuListeners(value); })); this.subscriptions.push(this.routingService.events.subscribe((event) => { if (event instanceof NavigationEnd) { this.activeUrl = event.url; this.setMenuListeners(event.url); } })); this.setSidebarListeners(); } /** * \@method ngAfterViewInit * @return {?} */ ngAfterViewInit() { this.setMenuTogglesListeners(); this.checkMenuWithoutChildren(); } /** * \@method ngOnDestroy * @return {?} */ ngOnDestroy() { this.subscriptions = removeSubscriptions(this.subscriptions); this.listeners = removeListeners(this.listeners); this.toggleListeners = removeListeners(this.toggleListeners); } /** * [setSidebarListeners description] * \@method setSidebarListeners * @return {?} */ setSidebarListeners() { this.subscriptions.push(this.layoutStore.layout.subscribe((value) => { this.layout = value; this.setSidebarHeight(); })); this.subscriptions.push(this.layoutStore.windowInnerHeight.subscribe((value) => { this.windowInnerHeight = value; this.setSidebarHeight(); })); this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(() => { this.changeDetectorRef.detectChanges(); })); this.ngZone.runOutsideAngular(() => { this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseenter', () => { this.layoutStore.sidebarLeftMouseOver(true); })); this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseleave', () => { this.layoutStore.sidebarLeftMouseOver(false); })); }); this.subscriptions.push(this.layoutStore.windowInnerWidth.subscribe((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((value) => { this.isSidebarLeftMouseOver = value; if (this.isSidebarLeftExpandOnOver) { this.layoutStore.sidebarLeftCollapsed(!value); } })); this.subscriptions.push(this.layoutStore.isSidebarLeftExpandOnOver.subscribe((value) => { this.isSidebarLeftExpandOnOver = value; if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed !== undefined) { this.layoutStore.sidebarLeftCollapsed(value); } })); this.subscriptions.push(this.layoutStore.isSidebarLeftCollapsed.subscribe((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((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 * @param {?} url * @return {?} */ setMenuListeners(url) { if (url === '/') { this.activeItems(url); this.changeDetectorRef.detectChanges(); } else { const /** @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] */ getIconClasses(item) { if (item.iconClasses || item.iconClasses === '') { return item.iconClasses; } else { return 'fa fa-circle-o'; } } /** * [visibilityStateStart description] * \@method visibilityStateStart * @param {?} event [description] * @return {?} */ visibilityStateStart(event) { this.runningAnimations++; this.ngZone.runOutsideAngular(() => { setTimeout(() => { 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 {?} */ uncollapseItemParents(item, 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] */ findItemsByUrl(url, items, returnItems = []) { items.forEach((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 {?} */ activeItems(url) { this.activatedItems.forEach((item) => { item.isActive = false; }); this.activatedItems = []; this.collapsedItems.forEach((item) => { item.isActive = false; item.isCollapsed = true; }); this.collapsedItems = []; const /** @type {?} */ items = this.findItemsByUrl(url, this.menu); items.forEach(item => { item.isActive = true; this.uncollapseItemParents(item, true); this.activatedItems.push(item); }); } /** * [monkeyPatchMenu description] * \@method monkeyPatchMenu * @param {?} items [description] * @param {?=} parentId [description] * @return {?} */ monkeyPatchMenu(items, parentId) { items.forEach((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 {?} */ setMenuTogglesListeners() { this.toggleListeners = removeListeners(this.toggleListeners); this.ngZone.runOutsideAngular(() => { this.sidebarLeftToggleDirectives.forEach((menuToggle) => { this.toggleListeners.push(this.renderer2.listen(menuToggle.elementRef.nativeElement, 'click', (event) => { event.preventDefault(); if (menuToggle.item.isCollapsed) { this.collapsedItems.forEach((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 {?} */ checkMenuWithoutChildren() { let /** @type {?} */ menuHaveChildren; this.menu.forEach((item) => { if (item.children) { return menuHaveChildren = true; } }); if (!menuHaveChildren) { this.ngZone.runOutsideAngular(() => { setTimeout(() => { this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight); }); }); } } /** * [setSidebarHeight description] * \@method setSidebarHeight * @return {?} */ setSidebarHeight() { if (this.layout === 'fixed') { const /** @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"> <section class="sidebar" #sidebarElement [style.height.px]="sidebarHeight" [style.overflow]="sidebarOverflow"> <ng-content></ng-content> <ul class="sidebar-menu"> <ng-container *ngFor="let item of menu"> <ng-container *ngTemplateOutlet="sidebarInner; context: {item: item}"></ng-container> </ng-container> </ul> </section> </aside> <ng-template #sidebarInner let-item="item"> <li [class.active]="item.isActive" [class.header]="item.separator" [class.menu-open]="!item.isCollapsed"> <span *ngIf="item.separator">{{item.label}}</span> <a *ngIf="!item.separator && item.route" [routerLink]="item.route"> <i [class]="getIconClasses(item)"></i><span>{{item.label}}</span> <span *ngIf="item.children || item.pullRights" class="pull-right-container"> <span *ngFor="let rightItem of item.pullRights" class="pull-right {{rightItem.classes}}">{{rightItem.text}}</span> <i *ngIf="!item.pullRights" class="fa fa-angle-left pull-right"></i> </span> </a> <a *ngIf="!item.separator && !item.route" href="#" [mkMenuToggle]="item"> <i [class]="getIconClasses(item)"></i><span>{{item.label}}</span> <span *ngIf="item.children || item.pullRights" class="pull-right-container"> <span *ngFor="let rightItem of item.pullRights" class="pull-right {{rightItem.classes}}">{{rightItem.text}}</span> <i *ngIf="!item.pullRights" class="fa fa-angle-left pull-right"></i> </span> </a> <ul *ngIf="item.children" [collapseAnimation]="item.isCollapsed" (collapseAnimation.start)="visibilityStateStart($event)" class="treeview-menu"> <ng-container *ngFor="let item of item.children"> <ng-container *ngTemplateOutlet="sidebarInner; context: {item: item}"></ng-container> </ng-container> </ul> </li> </ng-template> `, styles: [`.treeview-menu.collapse{display:none}.treeview-menu,.treeview-menu.collapse.in{display:block}`], changeDetection: ChangeDetectionStrategy.OnPush },] }, ]; /** @nocollapse */ SidebarLeftComponent.ctorParameters = () => [ { 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,] },], }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1sZWZ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYWRtaW4tbHRlLXRlbGlxby8iLCJzb3VyY2VzIjpbImxpYi9sYXlvdXQvc2lkZWJhci1sZWZ0L3NpZGViYXItbGVmdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFNUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5RHBFLE1BQU07Ozs7Ozs7Ozs7OztJQW9DSixZQUNVLG1CQUNBLGFBQ0EsUUFDQSxXQUNBLFFBQ0EsZ0JBQ0EsZ0JBQ0E7UUFQQSxzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVztRQUNYLFdBQU0sR0FBTixNQUFNO1FBQ04sY0FBUyxHQUFULFNBQVM7UUFDVCxXQUFNLEdBQU4sTUFBTTtRQUNOLG1CQUFjLEdBQWQsY0FBYztRQUNkLG1CQUFjLEdBQWQsY0FBYztRQUNkLGtCQUFh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QkFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3hDO1NBQ0Y7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7Ozs7WUFuYUosU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx3QkFBd0I7Z0JBQ2xDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQ1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsK0ZBQStGLENBQUM7Z0JBQ3pHLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7O1lBL0VDLGlCQUFpQjtZQWtCWCxXQUFXO1lBZmpCLE1BQU07WUFJTixTQUFTO1lBSWtELE1BQU07WUFFM0QsY0FBYztZQUVkLGNBQWM7WUFDZCxhQUFhOzs7K0JBcUZsQixTQUFTLFNBQUMsZ0JBQWdCOzRDQUUxQixZQUFZLFNBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RXZlbnQgYXMgUm91dGVyRXZlbnQsIE5hdmlnYXRpb25FbmQsIFBSSU1BUllfT1VUTEVULCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7Um91dGluZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JvdXRpbmcuc2VydmljZSc7XG5cbmltcG9ydCB7V3JhcHBlclNlcnZpY2V9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBlci5zZXJ2aWNlJztcbmltcG9ydCB7SGVhZGVyU2VydmljZX0gZnJvbSAnLi4vaGVhZGVyL2hlYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHtMYXlvdXRTdG9yZX0gZnJvbSAnLi4vbGF5b3V0LnN0b3JlJztcblxuaW1wb3J0IHtBbmltYXRpb25FdmVudH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9hbmltYXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge3JlbW92ZUxpc3RlbmVycywgcmVtb3ZlU3Vic2NyaXB0aW9uc30gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cbmltcG9ydCB7U2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmV9IGZyb20gJy4vc2lkZWJhci1sZWZ0LmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbSB7XG4gIGlkOiBudW1iZXI7XG4gIHBhcmVudElkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJvdXRlPzogc3RyaW5nO1xuICBpY29uQ2xhc3Nlcz86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBBcnJheTxJdGVtPjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBpc0NvbGxhcHNlZD86IGJvb2xlYW47XG4gIGRpc2FibGVDb2xsYXBzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEl0ZW1zID0gQXJyYXk8SXRlbT47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLWxheW91dC1zaWRlYmFyLWxlZnQnLFxuICB0ZW1wbGF0ZTogYDxhc2lkZSBjbGFzcz1cIm1haW4tc2lkZWJhclwiPlxuICA8c2VjdGlvbiBjbGFzcz1cInNpZGViYXJcIiAjc2lkZWJhckVsZW1lbnQgW3N0eWxlLmhlaWdodC5weF09XCJzaWRlYmFySGVpZ2h0XCIgW3N0eWxlLm92ZXJmbG93XT1cInNpZGViYXJPdmVyZmxvd1wiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgXHQ8dWwgY2xhc3M9XCJzaWRlYmFyLW1lbnVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWVudVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2lkZWJhcklubmVyOyBjb250ZXh0OiB7aXRlbTogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICBcdDwvdWw+XG4gIDwvc2VjdGlvbj5cbjwvYXNpZGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2lkZWJhcklubmVyIGxldC1pdGVtPVwiaXRlbVwiPlxuICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJpdGVtLmlzQWN0aXZlXCIgW2NsYXNzLmhlYWRlcl09XCJpdGVtLnNlcGFyYXRvclwiIFtjbGFzcy5tZW51LW9wZW5dPVwiIWl0ZW0uaXNDb2xsYXBzZWRcIj5cbiAgICA8c3BhbiAqbmdJZj1cIml0ZW0uc2VwYXJhdG9yXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XG4gICAgPGEgKm5nSWY9XCIhaXRlbS5zZXBhcmF0b3IgJiYgaXRlbS5yb3V0ZVwiIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVcIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhICpuZ0lmPVwiIWl0ZW0uc2VwYXJhdG9yICYmICFpdGVtLnJvdXRlXCIgaHJlZj1cIiNcIiBbbWtNZW51VG9nZ2xlXT1cIml0ZW1cIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDx1bCAqbmdJZj1cIml0ZW0uY2hpbGRyZW5cIiBbY29sbGFwc2VBbmltYXRpb25dPVwiaXRlbS5pc0NvbGxhcHNlZFwiIChjb2xsYXBzZUFuaW1hdGlvbi5zdGFydCk9XCJ2aXNpYmlsaXR5U3RhdGVTdGFydCgkZXZlbnQpXCIgY2xhc3M9XCJ0cmVldmlldy1tZW51XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNpZGViYXJJbm5lcjsgY29udGV4dDoge2l0ZW06IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3VsPlxuICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbmAsXG4gIHN0eWxlczogW2AudHJlZXZpZXctbWVudS5jb2xsYXBzZXtkaXNwbGF5Om5vbmV9LnRyZWV2aWV3LW1lbnUsLnRyZWV2aWV3LW1lbnUuY29sbGFwc2UuaW57ZGlzcGxheTpibG9ja31gXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU2lkZWJhckxlZnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBtZW51OiBBcnJheTxhbnk+O1xuICBwdWJsaWMgc2lkZWJhckhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgc2lkZWJhck92ZXJmbG93OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpc1NpZGViYXJMZWZ0Q29sbGFwc2VkOiBib29sZWFuO1xuICBwcml2YXRlIGlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgaXNTaWRlYmFyTGVmdE1vdXNlT3ZlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3aW5kb3dJbm5lcldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgd2luZG93SW5uZXJIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xsYXBzZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSB0b2dnbGVMaXN0ZW5lcnM6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIHByaXZhdGUgaXRlbXNCeUlkczoge1twcm9wS2V5OiBudW1iZXJdOiBJdGVtfSA9IHt9O1xuICBwcml2YXRlIHJ1bm5pbmdBbmltYXRpb25zID0gMDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gW107XG4gIHByaXZhdGUgYWN0aXZlVXJsOiBTdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgQFZpZXdDaGlsZCgnc2lkZWJhckVsZW1lbnQnKSBwdWJsaWMgc2lkZWJhckVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihTaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZSkgcHVibGljIHNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PFNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogQG1ldGhvZCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gIGNoYW5nZURldGVjdG9yUmVmICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgbGF5b3V0U3RvcmUgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICBuZ1pvbmUgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHJlbmRlcmVyMiAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgcm91dGVyICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICByb3V0aW5nU2VydmljZSAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHdyYXBwZXJTZXJ2aWNlICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgaGVhZGVyU2VydmljZSAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbGF5b3V0U3RvcmU6IExheW91dFN0b3JlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgd3JhcHBlclNlcnZpY2U6IFdyYXBwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVhZGVyU2VydmljZTogSGVhZGVyU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdPbkluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51LnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLm1lbnUgPSB2YWx1ZTtcbiAgICAgIHRoaXMubW9ua2V5UGF0Y2hNZW51KHRoaXMubWVudSk7XG4gICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnNldE1lbnVMaXN0ZW5lcnModGhpcy5hY3RpdmVVcmwpO1xuICAgICAgICB0aGlzLnNldFNpZGViYXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51QWN0aXZlVXJsLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZVVybCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRNZW51TGlzdGVuZXJzKHZhbHVlKTtcbiAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5yb3V0aW5nU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVVcmwgPSBldmVudC51cmw7XG4gICAgICAgIHRoaXMuc2V0TWVudUxpc3RlbmVycyhldmVudC51cmwpO1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIHRoaXMuc2V0U2lkZWJhckxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgIHRoaXMuY2hlY2tNZW51V2l0aG91dENoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gcmVtb3ZlU3Vic2NyaXB0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbnMpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICB0aGlzLnRvZ2dsZUxpc3RlbmVycyA9IHJlbW92ZUxpc3RlbmVycyh0aGlzLnRvZ2dsZUxpc3RlbmVycyk7XG4gIH1cblxuICAvKipcbiAgICogW3NldFNpZGViYXJMaXN0ZW5lcnMgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0U2lkZWJhckxpc3RlbmVyc1xuICAgKi9cbiAgc2V0U2lkZWJhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmxheW91dC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubGF5b3V0ID0gdmFsdWU7XG4gICAgICB0aGlzLnNldFNpZGViYXJIZWlnaHQoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLndpbmRvd0lubmVySGVpZ2h0LnN1YnNjcmliZSgodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy53aW5kb3dJbm5lckhlaWdodCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRTaWRlYmFySGVpZ2h0KCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1lbnUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKHRoaXMuc2lkZWJhckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNb3VzZU92ZXIodHJ1ZSk7XG4gICAgICB9KSk7XG4gICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0TW91c2VPdmVyKGZhbHNlKTtcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUud2luZG93SW5uZXJXaWR0aC5zdWJzY3JpYmUoKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMud2luZG93SW5uZXJXaWR0aCA9IHZhbHVlO1xuICAgICAgaWYgKCF0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgJiYgdGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPiA3NjcgJiYgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkICYmICF0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0TW91c2VPdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdE1vdXNlT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKCF2YWx1ZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMud2luZG93SW5uZXJXaWR0aCA+IDc2NyAmJiB0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlciAmJiAhdGhpcy5pc1NpZGViYXJMZWZ0TW91c2VPdmVyICYmICF2YWx1ZSkge1xuICAgICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRFeHBhbmRPbk92ZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIyLmFkZENsYXNzKHRoaXMud3JhcHBlclNlcnZpY2Uud3JhcHBlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NpZGViYXItY29sbGFwc2UnKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNsYXNzKHRoaXMud3JhcHBlclNlcnZpY2Uud3JhcHBlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NpZGViYXItY29sbGFwc2UnKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0TWluaS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3ModGhpcy53cmFwcGVyU2VydmljZS53cmFwcGVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2lkZWJhci1taW5pJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW1pbmknKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogW3NldE1lbnVMaXN0ZW5lcnMgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0TWVudUxpc3RlbmVyc1xuICAgKi9cbiAgc2V0TWVudUxpc3RlbmVycyh1cmwpOiB2b2lkIHtcbiAgICBpZiAodXJsID09PSAnLycpIHtcbiAgICAgIHRoaXMuYWN0aXZlSXRlbXModXJsKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmltYXJ5T3V0bGV0ID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodXJsKS5yb290LmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXTtcbiAgICAgIGlmIChwcmltYXJ5T3V0bGV0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbXMocHJpbWFyeU91dGxldC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPD0gNzY3IHx8IHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xuICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW2dldEljb25DbGFzc2VzIGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIGdldEljb25DbGFzc2VzXG4gICAqIEBwYXJhbSBpdGVtIFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBwdWJsaWMgZ2V0SWNvbkNsYXNzZXMoaXRlbTogSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW0uaWNvbkNsYXNzZXMgfHwgaXRlbS5pY29uQ2xhc3NlcyA9PT0gJycpIHtcbiAgICAgIHJldHVybiBpdGVtLmljb25DbGFzc2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ZhIGZhLWNpcmNsZS1vJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3Zpc2liaWxpdHlTdGF0ZVN0YXJ0IGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIHZpc2liaWxpdHlTdGF0ZVN0YXJ0XG4gICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBwdWJsaWMgdmlzaWJpbGl0eVN0YXRlU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ydW5uaW5nQW5pbWF0aW9ucyArKztcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWx