UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

350 lines (348 loc) 43.9 kB
import { __decorate } from "tslib"; import { CdkOverlayOrigin } from '@angular/cdk/overlay'; import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Host, Inject, Input, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { combineLatest, merge, Subject } from 'rxjs'; import { map, startWith, switchMap, takeUntil } from 'rxjs/operators'; import { getPlacementName, POSITION_MAP } from 'ng-zorro-antd/core/overlay'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { NzMenuItemComponent } from './menu-item.component'; import { NzIsMenuInsideDropDownToken } from './menu.token'; import { NzSubmenuService } from './submenu.service'; import * as i0 from "@angular/core"; import * as i1 from "./menu.service"; import * as i2 from "./submenu.service"; import * as i3 from "@angular/cdk/platform"; import * as i4 from "@angular/cdk/bidi"; import * as i5 from "ng-zorro-antd/core/no-animation"; import * as i6 from "@angular/common"; import * as i7 from "@angular/cdk/overlay"; import * as i8 from "./submenu-title.component"; import * as i9 from "./submenu-inline-child.component"; import * as i10 from "./submenu-non-inline-child.component"; const listOfVerticalPositions = [ POSITION_MAP.rightTop, POSITION_MAP.right, POSITION_MAP.rightBottom, POSITION_MAP.leftTop, POSITION_MAP.left, POSITION_MAP.leftBottom ]; const listOfHorizontalPositions = [ POSITION_MAP.bottomLeft, POSITION_MAP.bottomRight, POSITION_MAP.topRight, POSITION_MAP.topLeft ]; export class NzSubMenuComponent { /** set the submenu host open status directly **/ setOpenStateWithoutDebounce(open) { this.nzSubmenuService.setOpenStateWithoutDebounce(open); } toggleSubMenu() { this.setOpenStateWithoutDebounce(!this.nzOpen); } setMouseEnterState(value) { this.isActive = value; if (this.mode !== 'inline') { this.nzSubmenuService.setMouseEnterTitleOrOverlayState(value); } } setTriggerWidth() { if (this.mode === 'horizontal' && this.platform.isBrowser && this.cdkOverlayOrigin && this.nzPlacement === 'bottomLeft') { /** TODO: fast dom **/ this.triggerWidth = this.cdkOverlayOrigin.nativeElement.getBoundingClientRect().width; } } onPositionChange(position) { const placement = getPlacementName(position); if (placement === 'rightTop' || placement === 'rightBottom' || placement === 'right') { this.position = 'right'; } else if (placement === 'leftTop' || placement === 'leftBottom' || placement === 'left') { this.position = 'left'; } } constructor(nzMenuService, cdr, nzSubmenuService, platform, isMenuInsideDropDown, directionality, noAnimation) { this.nzMenuService = nzMenuService; this.cdr = cdr; this.nzSubmenuService = nzSubmenuService; this.platform = platform; this.isMenuInsideDropDown = isMenuInsideDropDown; this.directionality = directionality; this.noAnimation = noAnimation; this.nzMenuClassName = ''; this.nzPaddingLeft = null; this.nzTitle = null; this.nzIcon = null; this.nzOpen = false; this.nzDisabled = false; this.nzPlacement = 'bottomLeft'; this.nzOpenChange = new EventEmitter(); this.cdkOverlayOrigin = null; // fix errors about circular dependency // Can't construct a query for the property ... since the query selector wasn't defined" this.listOfNzSubMenuComponent = null; this.listOfNzMenuItemDirective = null; this.level = this.nzSubmenuService.level; this.destroy$ = new Subject(); this.position = 'right'; this.triggerWidth = null; this.theme = 'light'; this.mode = 'vertical'; this.inlinePaddingLeft = null; this.overlayPositions = listOfVerticalPositions; this.isSelected = false; this.isActive = false; this.dir = 'ltr'; } ngOnInit() { /** submenu theme update **/ this.nzMenuService.theme$.pipe(takeUntil(this.destroy$)).subscribe(theme => { this.theme = theme; this.cdr.markForCheck(); }); /** submenu mode update **/ this.nzSubmenuService.mode$.pipe(takeUntil(this.destroy$)).subscribe(mode => { this.mode = mode; if (mode === 'horizontal') { this.overlayPositions = [POSITION_MAP[this.nzPlacement], ...listOfHorizontalPositions]; } else if (mode === 'vertical') { this.overlayPositions = listOfVerticalPositions; } this.cdr.markForCheck(); }); /** inlineIndent update **/ combineLatest([this.nzSubmenuService.mode$, this.nzMenuService.inlineIndent$]) .pipe(takeUntil(this.destroy$)) .subscribe(([mode, inlineIndent]) => { this.inlinePaddingLeft = mode === 'inline' ? this.level * inlineIndent : null; this.cdr.markForCheck(); }); /** current submenu open status **/ this.nzSubmenuService.isCurrentSubMenuOpen$.pipe(takeUntil(this.destroy$)).subscribe(open => { this.isActive = open; if (open !== this.nzOpen) { this.setTriggerWidth(); this.nzOpen = open; this.nzOpenChange.emit(this.nzOpen); this.cdr.markForCheck(); } }); this.dir = this.directionality.value; this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; this.cdr.markForCheck(); }); } ngAfterContentInit() { this.setTriggerWidth(); const listOfNzMenuItemDirective = this.listOfNzMenuItemDirective; const changes = listOfNzMenuItemDirective.changes; const mergedObservable = merge(...[changes, ...listOfNzMenuItemDirective.map(menu => menu.selected$)]); changes .pipe(startWith(listOfNzMenuItemDirective), switchMap(() => mergedObservable), startWith(true), map(() => listOfNzMenuItemDirective.some(e => e.nzSelected)), takeUntil(this.destroy$)) .subscribe(selected => { this.isSelected = selected; this.cdr.markForCheck(); }); } ngOnChanges(changes) { const { nzOpen } = changes; if (nzOpen) { this.nzSubmenuService.setOpenStateWithoutDebounce(this.nzOpen); this.setTriggerWidth(); } } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzSubMenuComponent, deps: [{ token: i1.MenuService }, { token: i0.ChangeDetectorRef }, { token: i2.NzSubmenuService }, { token: i3.Platform }, { token: NzIsMenuInsideDropDownToken }, { token: i4.Directionality, optional: true }, { token: i5.NzNoAnimationDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: NzSubMenuComponent, selector: "[nz-submenu]", inputs: { nzMenuClassName: "nzMenuClassName", nzPaddingLeft: "nzPaddingLeft", nzTitle: "nzTitle", nzIcon: "nzIcon", nzOpen: "nzOpen", nzDisabled: "nzDisabled", nzPlacement: "nzPlacement" }, outputs: { nzOpenChange: "nzOpenChange" }, host: { properties: { "class.ant-dropdown-menu-submenu": "isMenuInsideDropDown", "class.ant-dropdown-menu-submenu-disabled": "isMenuInsideDropDown && nzDisabled", "class.ant-dropdown-menu-submenu-open": "isMenuInsideDropDown && nzOpen", "class.ant-dropdown-menu-submenu-selected": "isMenuInsideDropDown && isSelected", "class.ant-dropdown-menu-submenu-vertical": "isMenuInsideDropDown && mode === 'vertical'", "class.ant-dropdown-menu-submenu-horizontal": "isMenuInsideDropDown && mode === 'horizontal'", "class.ant-dropdown-menu-submenu-inline": "isMenuInsideDropDown && mode === 'inline'", "class.ant-dropdown-menu-submenu-active": "isMenuInsideDropDown && isActive", "class.ant-menu-submenu": "!isMenuInsideDropDown", "class.ant-menu-submenu-disabled": "!isMenuInsideDropDown && nzDisabled", "class.ant-menu-submenu-open": "!isMenuInsideDropDown && nzOpen", "class.ant-menu-submenu-selected": "!isMenuInsideDropDown && isSelected", "class.ant-menu-submenu-vertical": "!isMenuInsideDropDown && mode === 'vertical'", "class.ant-menu-submenu-horizontal": "!isMenuInsideDropDown && mode === 'horizontal'", "class.ant-menu-submenu-inline": "!isMenuInsideDropDown && mode === 'inline'", "class.ant-menu-submenu-active": "!isMenuInsideDropDown && isActive", "class.ant-menu-submenu-rtl": "dir === 'rtl'" } }, providers: [NzSubmenuService], queries: [{ propertyName: "listOfNzSubMenuComponent", predicate: i0.forwardRef(() => NzSubMenuComponent), descendants: true }, { propertyName: "listOfNzMenuItemDirective", predicate: NzMenuItemComponent, descendants: true }], viewQueries: [{ propertyName: "cdkOverlayOrigin", first: true, predicate: CdkOverlayOrigin, descendants: true, read: ElementRef, static: true }], exportAs: ["nzSubmenu"], usesOnChanges: true, ngImport: i0, template: ` <div nz-submenu-title cdkOverlayOrigin #origin="cdkOverlayOrigin" [nzIcon]="nzIcon" [nzTitle]="nzTitle" [mode]="mode" [nzDisabled]="nzDisabled" [isMenuInsideDropDown]="isMenuInsideDropDown" [paddingLeft]="nzPaddingLeft || inlinePaddingLeft" (subMenuMouseState)="setMouseEnterState($event)" (toggleSubMenu)="toggleSubMenu()" > <ng-content select="[title]" *ngIf="!nzTitle"></ng-content> </div> <div *ngIf="mode === 'inline'; else nonInlineTemplate" nz-submenu-inline-child [mode]="mode" [nzOpen]="nzOpen" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [menuClass]="nzMenuClassName" [templateOutlet]="subMenuTemplate" ></div> <ng-template #nonInlineTemplate> <ng-template cdkConnectedOverlay (positionChange)="onPositionChange($event)" [cdkConnectedOverlayPositions]="overlayPositions" [cdkConnectedOverlayOrigin]="origin" [cdkConnectedOverlayWidth]="triggerWidth!" [cdkConnectedOverlayOpen]="nzOpen" [cdkConnectedOverlayTransformOriginOn]="'.ant-menu-submenu'" > <div nz-submenu-none-inline-child [theme]="theme" [mode]="mode" [nzOpen]="nzOpen" [position]="position" [nzDisabled]="nzDisabled" [isMenuInsideDropDown]="isMenuInsideDropDown" [templateOutlet]="subMenuTemplate" [menuClass]="nzMenuClassName" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" (subMenuMouseState)="setMouseEnterState($event)" ></div> </ng-template> </ng-template> <ng-template #subMenuTemplate> <ng-content></ng-content> </ng-template> `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i7.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i5.NzNoAnimationDirective, selector: "[nzNoAnimation]", inputs: ["nzNoAnimation"], exportAs: ["nzNoAnimation"] }, { kind: "component", type: i8.NzSubMenuTitleComponent, selector: "[nz-submenu-title]", inputs: ["nzIcon", "nzTitle", "isMenuInsideDropDown", "nzDisabled", "paddingLeft", "mode"], outputs: ["toggleSubMenu", "subMenuMouseState"], exportAs: ["nzSubmenuTitle"] }, { kind: "component", type: i9.NzSubmenuInlineChildComponent, selector: "[nz-submenu-inline-child]", inputs: ["templateOutlet", "menuClass", "mode", "nzOpen"], exportAs: ["nzSubmenuInlineChild"] }, { kind: "component", type: i10.NzSubmenuNoneInlineChildComponent, selector: "[nz-submenu-none-inline-child]", inputs: ["menuClass", "theme", "templateOutlet", "isMenuInsideDropDown", "mode", "position", "nzDisabled", "nzOpen"], outputs: ["subMenuMouseState"], exportAs: ["nzSubmenuNoneInlineChild"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } __decorate([ InputBoolean() ], NzSubMenuComponent.prototype, "nzOpen", void 0); __decorate([ InputBoolean() ], NzSubMenuComponent.prototype, "nzDisabled", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzSubMenuComponent, decorators: [{ type: Component, args: [{ selector: '[nz-submenu]', exportAs: 'nzSubmenu', providers: [NzSubmenuService], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: ` <div nz-submenu-title cdkOverlayOrigin #origin="cdkOverlayOrigin" [nzIcon]="nzIcon" [nzTitle]="nzTitle" [mode]="mode" [nzDisabled]="nzDisabled" [isMenuInsideDropDown]="isMenuInsideDropDown" [paddingLeft]="nzPaddingLeft || inlinePaddingLeft" (subMenuMouseState)="setMouseEnterState($event)" (toggleSubMenu)="toggleSubMenu()" > <ng-content select="[title]" *ngIf="!nzTitle"></ng-content> </div> <div *ngIf="mode === 'inline'; else nonInlineTemplate" nz-submenu-inline-child [mode]="mode" [nzOpen]="nzOpen" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [menuClass]="nzMenuClassName" [templateOutlet]="subMenuTemplate" ></div> <ng-template #nonInlineTemplate> <ng-template cdkConnectedOverlay (positionChange)="onPositionChange($event)" [cdkConnectedOverlayPositions]="overlayPositions" [cdkConnectedOverlayOrigin]="origin" [cdkConnectedOverlayWidth]="triggerWidth!" [cdkConnectedOverlayOpen]="nzOpen" [cdkConnectedOverlayTransformOriginOn]="'.ant-menu-submenu'" > <div nz-submenu-none-inline-child [theme]="theme" [mode]="mode" [nzOpen]="nzOpen" [position]="position" [nzDisabled]="nzDisabled" [isMenuInsideDropDown]="isMenuInsideDropDown" [templateOutlet]="subMenuTemplate" [menuClass]="nzMenuClassName" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" (subMenuMouseState)="setMouseEnterState($event)" ></div> </ng-template> </ng-template> <ng-template #subMenuTemplate> <ng-content></ng-content> </ng-template> `, host: { '[class.ant-dropdown-menu-submenu]': `isMenuInsideDropDown`, '[class.ant-dropdown-menu-submenu-disabled]': `isMenuInsideDropDown && nzDisabled`, '[class.ant-dropdown-menu-submenu-open]': `isMenuInsideDropDown && nzOpen`, '[class.ant-dropdown-menu-submenu-selected]': `isMenuInsideDropDown && isSelected`, '[class.ant-dropdown-menu-submenu-vertical]': `isMenuInsideDropDown && mode === 'vertical'`, '[class.ant-dropdown-menu-submenu-horizontal]': `isMenuInsideDropDown && mode === 'horizontal'`, '[class.ant-dropdown-menu-submenu-inline]': `isMenuInsideDropDown && mode === 'inline'`, '[class.ant-dropdown-menu-submenu-active]': `isMenuInsideDropDown && isActive`, '[class.ant-menu-submenu]': `!isMenuInsideDropDown`, '[class.ant-menu-submenu-disabled]': `!isMenuInsideDropDown && nzDisabled`, '[class.ant-menu-submenu-open]': `!isMenuInsideDropDown && nzOpen`, '[class.ant-menu-submenu-selected]': `!isMenuInsideDropDown && isSelected`, '[class.ant-menu-submenu-vertical]': `!isMenuInsideDropDown && mode === 'vertical'`, '[class.ant-menu-submenu-horizontal]': `!isMenuInsideDropDown && mode === 'horizontal'`, '[class.ant-menu-submenu-inline]': `!isMenuInsideDropDown && mode === 'inline'`, '[class.ant-menu-submenu-active]': `!isMenuInsideDropDown && isActive`, '[class.ant-menu-submenu-rtl]': `dir === 'rtl'` } }] }], ctorParameters: () => [{ type: i1.MenuService }, { type: i0.ChangeDetectorRef }, { type: i2.NzSubmenuService }, { type: i3.Platform }, { type: undefined, decorators: [{ type: Inject, args: [NzIsMenuInsideDropDownToken] }] }, { type: i4.Directionality, decorators: [{ type: Optional }] }, { type: i5.NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] }], propDecorators: { nzMenuClassName: [{ type: Input }], nzPaddingLeft: [{ type: Input }], nzTitle: [{ type: Input }], nzIcon: [{ type: Input }], nzOpen: [{ type: Input }], nzDisabled: [{ type: Input }], nzPlacement: [{ type: Input }], nzOpenChange: [{ type: Output }], cdkOverlayOrigin: [{ type: ViewChild, args: [CdkOverlayOrigin, { static: true, read: ElementRef }] }], listOfNzSubMenuComponent: [{ type: ContentChildren, args: [forwardRef(() => NzSubMenuComponent), { descendants: true }] }], listOfNzMenuItemDirective: [{ type: ContentChildren, args: [NzMenuItemComponent, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL21lbnUvc3VibWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU1BLE9BQU8sRUFBRSxnQkFBZ0IsRUFBa0MsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RixPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFJTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBNEIsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7QUFFckQsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixZQUFZLENBQUMsUUFBUTtJQUNyQixZQUFZLENBQUMsS0FBSztJQUNsQixZQUFZLENBQUMsV0FBVztJQUN4QixZQUFZLENBQUMsT0FBTztJQUNwQixZQUFZLENBQUMsSUFBSTtJQUNqQixZQUFZLENBQUMsVUFBVTtDQUN4QixDQUFDO0FBQ0YsTUFB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LDJDQUEyQzt3QkFDdkYsMENBQTBDLEVBQUUsa0NBQWtDO3dCQUM5RSwwQkFBMEIsRUFBRSx1QkFBdUI7d0JBQ25ELG1DQUFtQyxFQUFFLHFDQUFxQzt3QkFDMUUsK0JBQStCLEVBQUUsaUNBQWlDO3dCQUNsRSxtQ0FBbUMsRUFBRSxxQ0FBcUM7d0JBQzFFLG1DQUFtQyxFQUFFLDhDQUE4Qzt3QkFDbkYscUNBQXFDLEVBQUUsZ0RBQWdEO3dCQUN2RixpQ0FBaUMsRUFBRSw0Q0FBNEM7d0JBQy9FLGlDQUFpQyxFQUFFLG1DQUFtQzt3QkFDdEUsOEJBQThCLEVBQUUsZUFBZTtxQkFDaEQ7aUJBQ0Y7OzBCQTBFSSxNQUFNOzJCQUFDLDJCQUEyQjs7MEJBQ2xDLFFBQVE7OzBCQUNSLElBQUk7OzBCQUFJLFFBQVE7eUNBdkVWLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNtQixNQUFNO3NCQUE5QixLQUFLO2dCQUNtQixVQUFVO3NCQUFsQyxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ2EsWUFBWTtzQkFBOUIsTUFBTTtnQkFDMEQsZ0JBQWdCO3NCQUFoRixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUkvRCx3QkFBd0I7c0JBRHZCLGVBQWU7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUc1RSx5QkFBeUI7c0JBRHhCLGVBQWU7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56Tm9BbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvbm8tYW5pbWF0aW9uJztcbmltcG9ydCB7IGdldFBsYWNlbWVudE5hbWUsIFBPU0lUSU9OX01BUCwgUE9TSVRJT05fVFlQRV9IT1JJWk9OVEFMIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL292ZXJsYXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcblxuaW1wb3J0IHsgTnpNZW51SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4vbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IE56SXNNZW51SW5zaWRlRHJvcERvd25Ub2tlbiB9IGZyb20gJy4vbWVudS50b2tlbic7XG5pbXBvcnQgeyBOek1lbnVNb2RlVHlwZSwgTnpNZW51VGhlbWVUeXBlIH0gZnJvbSAnLi9tZW51LnR5cGVzJztcbmltcG9ydCB7IE56U3VibWVudVNlcnZpY2UgfSBmcm9tICcuL3N1Ym1lbnUuc2VydmljZSc7XG5cbmNvbnN0IGxpc3RPZlZlcnRpY2FsUG9zaXRpb25zID0gW1xuICBQT1NJVElPTl9NQVAucmlnaHRUb3AsXG4gIFBPU0lUSU9OX01BUC5yaWdodCxcbiAgUE9TSVRJT05fTUFQLnJpZ2h0Qm90dG9tLFxuICBQT1NJVElPTl9NQVAubGVmdFRvcCxcbiAgUE9TSVRJT05fTUFQLmxlZnQsXG4gIFBPU0lUSU9OX01BUC5sZWZ0Qm90dG9tXG5dO1xuY29uc3QgbGlzdE9mSG9yaXpvbnRhbFBvc2l0aW9ucyA9IFtcbiAgUE9TSVRJT05fTUFQLmJvdHRvbUxlZnQsXG4gIFBPU0lUSU9OX01BUC5ib3R0b21SaWdodCxcbiAgUE9TSVRJT05fTUFQLnRvcFJpZ2h0LFxuICBQT1NJVElPTl9NQVAudG9wTGVmdFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW256LXN1Ym1lbnVdJyxcbiAgZXhwb3J0QXM6ICduelN1Ym1lbnUnLFxuICBwcm92aWRlcnM6IFtOelN1Ym1lbnVTZXJ2aWNlXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG56LXN1Ym1lbnUtdGl0bGVcbiAgICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAgICNvcmlnaW49XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgIFtuekljb25dPVwibnpJY29uXCJcbiAgICAgIFtuelRpdGxlXT1cIm56VGl0bGVcIlxuICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICBbbnpEaXNhYmxlZF09XCJuekRpc2FibGVkXCJcbiAgICAgIFtpc01lbnVJbnNpZGVEcm9wRG93bl09XCJpc01lbnVJbnNpZGVEcm9wRG93blwiXG4gICAgICBbcGFkZGluZ0xlZnRdPVwibnpQYWRkaW5nTGVmdCB8fCBpbmxpbmVQYWRkaW5nTGVmdFwiXG4gICAgICAoc3ViTWVudU1vdXNlU3RhdGUpPVwic2V0TW91c2VFbnRlclN0YXRlKCRldmVudClcIlxuICAgICAgKHRvZ2dsZVN1Yk1lbnUpPVwidG9nZ2xlU3ViTWVudSgpXCJcbiAgICA+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdGl0bGVdXCIgKm5nSWY9XCIhbnpUaXRsZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIm1vZGUgPT09ICdpbmxpbmUnOyBlbHNlIG5vbklubGluZVRlbXBsYXRlXCJcbiAgICAgIG56LXN1Ym1lbnUtaW5saW5lLWNoaWxkXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFtuek9wZW5dPVwibnpPcGVuXCJcbiAgICAgIFtALmRpc2FibGVkXT1cIiEhbm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgW256Tm9BbmltYXRpb25dPVwibm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgW21lbnVDbGFzc109XCJuek1lbnVDbGFzc05hbWVcIlxuICAgICAgW3RlbXBsYXRlT3V0bGV0XT1cInN1Yk1lbnVUZW1wbGF0ZVwiXG4gICAgPjwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9uSW5saW5lVGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgICAocG9zaXRpb25DaGFuZ2UpPVwib25Qb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm9yaWdpblwiXG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGhdPVwidHJpZ2dlcldpZHRoIVwiXG4gICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJuek9wZW5cIlxuICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uXT1cIicuYW50LW1lbnUtc3VibWVudSdcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgbnotc3VibWVudS1ub25lLWlubGluZS1jaGlsZFxuICAgICAgICAgIFt0aGVtZV09XCJ0aGVtZVwiXG4gICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgW256T3Blbl09XCJuek9wZW5cIlxuICAgICAgICAgIFtwb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgICAgICAgW256RGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICAgICAgW2lzTWVudUluc2lkZURyb3BEb3duXT1cImlzTWVudUluc2lkZURyb3BEb3duXCJcbiAgICAgICAgICBbdGVtcGxhdGVPdXRsZXRdPVwic3ViTWVudVRlbXBsYXRlXCJcbiAgICAgICAgICBbbWVudUNsYXNzXT1cIm56TWVudUNsYXNzTmFtZVwiXG4gICAgICAgICAgW0AuZGlzYWJsZWRdPVwiISFub0FuaW1hdGlvbj8ubnpOb0FuaW1hdGlvblwiXG4gICAgICAgICAgW256Tm9BbmltYXRpb25dPVwibm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgICAgIChzdWJNZW51TW91c2VTdGF0ZSk9XCJzZXRNb3VzZUVudGVyU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjc3ViTWVudVRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC1kcm9wZG93bi1tZW51LXN1Ym1lbnVdJzogYGlzTWVudUluc2lkZURyb3BEb3duYCxcbiAgICAnW2NsYXNzLmFudC1kcm9wZG93bi1tZW51LXN1Ym1lbnUtZGlzYWJsZWRdJzogYGlzTWVudUluc2lkZURyb3BEb3duICYmIG56RGlzYWJsZWRgLFxuICAgICdbY2xhc3MuYW50LWRyb3Bkb3duLW1lbnUtc3VibWVudS1vcGVuXSc6IGBpc01lbnVJbnNpZGVEcm9wRG93biAmJiBuek9wZW5gLFxuICAgICdbY2xhc3MuYW50LWRyb3Bkb3duLW1lbnUtc3VibWVudS1zZWxlY3RlZF0nOiBgaXNNZW51SW5zaWRlRHJvcERvd24gJiYgaXNTZWxlY3RlZGAsXG4gICAgJ1tjbGFzcy5hbnQtZHJvcGRvd24tbWVudS1zdWJtZW51LXZlcnRpY2FsXSc6IGBpc01lbnVJbnNpZGVEcm9wRG93biAmJiBtb2RlID09PSAndmVydGljYWwnYCxcbiAgICAnW2NsYXNzLmFudC1kcm9wZG93bi1tZW51LXN1Ym1lbnUtaG9yaXpvbnRhbF0nOiBgaXNNZW51SW5zaWRlRHJvcERvd24gJiYgbW9kZSA9PT0gJ2hvcml6b250YWwnYCxcbiAgICAnW2NsYXNzLmFudC1kcm9wZG93bi1tZW51LXN1Ym1lbnUtaW5saW5lXSc6IGBpc01lbnVJbnNpZGVEcm9wRG93biAmJiBtb2RlID09PSAnaW5saW5lJ2AsXG4gICAgJ1tjbGFzcy5hbnQtZHJvcGRvd24tbWVudS1zdWJtZW51LWFjdGl2ZV0nOiBgaXNNZW51SW5zaWRlRHJvcERvd24gJiYgaXNBY3RpdmVgLFxuICAgICdbY2xhc3MuYW50LW1lbnUtc3VibWVudV0nOiBgIWlzTWVudUluc2lkZURyb3BEb3duYCxcbiAgICAnW2NsYXNzLmFudC1tZW51LXN1Ym1lbnUtZGlzYWJsZWRdJzogYCFpc01lbnVJbnNpZGVEcm9wRG93biAmJiBuekRpc2FibGVkYCxcbiAgICAnW2NsYXNzLmFudC1tZW51LXN1Ym1lbnUtb3Blbl0nOiBgIWlzTWVudUluc2lkZURyb3BEb3duICYmIG56T3BlbmAsXG4gICAgJ1tjbGFzcy5hbnQtbWVudS1zdWJtZW51LXNlbGVjdGVkXSc6IGAhaXNNZW51SW5zaWRlRHJvcERvd24gJiYgaXNTZWxlY3RlZGAsXG4gICAgJ1tjbGFzcy5hbnQtbWVudS1zdWJtZW51LXZlcnRpY2FsXSc6IGAhaXNNZW51SW5zaWRlRHJvcERvd24gJiYgbW9kZSA9PT0gJ3ZlcnRpY2FsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtbWVudS1zdWJtZW51LWhvcml6b250YWxdJzogYCFpc01lbnVJbnNpZGVEcm9wRG93biAmJiBtb2RlID09PSAnaG9yaXpvbnRhbCdgLFxuICAgICdbY2xhc3MuYW50LW1lbnUtc3VibWVudS1pbmxpbmVdJzogYCFpc01lbnVJbnNpZGVEcm9wRG93biAmJiBtb2RlID09PSAnaW5saW5lJ2AsXG4gICAgJ1tjbGFzcy5hbnQtbWVudS1zdWJtZW51LWFjdGl2ZV0nOiBgIWlzTWVudUluc2lkZURyb3BEb3duICYmIGlzQWN0aXZlYCxcbiAgICAnW2NsYXNzLmFudC1tZW51LXN1Ym1lbnUtcnRsXSc6IGBkaXIgPT09ICdydGwnYFxuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56U3ViTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpPcGVuOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG5cbiAgQElucHV0KCkgbnpNZW51Q2xhc3NOYW1lOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpQYWRkaW5nTGVmdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56VGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56SWNvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek9wZW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbnpQbGFjZW1lbnQ6IFBPU0lUSU9OX1RZUEVfSE9SSVpPTlRBTCA9ICdib3R0b21MZWZ0JztcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKENka092ZXJsYXlPcmlnaW4sIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pIGNka092ZXJsYXlPcmlnaW46IEVsZW1lbnRSZWYgfCBudWxsID0gbnVsbDtcbiAgLy8gZml4IGVycm9ycyBhYm91dCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8vIENhbid0IGNvbnN0cnVjdCBhIHF1ZXJ5IGZvciB0aGUgcHJvcGVydHkgLi4uIHNpbmNlIHRoZSBxdWVyeSBzZWxlY3RvciB3YXNuJ3QgZGVmaW5lZFwiXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBOelN1Yk1lbnVDb21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGxpc3RPZk56U3ViTWVudUNvbXBvbmVudDogUXVlcnlMaXN0PE56U3ViTWVudUNvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgQENvbnRlbnRDaGlsZHJlbihOek1lbnVJdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmU6IFF1ZXJ5TGlzdDxOek1lbnVJdGVtQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxldmVsID0gdGhpcy5uelN1Ym1lbnVTZXJ2aWNlLmxldmVsO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcG9zaXRpb24gPSAncmlnaHQnO1xuICB0cmlnZ2VyV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICB0aGVtZTogTnpNZW51VGhlbWVUeXBlID0gJ2xpZ2h0JztcbiAgbW9kZTogTnpNZW51TW9kZVR5cGUgPSAndmVydGljYWwnO1xuICBpbmxpbmVQYWRkaW5nTGVmdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIG92ZXJsYXlQb3NpdGlvbnMgPSBsaXN0T2ZWZXJ0aWNhbFBvc2l0aW9ucztcbiAgaXNTZWxlY3RlZCA9IGZhbHNlO1xuICBpc0FjdGl2ZSA9IGZhbHNlO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuXG4gIC8qKiBzZXQgdGhlIHN1Ym1lbnUgaG9zdCBvcGVuIHN0YXR1cyBkaXJlY3RseSAqKi9cbiAgc2V0T3BlblN0YXRlV2l0aG91dERlYm91bmNlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm56U3VibWVudVNlcnZpY2Uuc2V0T3BlblN0YXRlV2l0aG91dERlYm91bmNlKG9wZW4pO1xuICB9XG5cbiAgdG9nZ2xlU3ViTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE9wZW5TdGF0ZVdpdGhvdXREZWJvdW5jZSghdGhpcy5uek9wZW4pO1xuICB9XG5cbiAgc2V0TW91c2VFbnRlclN0YXRlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICB0aGlzLm56U3VibWVudVNlcnZpY2Uuc2V0TW91c2VFbnRlclRpdGxlT3JPdmVybGF5U3RhdGUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldFRyaWdnZXJXaWR0aCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIgJiZcbiAgICAgIHRoaXMuY2RrT3ZlcmxheU9yaWdpbiAmJlxuICAgICAgdGhpcy5uelBsYWNlbWVudCA9PT0gJ2JvdHRvbUxlZnQnXG4gICAgKSB7XG4gICAgICAvKiogVE9ETzogZmFzdCBkb20gKiovXG4gICAgICB0aGlzLnRyaWdnZXJXaWR0aCA9IHRoaXMuY2RrT3ZlcmxheU9yaWdpbiEubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG4gIH1cblxuICBvblBvc2l0aW9uQ2hhbmdlKHBvc2l0aW9uOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZW1lbnQgPSBnZXRQbGFjZW1lbnROYW1lKHBvc2l0aW9uKTtcbiAgICBpZiAocGxhY2VtZW50ID09PSAncmlnaHRUb3AnIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0Qm90dG9tJyB8fCBwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcbiAgICAgIHRoaXMucG9zaXRpb24gPSAncmlnaHQnO1xuICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAnbGVmdFRvcCcgfHwgcGxhY2VtZW50ID09PSAnbGVmdEJvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICAgIHRoaXMucG9zaXRpb24gPSAnbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG56TWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgbnpTdWJtZW51U2VydmljZTogTnpTdWJtZW51U2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBASW5qZWN0KE56SXNNZW51SW5zaWRlRHJvcERvd25Ub2tlbikgcHVibGljIGlzTWVudUluc2lkZURyb3BEb3duOiBib29sZWFuLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5LFxuICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHVibGljIG5vQW5pbWF0aW9uPzogTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLyoqIHN1Ym1lbnUgdGhlbWUgdXBkYXRlICoqL1xuICAgIHRoaXMubnpNZW51U2VydmljZS50aGVtZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh0aGVtZSA9PiB7XG4gICAgICB0aGlzLnRoZW1lID0gdGhlbWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgICAvKiogc3VibWVudSBtb2RlIHVwZGF0ZSAqKi9cbiAgICB0aGlzLm56U3VibWVudVNlcnZpY2UubW9kZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShtb2RlID0+IHtcbiAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICBpZiAobW9kZSA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVBvc2l0aW9ucyA9IFtQT1NJVElPTl9NQVBbdGhpcy5uelBsYWNlbWVudF0sIC4uLmxpc3RPZkhvcml6b250YWxQb3NpdGlvbnNdO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAndmVydGljYWwnKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVBvc2l0aW9ucyA9IGxpc3RPZlZlcnRpY2FsUG9zaXRpb25zO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gICAgLyoqIGlubGluZUluZGVudCB1cGRhdGUgKiovXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5uelN1Ym1lbnVTZXJ2aWNlLm1vZGUkLCB0aGlzLm56TWVudVNlcnZpY2UuaW5saW5lSW5kZW50JF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbbW9kZSwgaW5saW5lSW5kZW50XSkgPT4ge1xuICAgICAgICB0aGlzLmlubGluZVBhZGRpbmdMZWZ0ID0gbW9kZSA9PT0gJ2lubGluZScgPyB0aGlzLmxldmVsICogaW5saW5lSW5kZW50IDogbnVsbDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICAvKiogY3VycmVudCBzdWJtZW51IG9wZW4gc3RhdHVzICoqL1xuICAgIHRoaXMubnpTdWJtZW51U2VydmljZS5pc0N1cnJlbnRTdWJNZW51T3BlbiQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShvcGVuID0+IHtcbiAgICAgIHRoaXMuaXNBY3RpdmUgPSBvcGVuO1xuICAgICAgaWYgKG9wZW4gIT09IHRoaXMubnpPcGVuKSB7XG4gICAgICAgIHRoaXMuc2V0VHJpZ2dlcldpZHRoKCk7XG4gICAgICAgIHRoaXMubnpPcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5uek9wZW5DaGFuZ2UuZW1pdCh0aGlzLm56T3Blbik7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kaXIgPSB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlO1xuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkaXJlY3Rpb246IERpcmVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFRyaWdnZXJXaWR0aCgpO1xuICAgIGNvbnN0IGxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmUgPSB0aGlzLmxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmU7XG4gICAgY29uc3QgY2hhbmdlcyA9IGxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmUhLmNoYW5nZXM7XG4gICAgY29uc3QgbWVyZ2VkT2JzZXJ2YWJsZSA9IG1lcmdlKC4uLltjaGFuZ2VzLCAuLi5saXN0T2ZOek1lbnVJdGVtRGlyZWN0aXZlIS5tYXAobWVudSA9PiBtZW51LnNlbGVjdGVkJCldKTtcbiAgICBjaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKGxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmUpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gbWVyZ2VkT2JzZXJ2YWJsZSksXG4gICAgICAgIHN0YXJ0V2l0aCh0cnVlKSxcbiAgICAgICAgbWFwKCgpID0+IGxpc3RPZk56TWVudUl0ZW1EaXJlY3RpdmUhLnNvbWUoZSA9PiBlLm56U2VsZWN0ZWQpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHNlbGVjdGVkID0+IHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuek9wZW4gfSA9IGNoYW5nZXM7XG4gICAgaWYgKG56T3Blbikge1xuICAgICAgdGhpcy5uelN1Ym1lbnVTZXJ2aWNlLnNldE9wZW5TdGF0ZVdpdGhvdXREZWJvdW5jZSh0aGlzLm56T3Blbik7XG4gICAgICB0aGlzLnNldFRyaWdnZXJXaWR0aCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19