@progress/telerik-angular-native-report-viewer
Version:
Progress® Telerik® Native Report Viewer for Angular
271 lines • 32 kB
JavaScript
import { Component, Input, ViewChild, forwardRef, ViewChildren, } from '@angular/core';
import { ToolBarToolComponent } from '@progress/kendo-angular-toolbar';
import { PagerComponent } from '@progress/kendo-angular-pager';
import { caretAltLeftIcon, caretAltRightIcon, caretAltToLeftIcon, caretAltToRightIcon } from '@progress/kendo-svg-icons';
import { isDocumentAvailable } from '@progress/kendo-angular-common';
import * as i0 from "@angular/core";
import * as i1 from "../reporting-angular-viewer.service";
import * as i2 from "@progress/kendo-angular-pager";
import * as i3 from "@progress/kendo-angular-buttons";
export class CustomPagerToolComponent extends ToolBarToolComponent {
constructor(service) {
super();
this.service = service;
this.totalPages = 1;
this.disabled = false;
this.tabindex = -1;
this.prevKey = 38;
this.nextKey = 40;
this.focusedIndex = -1;
this.caretAltToLeftIcon = caretAltToLeftIcon;
this.caretAltLeftIcon = caretAltLeftIcon;
this.caretAltRightIcon = caretAltRightIcon;
this.caretAltToRightIcon = caretAltToRightIcon;
this.getIndexOfFocused = (prevKeyCode, nextKeyCode, collection) => (ev) => {
switch (ev.type) {
case 'keydown':
if (ev.keyCode === prevKeyCode) {
return collection.length - 1;
}
if (ev.keyCode === nextKeyCode) {
return 0;
}
break;
case 'click':
return collection.findIndex(be => be === ev.target || be.contains(ev.target));
case 'focus':
return 0;
default:
return 0;
}
};
this.seekFocusedIndex = (prevKeyCode, nextKeyCode, seeker) => (startIndex, ev) => {
switch (ev.keyCode) {
case prevKeyCode:
return seeker(startIndex - 1) ? startIndex - 1 : startIndex;
case nextKeyCode:
return seeker(startIndex + 1) ? startIndex + 1 : startIndex;
default:
return startIndex;
}
};
this.isPresent = (value) => value !== null && value !== undefined;
this.makePeeker = (collection) => (index) => this.isPresent(collection[index]);
this.areEqual = (first) => (second) => first === second;
}
canFocus() {
return true;
}
focus(ev) {
this.tabindex = 0;
if (this.overflows) {
if (!isDocumentAvailable())
return;
if (ev) {
this.focusedIndex = this.getIndexOfFocused(this.prevKey, this.nextKey, this.buttonElements)(ev);
this.focusButton(this.focusedIndex, ev);
}
}
else {
this.pager?.['element'].nativeElement.focus();
}
}
handleKey(ev) {
if (this.overflows && isDocumentAvailable()) {
const peekAtIndex = this.makePeeker(this.buttonElements);
const isUnmodified = this.areEqual(this.focusedIndex);
this.focusedIndex = this.seekFocusedIndex(this.prevKey, this.nextKey, peekAtIndex)(this.focusedIndex, ev);
this.focusButton(this.focusedIndex, ev);
return !isUnmodified(this.focusedIndex);
}
this.tabindex = -1;
return false;
}
overflowNavButton(pageIndex) {
this.service.currentPageIndex = pageIndex;
this.service.controller?.navigateToPage(this.service.getPageNumber(), undefined);
}
getLocaleMessage(message) {
return this.service.options.messages[`ReportViewer_Toolbar${message}Title`];
}
onPageChange(e) {
this.service.currentPageIndex = e.skip;
this.service.controller?.navigateToPage(this.service.getPageNumber(), undefined);
}
get buttonElements() {
return [...this.navButtons.toArray().filter(el => !el.nativeElement.classList.contains('k-disabled'))].map(el => el.nativeElement);
}
focusButton(index, ev) {
// Guard against focusing twice on mousedown.
if (!ev.type || ev.type === 'focus' || ev.type === 'keydown') {
this.buttonElements[index]?.focus();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomPagerToolComponent, deps: [{ token: i1.ReportingAngularViewerService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomPagerToolComponent, selector: "custom-pager-tool", inputs: { totalPages: "totalPages", disabled: "disabled" }, providers: [{ provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomPagerToolComponent) }], 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: "pager", first: true, predicate: ["pager"], descendants: true, read: PagerComponent }, { propertyName: "navButtons", predicate: ["navButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
<ng-template #toolbarTemplate>
<span #toolbarElement>
<kendo-datapager #pager
fillMode="flat"
[class]="{'k-disabled' : this.disabled}"
[tabindex]="tabindex"
[pageSize]="1"
[skip]="service.currentPageIndex"
[total]="service.totalPages"
[pageSizeValues]="false"
[info]="false"
[previousNext]="true"
type="input"
(pageChange)="onPageChange($event)"
>
</kendo-datapager>
</span>
</ng-template>
<ng-template #popupTemplate>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-end-left"
[svgIcon]="caretAltToLeftIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === 0"
[title]="getLocaleMessage('FirstPage')"
(click)="overflowNavButton(0)"
fillMode="flat"> {{ getLocaleMessage('FirstPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-60-left"
[svgIcon]="caretAltLeftIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === 0"
[title]="getLocaleMessage('PreviousPage')"
(click)="overflowNavButton(service.currentPageIndex - 1)"
fillMode="flat"> {{ getLocaleMessage('PreviousPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-60-right"
[svgIcon]="caretAltRightIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === service.totalPages - 1"
[title]="getLocaleMessage('NextPage')"
(click)="overflowNavButton(service.currentPageIndex + 1)"
fillMode="flat"> {{ getLocaleMessage('NextPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-end-right"
[svgIcon]="caretAltToRightIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === service.totalPages - 1"
[title]="getLocaleMessage('LastPage')"
(click)="overflowNavButton(service.totalPages - 1)"
fillMode="flat"> {{ getLocaleMessage('LastPage') }}
</button>
</ng-template>
`, isInline: true, styles: [".toolbar-nav-btn{width:100%;justify-content:start}\n"], dependencies: [{ kind: "component", type: i2.PagerComponent, selector: "kendo-datapager, kendo-pager", inputs: ["externalTemplate", "total", "skip", "pageSize", "buttonCount", "info", "type", "pageSizeValues", "previousNext", "navigable", "size", "responsive"], outputs: ["pageChange", "pageSizeChange"], exportAs: ["kendoDataPager", "kendoPager"] }, { kind: "component", type: i3.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"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomPagerToolComponent, decorators: [{
type: Component,
args: [{ providers: [{ provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomPagerToolComponent) }], selector: 'custom-pager-tool', template: `
<ng-template #toolbarTemplate>
<span #toolbarElement>
<kendo-datapager #pager
fillMode="flat"
[class]="{'k-disabled' : this.disabled}"
[tabindex]="tabindex"
[pageSize]="1"
[skip]="service.currentPageIndex"
[total]="service.totalPages"
[pageSizeValues]="false"
[info]="false"
[previousNext]="true"
type="input"
(pageChange)="onPageChange($event)"
>
</kendo-datapager>
</span>
</ng-template>
<ng-template #popupTemplate>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-end-left"
[svgIcon]="caretAltToLeftIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === 0"
[title]="getLocaleMessage('FirstPage')"
(click)="overflowNavButton(0)"
fillMode="flat"> {{ getLocaleMessage('FirstPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-60-left"
[svgIcon]="caretAltLeftIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === 0"
[title]="getLocaleMessage('PreviousPage')"
(click)="overflowNavButton(service.currentPageIndex - 1)"
fillMode="flat"> {{ getLocaleMessage('PreviousPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-60-right"
[svgIcon]="caretAltRightIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === service.totalPages - 1"
[title]="getLocaleMessage('NextPage')"
(click)="overflowNavButton(service.currentPageIndex + 1)"
fillMode="flat"> {{ getLocaleMessage('NextPage') }}
</button>
<button
#navButton
kendoButton
class="toolbar-nav-btn"
icon="arrow-end-right"
[svgIcon]="caretAltToRightIcon"
[tabindex]="tabindex"
[disabled]="service.totalPages <= 1 || service.currentPageIndex === service.totalPages - 1"
[title]="getLocaleMessage('LastPage')"
(click)="overflowNavButton(service.totalPages - 1)"
fillMode="flat"> {{ getLocaleMessage('LastPage') }}
</button>
</ng-template>
`, styles: [".toolbar-nav-btn{width:100%;justify-content:start}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ReportingAngularViewerService }]; }, propDecorators: { totalPages: [{
type: Input
}], disabled: [{
type: Input
}], toolbarTemplate: [{
type: ViewChild,
args: ['toolbarTemplate', { static: true }]
}], popupTemplate: [{
type: ViewChild,
args: ['popupTemplate', { static: true }]
}], toolbarElement: [{
type: ViewChild,
args: ['toolbarElement']
}], popupElement: [{
type: ViewChild,
args: ['popupElement']
}], pager: [{
type: ViewChild,
args: ['pager', { read: PagerComponent, static: false }]
}], navButtons: [{
type: ViewChildren,
args: ['navButton']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyLXRvb2xzL3BhZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBRVQsVUFBVSxFQUNWLFlBQVksR0FFZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RSxPQUFPLEVBQW1CLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hGLE9BQU8sRUFFSCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDdEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7QUFrRnJFLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxvQkFBb0I7SUFvQjlELFlBQW1CLE9BQXNDO1FBQ3JELEtBQUssRUFBRSxDQUFDO1FBRE8sWUFBTyxHQUFQLE9BQU8sQ0FBK0I7UUFuQnpDLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQVNuQyxhQUFRLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsWUFBTyxHQUFXLEVBQUUsQ0FBQTtRQUNwQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGlCQUFZLEdBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdkIsdUJBQWtCLEdBQVksa0JBQWtCLENBQUM7UUFDakQscUJBQWdCLEdBQVksZ0JBQWdCLENBQUM7UUFDN0Msc0JBQWlCLEdBQVksaUJBQWlCLENBQUM7UUFDL0Msd0JBQW1CLEdBQVksbUJBQW1CLENBQUM7UUFrRWxELHNCQUFpQixHQUFHLENBQUMsV0FBbUIsRUFBRSxXQUFtQixFQUFFLFVBQXlCLEVBQU8sRUFB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QTlFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNnQixhQUFhO3NCQUExRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1IsY0FBYztzQkFBakQsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ08sWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUMyQyxLQUFLO3NCQUF4RSxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDekIsVUFBVTtzQkFBM0MsWUFBWTt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvb2xCYXJUb29sQ29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdG9vbGJhcic7XG5pbXBvcnQgeyBSZXBvcnRpbmdBbmd1bGFyVmlld2VyU2VydmljZSB9IGZyb20gJy4uL3JlcG9ydGluZy1hbmd1bGFyLXZpZXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VDaGFuZ2VFdmVudCwgUGFnZXJDb21wb25lbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1wYWdlcic7XG5pbXBvcnQge1xuICAgIFNWR0ljb24sXG4gICAgY2FyZXRBbHRMZWZ0SWNvbixcbiAgICBjYXJldEFsdFJpZ2h0SWNvbixcbiAgICBjYXJldEFsdFRvTGVmdEljb24sXG4gICAgY2FyZXRBbHRUb1JpZ2h0SWNvblxufSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tc3ZnLWljb25zJztcbmltcG9ydCB7IGlzRG9jdW1lbnRBdmFpbGFibGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFRvb2xCYXJUb29sQ29tcG9uZW50LCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDdXN0b21QYWdlclRvb2xDb21wb25lbnQpIH1dLFxuICAgIHNlbGVjdG9yOiAnY3VzdG9tLXBhZ2VyLXRvb2wnLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhclRlbXBsYXRlPlxuICAgICAgICAgICAgPHNwYW4gI3Rvb2xiYXJFbGVtZW50PlxuICAgICAgICAgICAgICAgIDxrZW5kby1kYXRhcGFnZXIgI3BhZ2VyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlPVwiZmxhdFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJ7J2stZGlzYWJsZWQnIDogdGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgIFtza2lwXT1cInNlcnZpY2UuY3VycmVudFBhZ2VJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFt0b3RhbF09XCJzZXJ2aWNlLnRvdGFsUGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVWYWx1ZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbaW5mb109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwcmV2aW91c05leHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tZGF0YXBhZ2VyPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3BvcHVwVGVtcGxhdGU+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgI25hdkJ1dHRvblxuICAgICAgICAgICAgICAgIGtlbmRvQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sYmFyLW5hdi1idG5cIlxuICAgICAgICAgICAgICAgIGljb249XCJhcnJvdy1lbmQtbGVmdFwiXG4gICAgICAgICAgICAgICAgW3N2Z0ljb25dPVwiY2FyZXRBbHRUb0xlZnRJY29uXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZXJ2aWNlLnRvdGFsUGFnZXMgPD0gMSB8fCBzZXJ2aWNlLmN1cnJlbnRQYWdlSW5kZXggPT09IDBcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRMb2NhbGVNZXNzYWdlKCdGaXJzdFBhZ2UnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm92ZXJmbG93TmF2QnV0dG9uKDApXCJcbiAgICAgICAgICAgICAgICBmaWxsTW9kZT1cImZsYXRcIj4ge3sgZ2V0TG9jYWxlTWVzc2FnZSgnRmlyc3RQYWdlJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICNuYXZCdXR0b25cbiAgICAgICAgICAgICAgICBrZW5kb0J1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidG9vbGJhci1uYXYtYnRuXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctNjAtbGVmdFwiXG4gICAgICAgICAgICAgICAgW3N2Z0ljb25dPVwiY2FyZXRBbHRMZWZ0SWNvblwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VydmljZS50b3RhbFBhZ2VzIDw9IDEgfHwgc2VydmljZS5jdXJyZW50UGFnZUluZGV4ID09PSAwXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0TG9jYWxlTWVzc2FnZSgnUHJldmlvdXNQYWdlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvdmVyZmxvd05hdkJ1dHRvbihzZXJ2aWNlLmN1cnJlbnRQYWdlSW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgICAgZmlsbE1vZGU9XCJmbGF0XCI+IHt7IGdldExvY2FsZU1lc3NhZ2UoJ1ByZXZpb3VzUGFnZScpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjbmF2QnV0dG9uXG4gICAgICAgICAgICAgICAga2VuZG9CdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRvb2xiYXItbmF2LWJ0blwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImFycm93LTYwLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICBbc3ZnSWNvbl09XCJjYXJldEFsdFJpZ2h0SWNvblwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VydmljZS50b3RhbFBhZ2VzIDw9IDEgfHwgc2VydmljZS5jdXJyZW50UGFnZUluZGV4ID09PSBzZXJ2aWNlLnRvdGFsUGFnZXMgLSAxXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0TG9jYWxlTWVzc2FnZSgnTmV4dFBhZ2UnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm92ZXJmbG93TmF2QnV0dG9uKHNlcnZpY2UuY3VycmVudFBhZ2VJbmRleCArIDEpXCJcbiAgICAgICAgICAgICAgICBmaWxsTW9kZT1cImZsYXRcIj4ge3sgZ2V0TG9jYWxlTWVzc2FnZSgnTmV4dFBhZ2UnKSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgI25hdkJ1dHRvblxuICAgICAgICAgICAgICAgIGtlbmRvQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sYmFyLW5hdi1idG5cIlxuICAgICAgICAgICAgICAgIGljb249XCJhcnJvdy1lbmQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cImNhcmV0QWx0VG9SaWdodEljb25cIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlcnZpY2UudG90YWxQYWdlcyA8PSAxIHx8IHNlcnZpY2UuY3VycmVudFBhZ2VJbmRleCA9PT0gc2VydmljZS50b3RhbFBhZ2VzIC0gMVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldExvY2FsZU1lc3NhZ2UoJ0xhc3RQYWdlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvdmVyZmxvd05hdkJ1dHRvbihzZXJ2aWNlLnRvdGFsUGFnZXMgLSAxKVwiXG4gICAgICAgICAgICAgICAgZmlsbE1vZGU9XCJmbGF0XCI+IHt7IGdldExvY2FsZU1lc3NhZ2UoJ0xhc3RQYWdlJykgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgc3R5bGVzOiBbYFxuICAgICAgICAudG9vbGJhci1uYXYtYnRuIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgICAgICAgfVxuICAgIGBdXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVBhZ2VyVG9vbENvbXBvbmVudCBleHRlbmRzIFRvb2xCYXJUb29sQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgdG90YWxQYWdlczogbnVtYmVyID0gMTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBvdmVycmlkZSB0b29sYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBAVmlld0NoaWxkKCdwb3B1cFRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG92ZXJyaWRlIHBvcHVwVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBAVmlld0NoaWxkKCd0b29sYmFyRWxlbWVudCcpIHB1YmxpYyB0b29sYmFyRWxlbWVudD86IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncG9wdXBFbGVtZW50JykgcHVibGljIHBvcHVwRWxlbWVudD86IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncGFnZXInLCB7IHJlYWQ6IFBhZ2VyQ29tcG9uZW50LCBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBwYWdlcj86IFBhZ2VyQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGRyZW4oJ25hdkJ1dHRvbicpIHB1YmxpYyBuYXZCdXR0b25zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+XG5cbiAgICBwdWJsaWMgdGFiaW5kZXg6IG51bWJlciA9IC0xO1xuICAgIHB1YmxpYyBwcmV2S2V5OiBudW1iZXIgPSAzOFxuICAgIHB1YmxpYyBuZXh0S2V5OiBudW1iZXIgPSA0MDtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4OiBhbnkgPSAtMTtcbiAgICBwdWJsaWMgY2FyZXRBbHRUb0xlZnRJY29uOiBTVkdJY29uID0gY2FyZXRBbHRUb0xlZnRJY29uO1xuICAgIHB1YmxpYyBjYXJldEFsdExlZnRJY29uOiBTVkdJY29uID0gY2FyZXRBbHRMZWZ0SWNvbjtcbiAgICBwdWJsaWMgY2FyZXRBbHRSaWdodEljb246IFNWR0ljb24gPSBjYXJldEFsdFJpZ2h0SWNvbjtcbiAgICBwdWJsaWMgY2FyZXRBbHRUb1JpZ2h0SWNvbjogU1ZHSWNvbiA9IGNhcmV0QWx0VG9SaWdodEljb247XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgc2VydmljZTogUmVwb3J0aW5nQW5ndWxhclZpZXdlclNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY2FuRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBmb2N1cyhldjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFiaW5kZXggPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93cykge1xuICAgICAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGV2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXggPSB0aGlzLmdldEluZGV4T2ZGb2N1c2VkKHRoaXMucHJldktleSwgdGhpcy5uZXh0S2V5LCB0aGlzLmJ1dHRvbkVsZW1lbnRzKShldik7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0J1dHRvbih0aGlzLmZvY3VzZWRJbmRleCwgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWdlcj8uWydlbGVtZW50J10ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGhhbmRsZUtleShldjogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93cyAmJiBpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHtcblxuICAgICAgICAgICAgY29uc3QgcGVla0F0SW5kZXggPSB0aGlzLm1ha2VQZWVrZXIodGhpcy5idXR0b25FbGVtZW50cyk7XG4gICAgICAgICAgICBjb25zdCBpc1VubW9kaWZpZWQgPSB0aGlzLmFyZUVxdWFsKHRoaXMuZm9jdXNlZEluZGV4KTtcblxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXggPSB0aGlzLnNlZWtGb2N1c2VkSW5kZXgodGhpcy5wcmV2S2V5LCB0aGlzLm5leHRLZXksIHBlZWtBdEluZGV4KSh0aGlzLmZvY3VzZWRJbmRleCwgZXYpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0J1dHRvbih0aGlzLmZvY3VzZWRJbmRleCwgZXYpO1xuXG4gICAgICAgICAgICByZXR1cm4gIWlzVW5tb2RpZmllZCh0aGlzLmZvY3VzZWRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJpbmRleCA9IC0xO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcmZsb3dOYXZCdXR0b24ocGFnZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmN1cnJlbnRQYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgICAgIHRoaXMuc2VydmljZS5jb250cm9sbGVyPy5uYXZpZ2F0ZVRvUGFnZSh0aGlzLnNlcnZpY2UuZ2V0UGFnZU51bWJlcigpLCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMb2NhbGVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2Uub3B0aW9ucy5tZXNzYWdlc1tgUmVwb3J0Vmlld2VyX1Rvb2xiYXIke21lc3NhZ2V9VGl0bGVgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25QYWdlQ2hhbmdlKGU6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY3VycmVudFBhZ2VJbmRleCA9IGUuc2tpcDtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmNvbnRyb2xsZXI/Lm5hdmlnYXRlVG9QYWdlKHRoaXMuc2VydmljZS5nZXRQYWdlTnVtYmVyKCksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgYnV0dG9uRWxlbWVudHMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5uYXZCdXR0b25zLnRvQXJyYXkoKS5maWx0ZXIoZWwgPT4gIWVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdrLWRpc2FibGVkJykpXS5tYXAoZWwgPT4gZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0J1dHRvbihpbmRleDogbnVtYmVyLCBldjogUGFydGlhbDxFdmVudD4pOiB2b2lkIHtcbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBmb2N1c2luZyB0d2ljZSBvbiBtb3VzZWRvd24uXG4gICAgICAgIGlmICghZXYudHlwZSB8fCBldi50eXBlID09PSAnZm9jdXMnIHx8IGV2LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgdGhpcy5idXR0b25FbGVtZW50c1tpbmRleF0/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluZGV4T2ZGb2N1c2VkID0gKHByZXZLZXlDb2RlOiBudW1iZXIsIG5leHRLZXlDb2RlOiBudW1iZXIsIGNvbGxlY3Rpb246IEhUTUxFbGVtZW50W10pOiBhbnkgPT4gKGV2OiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGV2LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgICAgICAgICAgIGlmIChldi5rZXlDb2RlID09PSBwcmV2S2V5Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gbmV4dEtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIFxuICAgICAgICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmZpbmRJbmRleChiZSA9PiBiZSA9PT0gZXYudGFyZ2V0IHx8IGJlLmNvbnRhaW5zKGV2LnRhcmdldCBhcyBOb2RlKSk7XG4gICAgXG4gICAgICAgICAgICBjYXNlICdmb2N1cyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2Vla0ZvY3VzZWRJbmRleCA9IChwcmV2S2V5Q29kZTogbnVtYmVyLCBuZXh0S2V5Q29kZTogbnVtYmVyLCBzZWVrZXI6IChpOiBudW1iZXIpID0+IGJvb2xlYW4pID0+IChcbiAgICAgICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICBldjogYW55XG4gICAgKTogbnVtYmVyID0+IHtcbiAgICAgICAgc3dpdGNoIChldi5rZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIHByZXZLZXlDb2RlOlxuICAgICAgICAgICAgICAgIHJldHVybiBzZWVrZXIoc3RhcnRJbmRleCAtIDEpID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICAgICAgICAgICAgY2FzZSBuZXh0S2V5Q29kZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gc2Vla2VyKHN0YXJ0SW5kZXggKyAxKSA/IHN0YXJ0SW5kZXggKyAxIDogc3RhcnRJbmRleDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBpc1ByZXNlbnQ6IEZ1bmN0aW9uID0gKHZhbHVlOiBhbnkpOiBib29sZWFuID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBtYWtlUGVla2VyID0gKGNvbGxlY3Rpb246IGFueVtdKSA9PiAoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4gdGhpcy5pc1ByZXNlbnQoY29sbGVjdGlvbltpbmRleF0pO1xuICAgIHByaXZhdGUgYXJlRXF1YWwgPSAoZmlyc3Q6IG51bWJlcikgPT4gKHNlY29uZDogbnVtYmVyKTogYm9vbGVhbiA9PiBmaXJzdCA9PT0gc2Vjb25kO1xufSJdfQ==