UNPKG

@progress/telerik-angular-native-report-viewer

Version:

Progress® Telerik® Native Report Viewer for Angular

214 lines (212 loc) 24.8 kB
import { Component, ViewChild, forwardRef, ViewEncapsulation, } from '@angular/core'; import { ToolBarToolComponent } from '@progress/kendo-angular-toolbar'; import { ComboBoxComponent } from '@progress/kendo-angular-dropdowns'; import { zoomOptionsData } from '../models/zoom-level.interface'; import { windowRestoreIcon } from '@progress/kendo-svg-icons'; import { isDocumentAvailable } from '@progress/kendo-angular-common'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "../reporting-angular-viewer.service"; import * as i2 from "@angular/common"; import * as i3 from "@progress/kendo-angular-dropdowns"; import * as i4 from "@progress/kendo-angular-dialog"; import * as i5 from "@progress/kendo-angular-icons"; import * as i6 from "@progress/kendo-angular-buttons"; export class CustomZoomComponent extends ToolBarToolComponent { constructor(service) { super(); this.service = service; this.openDialog = false; this.tabindex = -1; this.zoomOptionsData = zoomOptionsData; this.currentZoom = zoomOptionsData[5]; this.windowRestoreIcon = windowRestoreIcon; this.subs = new Subscription(); } canFocus() { return true; // marks the tools as focusable } focus() { if (!isDocumentAvailable()) return; this.tabindex = 0; if (this.overflows) { this.zoomButton?.nativeElement.focus(); } else { this.combobox?.focus(); this.combobox?.wrapper.nativeElement.focus(); } } handleKey() { this.tabindex = -1; return false; } ngAfterViewInit() { this.subs.add(this.service.onZoomChange.subscribe(zoomLevel => { this.currentZoom = zoomOptionsData?.find(zoomData => zoomData.value === zoomLevel); })); } ngOnDestroy() { this.subs.unsubscribe(); } zoomLevelChange(zoomLevel) { if (!isDocumentAvailable()) return; const defaultZoom = zoomOptionsData.filter(zoom => zoom.value === 1)[0]; if (!zoomLevel && this.currentZoom === defaultZoom) { this.currentZoom = defaultZoom; return; } if (!zoomLevel && this.currentZoom !== defaultZoom) { this.currentZoom = defaultZoom; } if (zoomLevel) this.currentZoom = zoomLevel; this.service.setScaleMode(this.getScaleModeAsNumber(this.currentZoom.type)); if (this.currentZoom.type === 'specific') { this.service.setScale(this.currentZoom.value); } } get localeMessage() { return this.service.options.messages[`ReportViewer_ToolbarZoomComboBoxPlaceholderText`]; } getScaleModeAsNumber(scaleMode) { return scaleMode === 'fitPage' ? 0 : scaleMode === 'fitPageWidth' ? 1 : 2; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomZoomComponent, deps: [{ token: i1.ReportingAngularViewerService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomZoomComponent, selector: "custom-zoom-tool", providers: [ { provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomZoomComponent) } ], viewQueries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbarTemplate"], descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "toolbarElement", first: true, predicate: ["toolbarElement"], descendants: true }, { propertyName: "popupElement", first: true, predicate: ["popupElement"], descendants: true }, { propertyName: "zoomButton", first: true, predicate: ["zoomButton"], descendants: true }, { propertyName: "combobox", first: true, predicate: ["combobox"], descendants: true, read: ComboBoxComponent }], usesInheritance: true, ngImport: i0, template: ` <ng-template #toolbarTemplate> <span #toolbarElement> <kendo-combobox #combobox textField="text" valueField="value" [tabindex]="tabindex" [placeholder]="localeMessage" [data]="zoomOptionsData" [valuePrimitive]="false" [value]="currentZoom" (valueChange)="zoomLevelChange($event)"> [title]="localeMessage" </kendo-combobox> </span> </ng-template> <ng-template #popupTemplate> <span #popupElement> <button #zoomButton kendoButton class="zoom-level-btn" fillMode="flat" [tabindex]="tabindex" (click)="openDialog = true" > <div class="zoom-level-btn-content"> <span> {{ localeMessage }} </span> <kendo-svgicon name="window-restore" [icon]="windowRestoreIcon"></kendo-svgicon> </div> </button> </span> <kendo-dialog [width]="300" [height]="120" [title]="localeMessage" *ngIf="openDialog" (close)="openDialog = false" > <kendo-dropdownlist textField="text" valueField="value" [tabindex]="tabindex" [valuePrimitive]="false" [data]="zoomOptionsData" [value]="currentZoom" [title]="localeMessage" (valueChange)="zoomLevelChange($event)" > </kendo-dropdownlist> </kendo-dialog> </ng-template> `, isInline: true, styles: [".zoom-level-btn{width:100%}.zoom-level-btn .k-button-text{width:inherit}.zoom-level-btn .zoom-level-btn-content{display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "component", type: i4.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i5.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "component", type: i3.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomZoomComponent, decorators: [{ type: Component, args: [{ providers: [ { provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomZoomComponent) } ], selector: 'custom-zoom-tool', template: ` <ng-template #toolbarTemplate> <span #toolbarElement> <kendo-combobox #combobox textField="text" valueField="value" [tabindex]="tabindex" [placeholder]="localeMessage" [data]="zoomOptionsData" [valuePrimitive]="false" [value]="currentZoom" (valueChange)="zoomLevelChange($event)"> [title]="localeMessage" </kendo-combobox> </span> </ng-template> <ng-template #popupTemplate> <span #popupElement> <button #zoomButton kendoButton class="zoom-level-btn" fillMode="flat" [tabindex]="tabindex" (click)="openDialog = true" > <div class="zoom-level-btn-content"> <span> {{ localeMessage }} </span> <kendo-svgicon name="window-restore" [icon]="windowRestoreIcon"></kendo-svgicon> </div> </button> </span> <kendo-dialog [width]="300" [height]="120" [title]="localeMessage" *ngIf="openDialog" (close)="openDialog = false" > <kendo-dropdownlist textField="text" valueField="value" [tabindex]="tabindex" [valuePrimitive]="false" [data]="zoomOptionsData" [value]="currentZoom" [title]="localeMessage" (valueChange)="zoomLevelChange($event)" > </kendo-dropdownlist> </kendo-dialog> </ng-template> `, encapsulation: ViewEncapsulation.None, styles: [".zoom-level-btn{width:100%}.zoom-level-btn .k-button-text{width:inherit}.zoom-level-btn .zoom-level-btn-content{display:flex;align-items:center;justify-content:space-between}\n"] }] }], ctorParameters: function () { return [{ type: i1.ReportingAngularViewerService }]; }, propDecorators: { toolbarTemplate: [{ type: ViewChild, args: ['toolbarTemplate', { static: true }] }], popupTemplate: [{ type: ViewChild, args: ['popupTemplate', { static: true }] }], toolbarElement: [{ type: ViewChild, args: ['toolbarElement'] }], popupElement: [{ type: ViewChild, args: ['popupElement'] }], zoomButton: [{ type: ViewChild, args: ['zoomButton'] }], combobox: [{ type: ViewChild, args: ['combobox', { read: ComboBoxComponent, static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXItdG9vbHMvem9vbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxTQUFTLEVBRVQsVUFBVSxFQUVWLGlCQUFpQixHQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUd2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFXLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7QUErRXBDLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxvQkFBb0I7SUFrQnpELFlBQW1CLE9BQXNDO1FBQ3JELEtBQUssRUFBRSxDQUFDO1FBRE8sWUFBTyxHQUFQLE9BQU8sQ0FBK0I7UUFSbEQsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixhQUFRLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsb0JBQWUsR0FBZ0IsZUFBZSxDQUFDO1FBQy9DLGdCQUFXLEdBQWMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLHNCQUFpQixHQUFZLGlCQUFpQixDQUFDO1FBRTlDLFNBQUksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUloRCxDQUFDO0lBRWUsUUFBUTtRQUNwQixPQUFPLElBQUksQ0FBQyxDQUFDLCtCQUErQjtJQUNoRCxDQUFDO0lBRWUsS0FBSztRQUNqQixJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFBRSxPQUFPO1FB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LG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDLEVBQUU7cUJBQ3hGLFlBQ1Msa0JBQWtCLFlBQ2xCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzRFQsaUJBZ0JjLGlCQUFpQixDQUFDLElBQUk7b0hBSzJCLGVBQWU7c0JBQTlFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNnQixhQUFhO3NCQUExRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1IsY0FBYztzQkFBakQsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ08sWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUNPLFVBQVU7c0JBQXpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDbUQsUUFBUTtzQkFBakYsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9vbEJhclRvb2xDb21wb25lbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10b29sYmFyJztcbmltcG9ydCB7IFJlcG9ydGluZ0FuZ3VsYXJWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vcmVwb3J0aW5nLWFuZ3VsYXItdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NhbGVNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL3R5cGVzJztcbmltcG9ydCB7IENvbWJvQm94Q29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCB7IFpvb21MZXZlbCwgem9vbU9wdGlvbnNEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL3pvb20tbGV2ZWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNWR0ljb24sIHdpbmRvd1Jlc3RvcmVJY29uIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50QXZhaWxhYmxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBUb29sQmFyVG9vbENvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tWm9vbUNvbXBvbmVudCkgfVxuICAgIF0sXG4gICAgc2VsZWN0b3I6ICdjdXN0b20tem9vbS10b29sJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxzcGFuICN0b29sYmFyRWxlbWVudD5cbiAgICAgICAgICAgICAgICA8a2VuZG8tY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgI2NvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInpvb21PcHRpb25zRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50Wm9vbVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ6b29tTGV2ZWxDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgPC9rZW5kby1jb21ib2JveD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwb3B1cFRlbXBsYXRlPlxuICAgICAgICAgICAgPHNwYW4gI3BvcHVwRWxlbWVudD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICN6b29tQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGtlbmRvQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiem9vbS1sZXZlbC1idG5cIlxuICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZT1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRpYWxvZyA9IHRydWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvb20tbGV2ZWwtYnRuLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBsb2NhbGVNZXNzYWdlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxrZW5kby1zdmdpY29uIG5hbWU9XCJ3aW5kb3ctcmVzdG9yZVwiIFtpY29uXT1cIndpbmRvd1Jlc3RvcmVJY29uXCI+PC9rZW5kby1zdmdpY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGtlbmRvLWRpYWxvZ1xuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIzMDBcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTIwXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcGVuRGlhbG9nXCJcbiAgICAgICAgICAgICAgICAoY2xvc2UpPVwib3BlbkRpYWxvZyA9IGZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0XG4gICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ6b29tT3B0aW9uc0RhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFpvb21cIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ6b29tTGV2ZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICAgICAgPC9rZW5kby1kaWFsb2c+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYCxcbiAgICBzdHlsZXM6IFtgXG4gICAgICAgIC56b29tLWxldmVsLWJ0biB7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC56b29tLWxldmVsLWJ0biAuay1idXR0b24tdGV4dCB7XG4gICAgICAgICAgICB3aWR0aDogaW5oZXJpdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC56b29tLWxldmVsLWJ0biAuem9vbS1sZXZlbC1idG4tY29udGVudCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgfVxuICAgIGBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tWm9vbUNvbXBvbmVudCBleHRlbmRzIFRvb2xCYXJUb29sQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuXG4gICAgQFZpZXdDaGlsZCgndG9vbGJhclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG92ZXJyaWRlIHRvb2xiYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ3BvcHVwVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgb3ZlcnJpZGUgcG9wdXBUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJFbGVtZW50JykgcHVibGljIHRvb2xiYXJFbGVtZW50PzogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwb3B1cEVsZW1lbnQnKSBwdWJsaWMgcG9wdXBFbGVtZW50PzogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd6b29tQnV0dG9uJykgcHVibGljIHpvb21CdXR0b24/OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbWJvYm94JywgeyByZWFkOiBDb21ib0JveENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgY29tYm9ib3g/OiBDb21ib0JveENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBvcGVuRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwdWJsaWMgem9vbU9wdGlvbnNEYXRhOiBab29tTGV2ZWxbXSA9IHpvb21PcHRpb25zRGF0YTtcbiAgICBwdWJsaWMgY3VycmVudFpvb206IFpvb21MZXZlbCA9IHpvb21PcHRpb25zRGF0YVs1XTtcbiAgICBwdWJsaWMgd2luZG93UmVzdG9yZUljb246IFNWR0ljb24gPSB3aW5kb3dSZXN0b3JlSWNvbjtcblxuICAgIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHNlcnZpY2U6IFJlcG9ydGluZ0FuZ3VsYXJWaWV3ZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNhbkZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbWFya3MgdGhlIHRvb2xzIGFzIGZvY3VzYWJsZVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLnRhYmluZGV4ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5vdmVyZmxvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbUJ1dHRvbj8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21ib2JveD8uZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuY29tYm9ib3g/LndyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGhhbmRsZUtleSgpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy50YWJpbmRleCA9IC0xO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLnNlcnZpY2Uub25ab29tQ2hhbmdlLnN1YnNjcmliZSh6b29tTGV2ZWwgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IHpvb21PcHRpb25zRGF0YT8uZmluZCh6b29tRGF0YSA9PiB6b29tRGF0YS52YWx1ZSA9PT0gem9vbUxldmVsKSBhcyBab29tTGV2ZWw7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB6b29tTGV2ZWxDaGFuZ2Uoem9vbUxldmVsOiBab29tTGV2ZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWZhdWx0Wm9vbSA9IHpvb21PcHRpb25zRGF0YS5maWx0ZXIoem9vbSA9PiB6b29tLnZhbHVlID09PSAxKVswXTtcblxuICAgICAgICBpZiAoIXpvb21MZXZlbCAmJiB0aGlzLmN1cnJlbnRab29tID09PSBkZWZhdWx0Wm9vbSkgeyBcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBkZWZhdWx0Wm9vbTsgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXpvb21MZXZlbCAmJiB0aGlzLmN1cnJlbnRab29tICE9PSBkZWZhdWx0Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IGRlZmF1bHRab29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHpvb21MZXZlbCkgdGhpcy5jdXJyZW50Wm9vbSA9IHpvb21MZXZlbDtcblxuICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0U2NhbGVNb2RlKHRoaXMuZ2V0U2NhbGVNb2RlQXNOdW1iZXIodGhpcy5jdXJyZW50Wm9vbS50eXBlIGFzIFNjYWxlTW9kZSkpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRab29tLnR5cGUgPT09ICdzcGVjaWZpYycpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRTY2FsZSg8bnVtYmVyPnRoaXMuY3VycmVudFpvb20udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2Uub3B0aW9ucy5tZXNzYWdlc1tgUmVwb3J0Vmlld2VyX1Rvb2xiYXJab29tQ29tYm9Cb3hQbGFjZWhvbGRlclRleHRgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNjYWxlTW9kZUFzTnVtYmVyKHNjYWxlTW9kZTogU2NhbGVNb2RlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlTW9kZSA9PT0gJ2ZpdFBhZ2UnID8gMCA6IHNjYWxlTW9kZSA9PT0gJ2ZpdFBhZ2VXaWR0aCcgPyAxIDogMjtcbiAgICB9XG59Il19