UNPKG

ng-zorro-antd

Version:

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

437 lines (433 loc) 50.1 kB
import { __decorate } from "tslib"; import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { Subject, Subscription } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { WithConfig } from 'ng-zorro-antd/core/config'; import { cancelRequestAnimationFrame, reqAnimFrame } from 'ng-zorro-antd/core/polyfill'; import { InputBoolean, InputNumber, isStyleSupport, measure } from 'ng-zorro-antd/core/util'; import { NzTextCopyComponent } from './text-copy.component'; import { NzTextEditComponent } from './text-edit.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/core/config"; import * as i2 from "@angular/cdk/platform"; import * as i3 from "ng-zorro-antd/i18n"; import * as i4 from "ng-zorro-antd/core/services"; import * as i5 from "@angular/cdk/bidi"; import * as i6 from "@angular/common"; import * as i7 from "./text-copy.component"; import * as i8 from "./text-edit.component"; const NZ_CONFIG_MODULE_NAME = 'typography'; const EXPAND_ELEMENT_CLASSNAME = 'ant-typography-expand'; export class NzTypographyComponent { get hasEllipsisObservers() { return this.nzOnEllipsis.observers.length > 0; } get canCssEllipsis() { return this.nzEllipsis && this.cssEllipsis && !this.expanded && !this.hasEllipsisObservers; } get hasOperationsWithEllipsis() { return (this.nzCopyable || this.nzEditable || this.nzExpandable) && this.nzEllipsis; } get copyText() { return (typeof this.nzCopyText === 'string' ? this.nzCopyText : this.nzContent); } constructor(nzConfigService, host, cdr, viewContainerRef, renderer, platform, i18n, document, resizeService, directionality) { this.nzConfigService = nzConfigService; this.host = host; this.cdr = cdr; this.viewContainerRef = viewContainerRef; this.renderer = renderer; this.platform = platform; this.i18n = i18n; this.resizeService = resizeService; this.directionality = directionality; this._nzModuleName = NZ_CONFIG_MODULE_NAME; this.nzCopyable = false; this.nzEditable = false; this.nzDisabled = false; this.nzExpandable = false; this.nzEllipsis = false; this.nzCopyTooltips = undefined; this.nzCopyIcons = ['copy', 'check']; this.nzEditTooltip = undefined; this.nzEditIcon = 'edit'; this.nzEllipsisRows = 1; this.nzContentChange = new EventEmitter(); this.nzCopy = new EventEmitter(); this.nzExpandChange = new EventEmitter(); // This is not a two-way binding output with {@link nzEllipsis} this.nzOnEllipsis = new EventEmitter(); this.expandableBtnElementCache = null; this.editing = false; this.cssEllipsis = false; this.isEllipsis = true; this.expanded = false; this.ellipsisStr = '...'; this.dir = 'ltr'; this.viewInit = false; this.rfaId = -1; this.destroy$ = new Subject(); this.windowResizeSubscription = Subscription.EMPTY; this.document = document; } onTextCopy(text) { this.nzCopy.emit(text); } onStartEditing() { this.editing = true; } onEndEditing(text) { this.editing = false; this.nzContentChange.emit(text); if (this.nzContent === text) { this.renderOnNextFrame(); } this.cdr.markForCheck(); } onExpand() { this.isEllipsis = false; this.expanded = true; this.nzExpandChange.emit(); this.nzOnEllipsis.emit(false); } canUseCSSEllipsis() { if (this.nzEditable || this.nzCopyable || this.nzExpandable || this.nzSuffix) { return false; } // make sure {@link nzOnEllipsis} works, will force use JS to calculations if (this.hasEllipsisObservers) { return false; } if (this.nzEllipsisRows === 1) { return isStyleSupport('textOverflow'); } else { return isStyleSupport('webkitLineClamp'); } } renderOnNextFrame() { cancelRequestAnimationFrame(this.rfaId); if (!this.viewInit || !this.nzEllipsis || this.nzEllipsisRows < 0 || this.expanded || !this.platform.isBrowser) { return; } this.rfaId = reqAnimFrame(() => { this.syncEllipsis(); }); } getOriginContentViewRef() { const viewRef = this.viewContainerRef.createEmbeddedView(this.contentTemplate, { content: this.nzContent }); viewRef.detectChanges(); return { viewRef, removeView: () => { this.viewContainerRef.remove(this.viewContainerRef.indexOf(viewRef)); } }; } syncEllipsis() { if (this.cssEllipsis) { return; } const { viewRef, removeView } = this.getOriginContentViewRef(); const fixedNodes = [this.textCopyRef, this.textEditRef] .filter(e => e && e.nativeElement) .map(e => e.nativeElement); const expandableBtnElement = this.getExpandableBtnElement(); if (expandableBtnElement) { fixedNodes.push(expandableBtnElement); } const { contentNodes, text, ellipsis } = measure(this.host.nativeElement, this.nzEllipsisRows, viewRef.rootNodes, fixedNodes, this.ellipsisStr, this.nzSuffix); removeView(); this.ellipsisText = text; if (ellipsis !== this.isEllipsis) { this.isEllipsis = ellipsis; this.nzOnEllipsis.emit(ellipsis); } const ellipsisContainerNativeElement = this.ellipsisContainer.nativeElement; while (ellipsisContainerNativeElement.firstChild) { this.renderer.removeChild(ellipsisContainerNativeElement, ellipsisContainerNativeElement.firstChild); } contentNodes.forEach(n => { this.renderer.appendChild(ellipsisContainerNativeElement, n.cloneNode(true)); }); this.cdr.markForCheck(); } // Need to create the element for calculation size before view init getExpandableBtnElement() { if (this.nzExpandable) { const expandText = this.locale ? this.locale.expand : ''; const cache = this.expandableBtnElementCache; if (!cache || cache.innerText === expandText) { const el = this.document.createElement('a'); el.className = EXPAND_ELEMENT_CLASSNAME; el.innerText = expandText; this.expandableBtnElementCache = el; } return this.expandableBtnElementCache; } else { this.expandableBtnElementCache = null; return null; } } renderAndSubscribeWindowResize() { if (this.platform.isBrowser) { this.windowResizeSubscription.unsubscribe(); this.cssEllipsis = this.canUseCSSEllipsis(); this.renderOnNextFrame(); this.windowResizeSubscription = this.resizeService .subscribe() .pipe(takeUntil(this.destroy$)) .subscribe(() => this.renderOnNextFrame()); } } ngOnInit() { this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => { this.locale = this.i18n.getLocaleData('Text'); this.cdr.markForCheck(); }); this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); this.dir = this.directionality.value; } ngAfterViewInit() { this.viewInit = true; this.renderAndSubscribeWindowResize(); } ngOnChanges(changes) { const { nzCopyable, nzEditable, nzExpandable, nzEllipsis, nzContent, nzEllipsisRows, nzSuffix } = changes; if (nzCopyable || nzEditable || nzExpandable || nzEllipsis || nzContent || nzEllipsisRows || nzSuffix) { if (this.nzEllipsis) { if (this.expanded) { this.windowResizeSubscription.unsubscribe(); } else { this.renderAndSubscribeWindowResize(); } } } } ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); this.expandableBtnElementCache = null; this.windowResizeSubscription.unsubscribe(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzTypographyComponent, deps: [{ token: i1.NzConfigService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i0.Renderer2 }, { token: i2.Platform }, { token: i3.NzI18nService }, { token: DOCUMENT }, { token: i4.NzResizeService }, { token: i5.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: NzTypographyComponent, selector: "\n nz-typography,\n [nz-typography],\n p[nz-paragraph],\n span[nz-text],\n h1[nz-title], h2[nz-title], h3[nz-title], h4[nz-title]\n ", inputs: { nzCopyable: "nzCopyable", nzEditable: "nzEditable", nzDisabled: "nzDisabled", nzExpandable: "nzExpandable", nzEllipsis: "nzEllipsis", nzCopyTooltips: "nzCopyTooltips", nzCopyIcons: "nzCopyIcons", nzEditTooltip: "nzEditTooltip", nzEditIcon: "nzEditIcon", nzContent: "nzContent", nzEllipsisRows: "nzEllipsisRows", nzType: "nzType", nzCopyText: "nzCopyText", nzSuffix: "nzSuffix" }, outputs: { nzContentChange: "nzContentChange", nzCopy: "nzCopy", nzExpandChange: "nzExpandChange", nzOnEllipsis: "nzOnEllipsis" }, host: { properties: { "class.ant-typography": "!editing", "class.ant-typography-rtl": "dir === \"rtl\"", "class.ant-typography-edit-content": "editing", "class.ant-typography-secondary": "nzType === \"secondary\"", "class.ant-typography-warning": "nzType === \"warning\"", "class.ant-typography-danger": "nzType === \"danger\"", "class.ant-typography-success": "nzType === \"success\"", "class.ant-typography-disabled": "nzDisabled", "class.ant-typography-ellipsis": "nzEllipsis && !expanded", "class.ant-typography-single-line": "nzEllipsis && nzEllipsisRows === 1", "class.ant-typography-ellipsis-single-line": "canCssEllipsis && nzEllipsisRows === 1", "class.ant-typography-ellipsis-multiple-line": "canCssEllipsis && nzEllipsisRows > 1", "style.-webkit-line-clamp": "(canCssEllipsis && nzEllipsisRows > 1) ? nzEllipsisRows : null" } }, viewQueries: [{ propertyName: "textEditRef", first: true, predicate: NzTextEditComponent, descendants: true }, { propertyName: "textCopyRef", first: true, predicate: NzTextCopyComponent, descendants: true }, { propertyName: "ellipsisContainer", first: true, predicate: ["ellipsisContainer"], descendants: true }, { propertyName: "expandableBtn", first: true, predicate: ["expandable"], descendants: true }, { propertyName: "contentTemplate", first: true, predicate: ["contentTemplate"], descendants: true }], exportAs: ["nzTypography"], usesOnChanges: true, ngImport: i0, template: ` <ng-template #contentTemplate let-content="content"> <ng-content *ngIf="!content"></ng-content> {{ content }} </ng-template> <ng-container *ngIf="!editing"> <ng-container *ngIf=" expanded || (!hasOperationsWithEllipsis && nzEllipsisRows === 1 && !hasEllipsisObservers) || canCssEllipsis || (nzSuffix && expanded); else jsEllipsis " > <ng-template [ngTemplateOutlet]="contentTemplate" [ngTemplateOutletContext]="{ content: nzContent }" ></ng-template> <ng-container *ngIf="nzSuffix">{{ nzSuffix }}</ng-container> </ng-container> <ng-template #jsEllipsis> <span #ellipsisContainer></span> <ng-container *ngIf="isEllipsis">{{ ellipsisStr }}</ng-container> <ng-container *ngIf="nzSuffix">{{ nzSuffix }}</ng-container> <a #expandable *ngIf="nzExpandable && isEllipsis" class="ant-typography-expand" (click)="onExpand()"> {{ locale?.expand }} </a> </ng-template> </ng-container> <nz-text-edit *ngIf="nzEditable" [text]="nzContent" [icon]="nzEditIcon" [tooltip]="nzEditTooltip" (endEditing)="onEndEditing($event)" (startEditing)="onStartEditing()" ></nz-text-edit> <nz-text-copy *ngIf="nzCopyable && !editing" [text]="copyText" [tooltips]="nzCopyTooltips" [icons]="nzCopyIcons" (textCopy)="onTextCopy($event)" ></nz-text-copy> `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.NzTextCopyComponent, selector: "nz-text-copy", inputs: ["text", "tooltips", "icons"], outputs: ["textCopy"], exportAs: ["nzTextCopy"] }, { kind: "component", type: i8.NzTextEditComponent, selector: "nz-text-edit", inputs: ["text", "icon", "tooltip"], outputs: ["startEditing", "endEditing"], exportAs: ["nzTextEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } __decorate([ InputBoolean() ], NzTypographyComponent.prototype, "nzCopyable", void 0); __decorate([ InputBoolean() ], NzTypographyComponent.prototype, "nzEditable", void 0); __decorate([ InputBoolean() ], NzTypographyComponent.prototype, "nzDisabled", void 0); __decorate([ InputBoolean() ], NzTypographyComponent.prototype, "nzExpandable", void 0); __decorate([ InputBoolean() ], NzTypographyComponent.prototype, "nzEllipsis", void 0); __decorate([ WithConfig() ], NzTypographyComponent.prototype, "nzCopyTooltips", void 0); __decorate([ WithConfig() ], NzTypographyComponent.prototype, "nzCopyIcons", void 0); __decorate([ WithConfig() ], NzTypographyComponent.prototype, "nzEditTooltip", void 0); __decorate([ WithConfig() ], NzTypographyComponent.prototype, "nzEditIcon", void 0); __decorate([ WithConfig(), InputNumber() ], NzTypographyComponent.prototype, "nzEllipsisRows", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzTypographyComponent, decorators: [{ type: Component, args: [{ selector: ` nz-typography, [nz-typography], p[nz-paragraph], span[nz-text], h1[nz-title], h2[nz-title], h3[nz-title], h4[nz-title] `, exportAs: 'nzTypography', template: ` <ng-template #contentTemplate let-content="content"> <ng-content *ngIf="!content"></ng-content> {{ content }} </ng-template> <ng-container *ngIf="!editing"> <ng-container *ngIf=" expanded || (!hasOperationsWithEllipsis && nzEllipsisRows === 1 && !hasEllipsisObservers) || canCssEllipsis || (nzSuffix && expanded); else jsEllipsis " > <ng-template [ngTemplateOutlet]="contentTemplate" [ngTemplateOutletContext]="{ content: nzContent }" ></ng-template> <ng-container *ngIf="nzSuffix">{{ nzSuffix }}</ng-container> </ng-container> <ng-template #jsEllipsis> <span #ellipsisContainer></span> <ng-container *ngIf="isEllipsis">{{ ellipsisStr }}</ng-container> <ng-container *ngIf="nzSuffix">{{ nzSuffix }}</ng-container> <a #expandable *ngIf="nzExpandable && isEllipsis" class="ant-typography-expand" (click)="onExpand()"> {{ locale?.expand }} </a> </ng-template> </ng-container> <nz-text-edit *ngIf="nzEditable" [text]="nzContent" [icon]="nzEditIcon" [tooltip]="nzEditTooltip" (endEditing)="onEndEditing($event)" (startEditing)="onStartEditing()" ></nz-text-edit> <nz-text-copy *ngIf="nzCopyable && !editing" [text]="copyText" [tooltips]="nzCopyTooltips" [icons]="nzCopyIcons" (textCopy)="onTextCopy($event)" ></nz-text-copy> `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, host: { '[class.ant-typography]': '!editing', '[class.ant-typography-rtl]': 'dir === "rtl"', '[class.ant-typography-edit-content]': 'editing', '[class.ant-typography-secondary]': 'nzType === "secondary"', '[class.ant-typography-warning]': 'nzType === "warning"', '[class.ant-typography-danger]': 'nzType === "danger"', '[class.ant-typography-success]': 'nzType === "success"', '[class.ant-typography-disabled]': 'nzDisabled', '[class.ant-typography-ellipsis]': 'nzEllipsis && !expanded', '[class.ant-typography-single-line]': 'nzEllipsis && nzEllipsisRows === 1', '[class.ant-typography-ellipsis-single-line]': 'canCssEllipsis && nzEllipsisRows === 1', '[class.ant-typography-ellipsis-multiple-line]': 'canCssEllipsis && nzEllipsisRows > 1', '[style.-webkit-line-clamp]': '(canCssEllipsis && nzEllipsisRows > 1) ? nzEllipsisRows : null' } }] }], ctorParameters: () => [{ type: i1.NzConfigService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i2.Platform }, { type: i3.NzI18nService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i4.NzResizeService }, { type: i5.Directionality, decorators: [{ type: Optional }] }], propDecorators: { nzCopyable: [{ type: Input }], nzEditable: [{ type: Input }], nzDisabled: [{ type: Input }], nzExpandable: [{ type: Input }], nzEllipsis: [{ type: Input }], nzCopyTooltips: [{ type: Input }], nzCopyIcons: [{ type: Input }], nzEditTooltip: [{ type: Input }], nzEditIcon: [{ type: Input }], nzContent: [{ type: Input }], nzEllipsisRows: [{ type: Input }], nzType: [{ type: Input }], nzCopyText: [{ type: Input }], nzSuffix: [{ type: Input }], nzContentChange: [{ type: Output }], nzCopy: [{ type: Output }], nzExpandChange: [{ type: Output }], nzOnEllipsis: [{ type: Output }], textEditRef: [{ type: ViewChild, args: [NzTextEditComponent, { static: false }] }], textCopyRef: [{ type: ViewChild, args: [NzTextCopyComponent, { static: false }] }], ellipsisContainer: [{ type: ViewChild, args: ['ellipsisContainer', { static: false }] }], expandableBtn: [{ type: ViewChild, args: ['expandable', { static: false }] }], contentTemplate: [{ type: ViewChild, args: ['contentTemplate', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3R5cG9ncmFwaHkvdHlwb2dyYXBoeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU9BLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFFVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBZ0MsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc3RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQUU1RCxNQUFNLHFCQUFxQixHQUFnQixZQUFZLENBQUM7QUFDeEQsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQztBQThFekQsTUFBTSxPQUFPLHFCQUFxQjtJQStDaEMsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJ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QUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDTCxhQUFhO3NCQUF4RCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ08sZUFBZTtzQkFBL0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56Q29uZmlnS2V5LCBOekNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvY29uZmlnJztcbmltcG9ydCB7IGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSwgcmVxQW5pbUZyYW1lIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3BvbHlmaWxsJztcbmltcG9ydCB7IE56UmVzaXplU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIE51bWJlcklucHV0LCBOelNhZmVBbnksIE56VFNUeXBlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgSW5wdXROdW1iZXIsIGlzU3R5bGVTdXBwb3J0LCBtZWFzdXJlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpJMThuU2VydmljZSwgTnpUZXh0STE4bkludGVyZmFjZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5cbmltcG9ydCB7IE56VGV4dENvcHlDb21wb25lbnQgfSBmcm9tICcuL3RleHQtY29weS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpUZXh0RWRpdENvbXBvbmVudCB9IGZyb20gJy4vdGV4dC1lZGl0LmNvbXBvbmVudCc7XG5cbmNvbnN0IE5aX0NPTkZJR19NT0RVTEVfTkFNRTogTnpDb25maWdLZXkgPSAndHlwb2dyYXBoeSc7XG5jb25zdCBFWFBBTkRfRUxFTUVOVF9DTEFTU05BTUUgPSAnYW50LXR5cG9ncmFwaHktZXhwYW5kJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBgXG4gIG56LXR5cG9ncmFwaHksXG4gIFtuei10eXBvZ3JhcGh5XSxcbiAgcFtuei1wYXJhZ3JhcGhdLFxuICBzcGFuW256LXRleHRdLFxuICBoMVtuei10aXRsZV0sIGgyW256LXRpdGxlXSwgaDNbbnotdGl0bGVdLCBoNFtuei10aXRsZV1cbiAgYCxcbiAgZXhwb3J0QXM6ICduelR5cG9ncmFwaHknLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlIGxldC1jb250ZW50PVwiY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhY29udGVudFwiPjwvbmctY29udGVudD5cbiAgICAgIHt7IGNvbnRlbnQgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGV4cGFuZGVkIHx8XG4gICAgICAgICAgICAoIWhhc09wZXJhdGlvbnNXaXRoRWxsaXBzaXMgJiYgbnpFbGxpcHNpc1Jvd3MgPT09IDEgJiYgIWhhc0VsbGlwc2lzT2JzZXJ2ZXJzKSB8fFxuICAgICAgICAgICAgY2FuQ3NzRWxsaXBzaXMgfHxcbiAgICAgICAgICAgIChuelN1ZmZpeCAmJiBleHBhbmRlZCk7XG4gICAgICAgICAgZWxzZSBqc0VsbGlwc2lzXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29udGVudDogbnpDb250ZW50IH1cIlxuICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm56U3VmZml4XCI+e3sgbnpTdWZmaXggfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNqc0VsbGlwc2lzPlxuICAgICAgICA8c3BhbiAjZWxsaXBzaXNDb250YWluZXI+PC9zcGFuPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbGxpcHNpc1wiPnt7IGVsbGlwc2lzU3RyIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuelN1ZmZpeFwiPnt7IG56U3VmZml4IH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxhICNleHBhbmRhYmxlICpuZ0lmPVwibnpFeHBhbmRhYmxlICYmIGlzRWxsaXBzaXNcIiBjbGFzcz1cImFudC10eXBvZ3JhcGh5LWV4cGFuZFwiIChjbGljayk9XCJvbkV4cGFuZCgpXCI+XG4gICAgICAgICAge3sgbG9jYWxlPy5leHBhbmQgfX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuei10ZXh0LWVkaXRcbiAgICAgICpuZ0lmPVwibnpFZGl0YWJsZVwiXG4gICAgICBbdGV4dF09XCJuekNvbnRlbnRcIlxuICAgICAgW2ljb25dPVwibnpFZGl0SWNvblwiXG4gICAgICBbdG9vbHRpcF09XCJuekVkaXRUb29sdGlwXCJcbiAgICAgIChlbmRFZGl0aW5nKT1cIm9uRW5kRWRpdGluZygkZXZlbnQpXCJcbiAgICAgIChzdGFydEVkaXRpbmcpPVwib25TdGFydEVkaXRpbmcoKVwiXG4gICAgPjwvbnotdGV4dC1lZGl0PlxuXG4gICAgPG56LXRleHQtY29weVxuICAgICAgKm5nSWY9XCJuekNvcHlhYmxlICYmICFlZGl0aW5nXCJcbiAgICAgIFt0ZXh0XT1cImNvcHlUZXh0XCJcbiAgICAgIFt0b29sdGlwc109XCJuekNvcHlUb29sdGlwc1wiXG4gICAgICBbaWNvbnNdPVwibnpDb3B5SWNvbnNcIlxuICAgICAgKHRleHRDb3B5KT1cIm9uVGV4dENvcHkoJGV2ZW50KVwiXG4gICAgPjwvbnotdGV4dC1jb3B5PlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC10eXBvZ3JhcGh5XSc6ICchZWRpdGluZycsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1ydGxdJzogJ2RpciA9PT0gXCJydGxcIicsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1lZGl0LWNvbnRlbnRdJzogJ2VkaXRpbmcnLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktc2Vjb25kYXJ5XSc6ICduelR5cGUgPT09IFwic2Vjb25kYXJ5XCInLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktd2FybmluZ10nOiAnbnpUeXBlID09PSBcIndhcm5pbmdcIicsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1kYW5nZXJdJzogJ256VHlwZSA9PT0gXCJkYW5nZXJcIicsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1zdWNjZXNzXSc6ICduelR5cGUgPT09IFwic3VjY2Vzc1wiJyxcbiAgICAnW2NsYXNzLmFudC10eXBvZ3JhcGh5LWRpc2FibGVkXSc6ICduekRpc2FibGVkJyxcbiAgICAnW2NsYXNzLmFudC10eXBvZ3JhcGh5LWVsbGlwc2lzXSc6ICduekVsbGlwc2lzICYmICFleHBhbmRlZCcsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1zaW5nbGUtbGluZV0nOiAnbnpFbGxpcHNpcyAmJiBuekVsbGlwc2lzUm93cyA9PT0gMScsXG4gICAgJ1tjbGFzcy5hbnQtdHlwb2dyYXBoeS1lbGxpcHNpcy1zaW5nbGUtbGluZV0nOiAnY2FuQ3NzRWxsaXBzaXMgJiYgbnpFbGxpcHNpc1Jvd3MgPT09IDEnLFxuICAgICdbY2xhc3MuYW50LXR5cG9ncmFwaHktZWxsaXBzaXMtbXVsdGlwbGUtbGluZV0nOiAnY2FuQ3NzRWxsaXBzaXMgJiYgbnpFbGxpcHNpc1Jvd3MgPiAxJyxcbiAgICAnW3N0eWxlLi13ZWJraXQtbGluZS1jbGFtcF0nOiAnKGNhbkNzc0VsbGlwc2lzICYmIG56RWxsaXBzaXNSb3dzID4gMSkgPyBuekVsbGlwc2lzUm93cyA6IG51bGwnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpUeXBvZ3JhcGh5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIHJlYWRvbmx5IF9uek1vZHVsZU5hbWU6IE56Q29uZmlnS2V5ID0gTlpfQ09ORklHX01PRFVMRV9OQU1FO1xuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNvcHlhYmxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekVkaXRhYmxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekV4cGFuZGFibGU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RWxsaXBzaXM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RWxsaXBzaXNSb3dzOiBOdW1iZXJJbnB1dDtcblxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDb3B5YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFZGl0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFeHBhbmRhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekVsbGlwc2lzID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgbnpDb3B5VG9vbHRpcHM/OiBbTnpUU1R5cGUsIE56VFNUeXBlXSB8IG51bGwgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgbnpDb3B5SWNvbnM6IFtOelRTVHlwZSwgTnpUU1R5cGVdID0gWydjb3B5JywgJ2NoZWNrJ107XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgbnpFZGl0VG9vbHRpcD86IG51bGwgfCBOelRTVHlwZSA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuekVkaXRJY29uOiBOelRTVHlwZSA9ICdlZGl0JztcbiAgQElucHV0KCkgbnpDb250ZW50Pzogc3RyaW5nO1xuICBASW5wdXQoKSBAV2l0aENvbmZpZygpIEBJbnB1dE51bWJlcigpIG56RWxsaXBzaXNSb3dzOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBuelR5cGU6ICdzZWNvbmRhcnknIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgfCAnc3VjY2VzcycgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG56Q29weVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgbnpTdWZmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLy8gVGhpcyBpcyBub3QgYSB0d28td2F5IGJpbmRpbmcgb3V0cHV0IHdpdGgge0BsaW5rIG56RWxsaXBzaXN9XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRWxsaXBzaXMgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQFZpZXdDaGlsZChOelRleHRFZGl0Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgdGV4dEVkaXRSZWY/OiBOelRleHRFZGl0Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKE56VGV4dENvcHlDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZXh0Q29weVJlZj86IE56VGV4dENvcHlDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2VsbGlwc2lzQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGVsbGlwc2lzQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MU3BhbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdleHBhbmRhYmxlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGV4cGFuZGFibGVCdG4/OiBFbGVtZW50UmVmPEhUTUxTcGFuRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRUZW1wbGF0ZScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZW50VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IGNvbnRlbnQ6IHN0cmluZyB9PjtcblxuICBsb2NhbGUhOiBOelRleHRJMThuSW50ZXJmYWNlO1xuICBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIGV4cGFuZGFibGVCdG5FbGVtZW50Q2FjaGU6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGVkaXRpbmcgPSBmYWxzZTtcbiAgZWxsaXBzaXNUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNzc0VsbGlwc2lzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRWxsaXBzaXM6IGJvb2xlYW4gPSB0cnVlO1xuICBleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBlbGxpcHNpc1N0ciA9ICcuLi4nO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuXG4gIGdldCBoYXNFbGxpcHNpc09ic2VydmVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uek9uRWxsaXBzaXMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgY2FuQ3NzRWxsaXBzaXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubnpFbGxpcHNpcyAmJiB0aGlzLmNzc0VsbGlwc2lzICYmICF0aGlzLmV4cGFuZGVkICYmICF0aGlzLmhhc0VsbGlwc2lzT2JzZXJ2ZXJzO1xuICB9XG5cbiAgZ2V0IGhhc09wZXJhdGlvbnNXaXRoRWxsaXBzaXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLm56Q29weWFibGUgfHwgdGhpcy5uekVkaXRhYmxlIHx8IHRoaXMubnpFeHBhbmRhYmxlKSAmJiB0aGlzLm56RWxsaXBzaXM7XG4gIH1cblxuICBwcml2YXRlIHZpZXdJbml0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmZhSWQ6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSB3aW5kb3dSZXNpemVTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIGdldCBjb3B5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodHlwZW9mIHRoaXMubnpDb3B5VGV4dCA9PT0gJ3N0cmluZycgPyB0aGlzLm56Q29weVRleHQgOiB0aGlzLm56Q29udGVudCkhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBOelNhZmVBbnksXG4gICAgcHJpdmF0ZSByZXNpemVTZXJ2aWNlOiBOelJlc2l6ZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHlcbiAgKSB7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICB9XG5cbiAgb25UZXh0Q29weSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm56Q29weS5lbWl0KHRleHQpO1xuICB9XG5cbiAgb25TdGFydEVkaXRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIG9uRW5kRWRpdGluZyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm56Q29udGVudENoYW5nZS5lbWl0KHRleHQpO1xuICAgIGlmICh0aGlzLm56Q29udGVudCA9PT0gdGV4dCkge1xuICAgICAgdGhpcy5yZW5kZXJPbk5leHRGcmFtZSgpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFbGxpcHNpcyA9IGZhbHNlO1xuICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHRoaXMubnpFeHBhbmRDaGFuZ2UuZW1pdCgpO1xuICAgIHRoaXMubnpPbkVsbGlwc2lzLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgY2FuVXNlQ1NTRWxsaXBzaXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubnpFZGl0YWJsZSB8fCB0aGlzLm56Q29weWFibGUgfHwgdGhpcy5uekV4cGFuZGFibGUgfHwgdGhpcy5uelN1ZmZpeCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBtYWtlIHN1cmUge0BsaW5rIG56T25FbGxpcHNpc30gd29ya3MsIHdpbGwgZm9yY2UgdXNlIEpTIHRvIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLmhhc0VsbGlwc2lzT2JzZXJ2ZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm56RWxsaXBzaXNSb3dzID09PSAxKSB7XG4gICAgICByZXR1cm4gaXNTdHlsZVN1cHBvcnQoJ3RleHRPdmVyZmxvdycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNTdHlsZVN1cHBvcnQoJ3dlYmtpdExpbmVDbGFtcCcpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlck9uTmV4dEZyYW1lKCk6IHZvaWQge1xuICAgIGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJmYUlkKTtcbiAgICBpZiAoIXRoaXMudmlld0luaXQgfHwgIXRoaXMubnpFbGxpcHNpcyB8fCB0aGlzLm56RWxsaXBzaXNSb3dzIDwgMCB8fCB0aGlzLmV4cGFuZGVkIHx8ICF0aGlzLnBsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJmYUlkID0gcmVxQW5pbUZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuc3luY0VsbGlwc2lzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRPcmlnaW5Db250ZW50Vmlld1JlZigpOiB7IHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjx7IGNvbnRlbnQ6IHN0cmluZyB9PjsgcmVtb3ZlVmlldygpOiB2b2lkIH0ge1xuICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3PHsgY29udGVudDogc3RyaW5nIH0+KHRoaXMuY29udGVudFRlbXBsYXRlISwge1xuICAgICAgY29udGVudDogdGhpcy5uekNvbnRlbnQhXG4gICAgfSk7XG4gICAgdmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdSZWYsXG4gICAgICByZW1vdmVWaWV3OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5yZW1vdmUodGhpcy52aWV3Q29udGFpbmVyUmVmLmluZGV4T2Yodmlld1JlZikpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzeW5jRWxsaXBzaXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3NzRWxsaXBzaXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB2aWV3UmVmLCByZW1vdmVWaWV3IH0gPSB0aGlzLmdldE9yaWdpbkNvbnRlbnRWaWV3UmVmKCk7XG4gICAgY29uc3QgZml4ZWROb2RlcyA9IFt0aGlzLnRleHRDb3B5UmVmLCB0aGlzLnRleHRFZGl0UmVmXVxuICAgICAgLmZpbHRlcihlID0+IGUgJiYgZS5uYXRpdmVFbGVtZW50KVxuICAgICAgLm1hcChlID0+IGUhLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGNvbnN0IGV4cGFuZGFibGVCdG5FbGVtZW50ID0gdGhpcy5nZXRFeHBhbmRhYmxlQnRuRWxlbWVudCgpO1xuICAgIGlmIChleHBhbmRhYmxlQnRuRWxlbWVudCkge1xuICAgICAgZml4ZWROb2Rlcy5wdXNoKGV4cGFuZGFibGVCdG5FbGVtZW50KTtcbiAgICB9XG4gICAgY29uc3QgeyBjb250ZW50Tm9kZXMsIHRleHQsIGVsbGlwc2lzIH0gPSBtZWFzdXJlKFxuICAgICAgdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm56RWxsaXBzaXNSb3dzLFxuICAgICAgdmlld1JlZi5yb290Tm9kZXMsXG4gICAgICBmaXhlZE5vZGVzLFxuICAgICAgdGhpcy5lbGxpcHNpc1N0cixcbiAgICAgIHRoaXMubnpTdWZmaXhcbiAgICApO1xuXG4gICAgcmVtb3ZlVmlldygpO1xuXG4gICAgdGhpcy5lbGxpcHNpc1RleHQgPSB0ZXh0O1xuICAgIGlmIChlbGxpcHNpcyAhPT0gdGhpcy5pc0VsbGlwc2lzKSB7XG4gICAgICB0aGlzLmlzRWxsaXBzaXMgPSBlbGxpcHNpcztcbiAgICAgIHRoaXMubnpPbkVsbGlwc2lzLmVtaXQoZWxsaXBzaXMpO1xuICAgIH1cbiAgICBjb25zdCBlbGxpcHNpc0NvbnRhaW5lck5hdGl2ZUVsZW1lbnQgPSB0aGlzLmVsbGlwc2lzQ29udGFpbmVyIS5uYXRpdmVFbGVtZW50O1xuICAgIHdoaWxlIChlbGxpcHNpc0NvbnRhaW5lck5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChlbGxpcHNpc0NvbnRhaW5lck5hdGl2ZUVsZW1lbnQsIGVsbGlwc2lzQ29udGFpbmVyTmF0aXZlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgY29udGVudE5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGVsbGlwc2lzQ29udGFpbmVyTmF0aXZlRWxlbWVudCwgbi5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gTmVlZCB0byBjcmVhdGUgdGhlIGVsZW1lbnQgZm9yIGNhbGN1bGF0aW9uIHNpemUgYmVmb3JlIHZpZXcgaW5pdFxuICBwcml2YXRlIGdldEV4cGFuZGFibGVCdG5FbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubnpFeHBhbmRhYmxlKSB7XG4gICAgICBjb25zdCBleHBhbmRUZXh0ID0gdGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5leHBhbmQgOiAnJztcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5leHBhbmRhYmxlQnRuRWxlbWVudENhY2hlO1xuICAgICAgaWYgKCFjYWNoZSB8fCBjYWNoZS5pbm5lclRleHQgPT09IGV4cGFuZFRleHQpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gRVhQQU5EX0VMRU1FTlRfQ0xBU1NOQU1FO1xuICAgICAgICBlbC5pbm5lclRleHQgPSBleHBhbmRUZXh0O1xuICAgICAgICB0aGlzLmV4cGFuZGFibGVCdG5FbGVtZW50Q2FjaGUgPSBlbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZGFibGVCdG5FbGVtZW50Q2FjaGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZUJ0bkVsZW1lbnRDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFuZFN1YnNjcmliZVdpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgIHRoaXMud2luZG93UmVzaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmNzc0VsbGlwc2lzID0gdGhpcy5jYW5Vc2VDU1NFbGxpcHNpcygpO1xuICAgICAgdGhpcy5yZW5kZXJPbk5leHRGcmFtZSgpO1xuICAgICAgdGhpcy53aW5kb3dSZXNpemVTdWJzY3JpcHRpb24gPSB0aGlzLnJlc2l6ZVNlcnZpY2VcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlbmRlck9uTmV4dEZyYW1lKCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaTE4bi5sb2NhbGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuaTE4bi5nZXRMb2NhbGVEYXRhKCdUZXh0Jyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkaXJlY3Rpb246IERpcmVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRpciA9IHRoaXMuZGlyZWN0aW9uYWxpdHkudmFsdWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3SW5pdCA9IHRydWU7XG4gICAgdGhpcy5yZW5kZXJBbmRTdWJzY3JpYmVXaW5kb3dSZXNpemUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56Q29weWFibGUsIG56RWRpdGFibGUsIG56RXhwYW5kYWJsZSwgbnpFbGxpcHNpcywgbnpDb250ZW50LCBuekVsbGlwc2lzUm93cywgbnpTdWZmaXggfSA9IGNoYW5nZXM7XG4gICAgaWYgKG56Q29weWFibGUgfHwgbnpFZGl0YWJsZSB8fCBuekV4cGFuZGFibGUgfHwgbnpFbGxpcHNpcyB8fCBuekNvbnRlbnQgfHwgbnpFbGxpcHNpc1Jvd3MgfHwgbnpTdWZmaXgpIHtcbiAgICAgIGlmICh0aGlzLm56RWxsaXBzaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLndpbmRvd1Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyQW5kU3Vic2NyaWJlV2luZG93UmVzaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXM