UNPKG

ng-zorro-antd

Version:

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

216 lines 24.3 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { OverlayModule } from '@angular/cdk/overlay'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { isPlatformBrowser, NgIf, NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, NgZone, Output, PLATFORM_ID, ViewChild, ViewEncapsulation } from '@angular/core'; import { NzOverlayModule } from 'ng-zorro-antd/core/overlay'; import { NzEmptyModule } from 'ng-zorro-antd/empty'; import { NzOptionItemGroupComponent } from './option-item-group.component'; import { NzOptionItemComponent } from './option-item.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/empty"; import * as i2 from "@angular/cdk/scrolling"; export class NzOptionContainerComponent { constructor() { this.notFoundContent = undefined; this.menuItemSelectedIcon = null; this.dropdownRender = null; this.activatedValue = null; this.listOfSelectedValue = []; this.mode = 'default'; this.matchWidth = true; this.itemSize = 32; this.maxItemLength = 8; this.isMaxLimitReached = false; this.listOfContainerItem = []; this.itemClick = new EventEmitter(); this.scrollToBottom = new EventEmitter(); this.scrolledIndex = 0; this.ngZone = inject(NgZone); this.platformId = inject(PLATFORM_ID); } onItemClick(value) { this.itemClick.emit(value); } onItemHover(value) { // TODO: keydown.enter won't activate this value this.activatedValue = value; } trackValue(_index, option) { return option.key; } onScrolledIndexChange(index) { this.scrolledIndex = index; if (index === this.listOfContainerItem.length - this.maxItemLength - 1) { this.scrollToBottom.emit(); } } scrollToActivatedValue() { const index = this.listOfContainerItem.findIndex(item => this.compareWith(item.key, this.activatedValue)); if (index < this.scrolledIndex || index >= this.scrolledIndex + this.maxItemLength) { this.cdkVirtualScrollViewport.scrollToIndex(index || 0); } } ngOnChanges(changes) { const { listOfContainerItem, activatedValue } = changes; if (listOfContainerItem || activatedValue) { this.scrollToActivatedValue(); } } ngAfterViewInit() { if (isPlatformBrowser(this.platformId)) { this.ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToActivatedValue())); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: NzOptionContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: NzOptionContainerComponent, isStandalone: true, selector: "nz-option-container", inputs: { notFoundContent: "notFoundContent", menuItemSelectedIcon: "menuItemSelectedIcon", dropdownRender: "dropdownRender", activatedValue: "activatedValue", listOfSelectedValue: "listOfSelectedValue", compareWith: "compareWith", mode: "mode", matchWidth: "matchWidth", itemSize: "itemSize", maxItemLength: "maxItemLength", isMaxLimitReached: "isMaxLimitReached", listOfContainerItem: "listOfContainerItem" }, outputs: { itemClick: "itemClick", scrollToBottom: "scrollToBottom" }, host: { classAttribute: "ant-select-dropdown" }, viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, static: true }], exportAs: ["nzOptionContainer"], usesOnChanges: true, ngImport: i0, template: ` <div> <div *ngIf="listOfContainerItem.length === 0" class="ant-select-item-empty"> <nz-embed-empty nzComponentName="select" [specificContent]="notFoundContent!"></nz-embed-empty> </div> <cdk-virtual-scroll-viewport [class.full-width]="!matchWidth" [itemSize]="itemSize" [maxBufferPx]="itemSize * maxItemLength" [minBufferPx]="itemSize * maxItemLength" (scrolledIndexChange)="onScrolledIndexChange($event)" [style.height.px]="listOfContainerItem.length * itemSize" [style.max-height.px]="itemSize * maxItemLength" > <ng-template cdkVirtualFor [cdkVirtualForOf]="listOfContainerItem" [cdkVirtualForTrackBy]="trackValue" [cdkVirtualForTemplateCacheSize]="0" let-item > <ng-container [ngSwitch]="item.type"> <nz-option-item-group *ngSwitchCase="'group'" [nzLabel]="item.groupLabel"></nz-option-item-group> <nz-option-item *ngSwitchCase="'item'" [icon]="menuItemSelectedIcon" [customContent]="item.nzCustomContent" [template]="item.template" [grouped]="!!item.groupLabel" [disabled]="item.nzDisabled || (isMaxLimitReached && !listOfSelectedValue.includes(item['nzValue']))" [showState]="mode === 'tags' || mode === 'multiple'" [title]="item.nzTitle" [label]="item.nzLabel" [compareWith]="compareWith" [activatedValue]="activatedValue" [listOfSelectedValue]="listOfSelectedValue" [value]="item.nzValue" (itemHover)="onItemHover($event)" (itemClick)="onItemClick($event)" ></nz-option-item> </ng-container> </ng-template> </cdk-virtual-scroll-viewport> <ng-template [ngTemplateOutlet]="dropdownRender"></ng-template> </div> `, isInline: true, dependencies: [{ kind: "ngmodule", type: NzEmptyModule }, { kind: "component", type: i1.NzEmbedEmptyComponent, selector: "nz-embed-empty", inputs: ["nzComponentName", "specificContent"], exportAs: ["nzEmbedEmpty"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: NzOptionItemGroupComponent, selector: "nz-option-item-group", inputs: ["nzLabel"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: NzOptionItemComponent, selector: "nz-option-item", inputs: ["grouped", "customContent", "template", "disabled", "showState", "title", "label", "value", "activatedValue", "listOfSelectedValue", "icon", "compareWith"], outputs: ["itemClick", "itemHover"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: NzOverlayModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: NzOptionContainerComponent, decorators: [{ type: Component, args: [{ selector: 'nz-option-container', exportAs: 'nzOptionContainer', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: ` <div> <div *ngIf="listOfContainerItem.length === 0" class="ant-select-item-empty"> <nz-embed-empty nzComponentName="select" [specificContent]="notFoundContent!"></nz-embed-empty> </div> <cdk-virtual-scroll-viewport [class.full-width]="!matchWidth" [itemSize]="itemSize" [maxBufferPx]="itemSize * maxItemLength" [minBufferPx]="itemSize * maxItemLength" (scrolledIndexChange)="onScrolledIndexChange($event)" [style.height.px]="listOfContainerItem.length * itemSize" [style.max-height.px]="itemSize * maxItemLength" > <ng-template cdkVirtualFor [cdkVirtualForOf]="listOfContainerItem" [cdkVirtualForTrackBy]="trackValue" [cdkVirtualForTemplateCacheSize]="0" let-item > <ng-container [ngSwitch]="item.type"> <nz-option-item-group *ngSwitchCase="'group'" [nzLabel]="item.groupLabel"></nz-option-item-group> <nz-option-item *ngSwitchCase="'item'" [icon]="menuItemSelectedIcon" [customContent]="item.nzCustomContent" [template]="item.template" [grouped]="!!item.groupLabel" [disabled]="item.nzDisabled || (isMaxLimitReached && !listOfSelectedValue.includes(item['nzValue']))" [showState]="mode === 'tags' || mode === 'multiple'" [title]="item.nzTitle" [label]="item.nzLabel" [compareWith]="compareWith" [activatedValue]="activatedValue" [listOfSelectedValue]="listOfSelectedValue" [value]="item.nzValue" (itemHover)="onItemHover($event)" (itemClick)="onItemClick($event)" ></nz-option-item> </ng-container> </ng-template> </cdk-virtual-scroll-viewport> <ng-template [ngTemplateOutlet]="dropdownRender"></ng-template> </div> `, host: { class: 'ant-select-dropdown' }, imports: [ NzEmptyModule, NgIf, NgSwitch, NzOptionItemGroupComponent, NgSwitchCase, NzOptionItemComponent, NgTemplateOutlet, OverlayModule, NzOverlayModule ], standalone: true }] }], propDecorators: { notFoundContent: [{ type: Input }], menuItemSelectedIcon: [{ type: Input }], dropdownRender: [{ type: Input }], activatedValue: [{ type: Input }], listOfSelectedValue: [{ type: Input }], compareWith: [{ type: Input }], mode: [{ type: Input }], matchWidth: [{ type: Input }], itemSize: [{ type: Input }], maxItemLength: [{ type: Input }], isMaxLimitReached: [{ type: Input }], listOfContainerItem: [{ type: Input }], itemClick: [{ type: Output }], scrollToBottom: [{ type: Output }], cdkVirtualScrollViewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3NlbGVjdC9vcHRpb24tY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBcUVoRSxNQUFNLE9BQU8sMEJBQTBCO0lBbEV2QztRQW1FVyxvQkFBZSxHQUFnRCxTQUFTLENBQUM7UUFDekUseUJBQW9CLEdBQWtDLElBQUksQ0FBQztRQUMzRCxtQkFBYyxHQUFrQyxJQUFJLENBQUM7UUFDckQsbUJBQWMsR0FBcUIsSUFBSSxDQUFDO1FBQ3hDLHdCQUFtQixHQUFnQixFQUFFLENBQUM7UUFFdEMsU0FBSSxHQUFxQixTQUFTLENBQUM7UUFDbkMsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixhQUFR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QUFtQixFQUFFLEtBQUs7b0JBQzFCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNUO29CQUNELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRTtvQkFDdEMsT0FBTyxFQUFFO3dCQUNQLGFBQWE7d0JBQ2IsSUFBSTt3QkFDSixRQUFRO3dCQUNSLDBCQUEwQjt3QkFDMUIsWUFBWTt3QkFDWixxQkFBcUI7d0JBQ3JCLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixlQUFlO3FCQUNoQjtvQkFDRCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBRVUsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNhLFNBQVM7c0JBQTNCLE1BQU07Z0JBQ1ksY0FBYztzQkFBaEMsTUFBTTtnQkFDZ0Qsd0JBQXdCO3NCQUE5RSxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyLCBOZ0lmLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOek92ZXJsYXlNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvb3ZlcmxheSc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpFbXB0eU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZW1wdHknO1xuXG5pbXBvcnQgeyBOek9wdGlvbkl0ZW1Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vb3B0aW9uLWl0ZW0tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IE56T3B0aW9uSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vb3B0aW9uLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IE56U2VsZWN0SXRlbUludGVyZmFjZSwgTnpTZWxlY3RNb2RlVHlwZSB9IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotb3B0aW9uLWNvbnRhaW5lcicsXG4gIGV4cG9ydEFzOiAnbnpPcHRpb25Db250YWluZXInLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJsaXN0T2ZDb250YWluZXJJdGVtLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiYW50LXNlbGVjdC1pdGVtLWVtcHR5XCI+XG4gICAgICAgIDxuei1lbWJlZC1lbXB0eSBuekNvbXBvbmVudE5hbWU9XCJzZWxlY3RcIiBbc3BlY2lmaWNDb250ZW50XT1cIm5vdEZvdW5kQ29udGVudCFcIj48L256LWVtYmVkLWVtcHR5PlxuICAgICAgPC9kaXY+XG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgIFtjbGFzcy5mdWxsLXdpZHRoXT1cIiFtYXRjaFdpZHRoXCJcbiAgICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcbiAgICAgICAgW21heEJ1ZmZlclB4XT1cIml0ZW1TaXplICogbWF4SXRlbUxlbmd0aFwiXG4gICAgICAgIFttaW5CdWZmZXJQeF09XCJpdGVtU2l6ZSAqIG1heEl0ZW1MZW5ndGhcIlxuICAgICAgICAoc2Nyb2xsZWRJbmRleENoYW5nZSk9XCJvblNjcm9sbGVkSW5kZXhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibGlzdE9mQ29udGFpbmVySXRlbS5sZW5ndGggKiBpdGVtU2l6ZVwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cIml0ZW1TaXplICogbWF4SXRlbUxlbmd0aFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGNka1ZpcnR1YWxGb3JcbiAgICAgICAgICBbY2RrVmlydHVhbEZvck9mXT1cImxpc3RPZkNvbnRhaW5lckl0ZW1cIlxuICAgICAgICAgIFtjZGtWaXJ0dWFsRm9yVHJhY2tCeV09XCJ0cmFja1ZhbHVlXCJcbiAgICAgICAgICBbY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplXT1cIjBcIlxuICAgICAgICAgIGxldC1pdGVtXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpdGVtLnR5cGVcIj5cbiAgICAgICAgICAgIDxuei1vcHRpb24taXRlbS1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiIFtuekxhYmVsXT1cIml0ZW0uZ3JvdXBMYWJlbFwiPjwvbnotb3B0aW9uLWl0ZW0tZ3JvdXA+XG4gICAgICAgICAgICA8bnotb3B0aW9uLWl0ZW1cbiAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidpdGVtJ1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIm1lbnVJdGVtU2VsZWN0ZWRJY29uXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNvbnRlbnRdPVwiaXRlbS5uekN1c3RvbUNvbnRlbnRcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiaXRlbS50ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtncm91cGVkXT1cIiEhaXRlbS5ncm91cExhYmVsXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIml0ZW0ubnpEaXNhYmxlZCB8fCAoaXNNYXhMaW1pdFJlYWNoZWQgJiYgIWxpc3RPZlNlbGVjdGVkVmFsdWUuaW5jbHVkZXMoaXRlbVsnbnpWYWx1ZSddKSlcIlxuICAgICAgICAgICAgICBbc2hvd1N0YXRlXT1cIm1vZGUgPT09ICd0YWdzJyB8fCBtb2RlID09PSAnbXVsdGlwbGUnXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW0ubnpUaXRsZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLm56TGFiZWxcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZVdpdGhcIlxuICAgICAgICAgICAgICBbYWN0aXZhdGVkVmFsdWVdPVwiYWN0aXZhdGVkVmFsdWVcIlxuICAgICAgICAgICAgICBbbGlzdE9mU2VsZWN0ZWRWYWx1ZV09XCJsaXN0T2ZTZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0ubnpWYWx1ZVwiXG4gICAgICAgICAgICAgIChpdGVtSG92ZXIpPVwib25JdGVtSG92ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChpdGVtQ2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9uei1vcHRpb24taXRlbT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRyb3Bkb3duUmVuZGVyXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgaG9zdDogeyBjbGFzczogJ2FudC1zZWxlY3QtZHJvcGRvd24nIH0sXG4gIGltcG9ydHM6IFtcbiAgICBOekVtcHR5TW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdTd2l0Y2gsXG4gICAgTnpPcHRpb25JdGVtR3JvdXBDb21wb25lbnQsXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIE56T3B0aW9uSXRlbUNvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE92ZXJsYXlNb2R1bGUsXG4gICAgTnpPdmVybGF5TW9kdWxlXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpPcHRpb25Db250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBub3RGb3VuZENvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG1lbnVJdGVtU2VsZWN0ZWRJY29uOiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRyb3Bkb3duUmVuZGVyOiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGFjdGl2YXRlZFZhbHVlOiBOelNhZmVBbnkgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGlzdE9mU2VsZWN0ZWRWYWx1ZTogTnpTYWZlQW55W10gPSBbXTtcbiAgQElucHV0KCkgY29tcGFyZVdpdGghOiAobzE6IE56U2FmZUFueSwgbzI6IE56U2FmZUFueSkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgbW9kZTogTnpTZWxlY3RNb2RlVHlwZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgbWF0Y2hXaWR0aCA9IHRydWU7XG4gIEBJbnB1dCgpIGl0ZW1TaXplID0gMzI7XG4gIEBJbnB1dCgpIG1heEl0ZW1MZW5ndGggPSA4O1xuICBASW5wdXQoKSBpc01heExpbWl0UmVhY2hlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBsaXN0T2ZDb250YWluZXJJdGVtOiBOelNlbGVjdEl0ZW1JbnRlcmZhY2VbXSA9IFtdO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxOelNhZmVBbnk+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzY3JvbGxUb0JvdHRvbSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIHsgc3RhdGljOiB0cnVlIH0pIGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCE6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgcHJpdmF0ZSBzY3JvbGxlZEluZGV4ID0gMDtcbiAgcHJpdmF0ZSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcblxuICBvbkl0ZW1DbGljayh2YWx1ZTogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkl0ZW1Ib3Zlcih2YWx1ZTogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgLy8gVE9ETzoga2V5ZG93bi5lbnRlciB3b24ndCBhY3RpdmF0ZSB0aGlzIHZhbHVlXG4gICAgdGhpcy5hY3RpdmF0ZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgdHJhY2tWYWx1ZShfaW5kZXg6IG51bWJlciwgb3B0aW9uOiBOelNlbGVjdEl0ZW1JbnRlcmZhY2UpOiBOelNhZmVBbnkge1xuICAgIHJldHVybiBvcHRpb24ua2V5O1xuICB9XG5cbiAgb25TY3JvbGxlZEluZGV4Q2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbGVkSW5kZXggPSBpbmRleDtcbiAgICBpZiAoaW5kZXggPT09IHRoaXMubGlzdE9mQ29udGFpbmVySXRlbS5sZW5ndGggLSB0aGlzLm1heEl0ZW1MZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBzY3JvbGxUb0FjdGl2YXRlZFZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0T2ZDb250YWluZXJJdGVtLmZpbmRJbmRleChpdGVtID0+IHRoaXMuY29tcGFyZVdpdGgoaXRlbS5rZXksIHRoaXMuYWN0aXZhdGVkVmFsdWUpKTtcbiAgICBpZiAoaW5kZXggPCB0aGlzLnNjcm9sbGVkSW5kZXggfHwgaW5kZXggPj0gdGhpcy5zY3JvbGxlZEluZGV4ICsgdGhpcy5tYXhJdGVtTGVuZ3RoKSB7XG4gICAgICB0aGlzLmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4IHx8IDApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGxpc3RPZkNvbnRhaW5lckl0ZW0sIGFjdGl2YXRlZFZhbHVlIH0gPSBjaGFuZ2VzO1xuICAgIGlmIChsaXN0T2ZDb250YWluZXJJdGVtIHx8IGFjdGl2YXRlZFZhbHVlKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvQWN0aXZhdGVkVmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0FjdGl2YXRlZFZhbHVlKCkpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==