raain-app 1.6.27 → 1.6.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.6.28] - 2026-02-02
11
+
12
+ ### Fixed
13
+
14
+ - [RAD-149] Speed display race condition when navigating forward/backward between timestamps
15
+ - [RAD-149] RefreshManager: Synchronized refreshCompareQuality() with timestamp updates
16
+
17
+ ## [1.6.27] - 2026-01-22
18
+
10
19
  ## [1.6.26] - 2026-01-22
11
20
 
12
21
  ## [1.6.24] - 2026-01-19
@@ -57,10 +57,10 @@ export class RaainCompareStackComponent {
57
57
  }
58
58
  }
59
59
  RaainCompareStackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainCompareStackComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
60
- RaainCompareStackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainCompareStackComponent, selector: "raain-compare-stack", inputs: { compareManager: "compareManager", currentHeight: "currentHeight", cumulative: "cumulative" }, outputs: { selectedPoint: "selectedPoint" }, ngImport: i0, template: "<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"outline\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"outline\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n", styles: ["#card-matrix{width:170px}.card-compare{min-width:300px}ion-card-header{padding:0 0 0 10px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.RaainCompareComponent, selector: "raain-compare", inputs: ["points", "pointMax", "remarks", "compareIndex", "currentHeight", "currentWidth"], outputs: ["selectedPoint"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
60
+ RaainCompareStackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainCompareStackComponent, selector: "raain-compare-stack", inputs: { compareManager: "compareManager", currentHeight: "currentHeight", cumulative: "cumulative" }, outputs: { selectedPoint: "selectedPoint" }, ngImport: i0, template: "<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.globalQualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compareManager.globalQualityIndicator >= 0.5,\n 'quality-medium': compareManager.globalQualityIndicator < 0.5 && compareManager.globalQualityIndicator >= 0,\n 'quality-bad': compareManager.globalQualityIndicator < 0\n }\">\n Quality: {{ compareManager.globalQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"outline\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n <span *ngIf=\"compare.qualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compare.qualityIndicator >= 0.5,\n 'quality-medium': compare.qualityIndicator < 0.5 && compare.qualityIndicator >= 0,\n 'quality-bad': compare.qualityIndicator < 0\n }\">\n Quality: {{ compare.qualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"outline\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n\n <!-- Cumulative summary of all granular comparisons -->\n <ion-col size-md=\"6\" size-xs=\"12\" *ngIf=\"compareManager.granularCumulativePoints?.length\">\n <ion-card class=\"card-compare card-compare-cumulative\">\n <ion-card-header>Cumulative Summary\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.granularCumulativeQualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compareManager.granularCumulativeQualityIndicator >= 0.5,\n 'quality-medium': compareManager.granularCumulativeQualityIndicator < 0.5 && compareManager.granularCumulativeQualityIndicator >= 0,\n 'quality-bad': compareManager.granularCumulativeQualityIndicator < 0\n }\">\n Quality: {{ compareManager.granularCumulativeQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content>\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"-1\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.granularCumulativePointsMax\"\n [points]=\"compareManager.granularCumulativePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n</div>\n", styles: ["#card-matrix{width:170px}.card-compare{min-width:300px}.card-compare-cumulative{border:2px solid var(--ion-color-primary);margin-top:16px}ion-card-header{padding:0 0 0 10px}.quality-indicator{display:inline-block;margin-left:10px;padding:2px 8px;border-radius:4px;font-weight:700;font-size:.9em}.quality-indicator.quality-good{border:1px solid var(--ion-color-success);color:var(--ion-color-success)}.quality-indicator.quality-medium{border:1px solid var(--ion-color-medium);color:var(--ion-color-medium)}.quality-indicator.quality-bad{border:1px solid var(--ion-color-danger);color:var(--ion-color-danger)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.RaainCompareComponent, selector: "raain-compare", inputs: ["points", "pointMax", "remarks", "compareIndex", "currentHeight", "currentWidth"], outputs: ["selectedPoint"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
61
61
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainCompareStackComponent, decorators: [{
62
62
  type: Component,
63
- args: [{ selector: 'raain-compare-stack', template: "<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"outline\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"outline\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n", styles: ["#card-matrix{width:170px}.card-compare{min-width:300px}ion-card-header{padding:0 0 0 10px}\n"] }]
63
+ args: [{ selector: 'raain-compare-stack', template: "<div *ngIf=\"cumulative\">\n <ion-col size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Cumulative\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.globalQualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compareManager.globalQualityIndicator >= 0.5,\n 'quality-medium': compareManager.globalQualityIndicator < 0.5 && compareManager.globalQualityIndicator >= 0,\n 'quality-bad': compareManager.globalQualityIndicator < 0\n }\">\n Quality: {{ compareManager.globalQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compareManager.globalComparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"0\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.globalComparePointsMax\"\n [points]=\"compareManager.globalComparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportCumulativeToCsv()\" *ngIf=\"compareManager.globalComparePoints?.length\" fill=\"outline\"\n size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n</div>\n\n<div *ngIf=\"!cumulative\">\n <ion-col *ngFor=\"let compare of compareManager?.uiCompares; index as compareIndex\" size-md=\"6\" size-xs=\"12\">\n <ion-card class=\"card-compare\">\n <ion-card-header>Gauges filled {{ compare.name }} {{ compare.remarks }}\n <span *ngIf=\"compare.qualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compare.qualityIndicator >= 0.5,\n 'quality-medium': compare.qualityIndicator < 0.5 && compare.qualityIndicator >= 0,\n 'quality-bad': compare.qualityIndicator < 0\n }\">\n Quality: {{ compare.qualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content *ngIf=\"compare.comparePoints?.length\">\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"compareIndex\"\n [currentHeight]=\"500\"\n [pointMax]=\"compare.comparePointsMax\"\n [points]=\"compare.comparePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <ion-button (click)=\"exportGranularToCsv()\" *ngIf=\"compareManager.uiCompares?.length\" fill=\"outline\" size=\"small\">\n <ion-icon name=\"download-outline\" slot=\"start\"></ion-icon>\n Export CSV\n </ion-button>\n\n <!-- Cumulative summary of all granular comparisons -->\n <ion-col size-md=\"6\" size-xs=\"12\" *ngIf=\"compareManager.granularCumulativePoints?.length\">\n <ion-card class=\"card-compare card-compare-cumulative\">\n <ion-card-header>Cumulative Summary\n [{{ compareManager.compareDates[0] | date:'yyyy-MM-dd HH:mm' }}\n - {{ compareManager.compareDates[compareManager.compareDates.length - 1] | date:'yyyy-MM-dd HH:mm' }}[\n <span *ngIf=\"compareManager.granularCumulativeQualityIndicator !== null\"\n class=\"quality-indicator\"\n [ngClass]=\"{\n 'quality-good': compareManager.granularCumulativeQualityIndicator >= 0.5,\n 'quality-medium': compareManager.granularCumulativeQualityIndicator < 0.5 && compareManager.granularCumulativeQualityIndicator >= 0,\n 'quality-bad': compareManager.granularCumulativeQualityIndicator < 0\n }\">\n Quality: {{ compareManager.granularCumulativeQualityIndicator | number:'1.0-2' }}\n </span>\n </ion-card-header>\n <ion-card-content>\n <raain-compare\n (selectedPoint)=\"onClick($event)\"\n [compareIndex]=\"-1\"\n [currentHeight]=\"500\"\n [pointMax]=\"compareManager.granularCumulativePointsMax\"\n [points]=\"compareManager.granularCumulativePoints\"></raain-compare>\n </ion-card-content>\n </ion-card>\n </ion-col>\n</div>\n", styles: ["#card-matrix{width:170px}.card-compare{min-width:300px}.card-compare-cumulative{border:2px solid var(--ion-color-primary);margin-top:16px}ion-card-header{padding:0 0 0 10px}.quality-indicator{display:inline-block;margin-left:10px;padding:2px 8px;border-radius:4px;font-weight:700;font-size:.9em}.quality-indicator.quality-good{border:1px solid var(--ion-color-success);color:var(--ion-color-success)}.quality-indicator.quality-medium{border:1px solid var(--ion-color-medium);color:var(--ion-color-medium)}.quality-indicator.quality-bad{border:1px solid var(--ion-color-danger);color:var(--ion-color-danger)}\n"] }]
64
64
  }], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { compareManager: [{
65
65
  type: Input
66
66
  }], currentHeight: [{
@@ -70,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
70
70
  }], cumulative: [{
71
71
  type: Input
72
72
  }] } });
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tY29tcGFyZS1zdGFjay9yYWFpbi1jb21wYXJlLXN0YWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1jb21wYXJlLXN0YWNrL3JhYWluLWNvbXBhcmUtc3RhY2suY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFTN0UsTUFBTSxPQUFPLDBCQUEwQjtJQWFuQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUwzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUF5QyxDQUFDO0lBSzVDLENBQUM7SUFFNUIsT0FBTyxDQUFDLENBQXdDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRTtZQUNqQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FDWCxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUM7WUFDYixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENB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QyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLE1BQU07Z0JBSUEsVUFBVTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXJ9IGZyb20gJy4uL3Rvb2xzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyYWFpbi1jb21wYXJlLXN0YWNrJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBSYWFpbkNvbXBhcmVTdGFja0NvbXBvbmVudCB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VycmVudEhlaWdodDogbnVtYmVyO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkUG9pbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtwb2ludDogWFlUeXBlOyBjb21wYXJlSW5kZXg6IG51bWJlcn0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdW11bGF0aXZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAgIHByb3RlY3RlZCBvbkNsaWNrKGU6IHtwb2ludDogWFlUeXBlOyBjb21wYXJlSW5kZXg6IG51bWJlcn0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvaW50LmVtaXQoe3BvaW50OiBlLnBvaW50LCBjb21wYXJlSW5kZXg6IGUuY29tcGFyZUluZGV4fSk7XG4gICAgfVxuXG4gICAgZXhwb3J0Q3VtdWxhdGl2ZVRvQ3N2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdsb2JhbENvbXBhcmVQb2ludHM7XG4gICAgICAgIGlmICghcG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGVzID0gdGhpcy5jb21wYXJlTWFuYWdlci5jb21wYXJlRGF0ZXM7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9XG4gICAgICAgICAgICBkYXRlcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYCR7dGhpcy5mb3JtYXREYXRlKGRhdGVzWzBdKX0gLSAke3RoaXMuZm9ybWF0RGF0ZShkYXRlc1tkYXRlcy5sZW5ndGggLSAxXSl9YFxuICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgY29uc3QgY3N2Um93cyA9IFsnZGF0ZVJhbmdlLGdhdWdlTmFtZSxnYXVnZVZhbHVlLHBpeGVsVmFsdWUnXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgIGNzdlJvd3MucHVzaChgJHtkYXRlUmFuZ2V9LCR7cG9pbnQubmFtZX0sJHtwb2ludC54fSwke3BvaW50Lnl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjc3ZDb250ZW50ID0gY3N2Um93cy5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZENzdihcbiAgICAgICAgICAgIGNzdkNvbnRlbnQsXG4gICAgICAgICAgICBgY29tcGFyZS1jdW11bGF0aXZlLSR7dGhpcy5mb3JtYXREYXRlRm9yRmlsZW5hbWUobmV3IERhdGUoKSl9LmNzdmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBleHBvcnRHcmFudWxhclRvQ3N2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbGxQb2ludHMgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdldEFsbEdyYW51bGFyQ29tcGFyZVBvaW50cygpO1xuICAgICAgICBpZiAoIWFsbFBvaW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjc3ZSb3dzID0gWydkYXRlLGdhdWdlTmFtZSxnYXVnZVZhbHVlLHBpeGVsVmFsdWUnXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBhbGxQb2ludHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUocG9pbnQuZGF0ZSk7XG4gICAgICAgICAgICBjc3ZSb3dzLnB1c2goYCR7ZGF0ZVN0cn0sJHtwb2ludC5nYXVnZU5hbWV9LCR7cG9pbnQuZ2F1Z2VWYWx1ZX0sJHtwb2ludC5waXhlbFZhbHVlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3N2Q29udGVudCA9IGNzdlJvd3Muam9pbignXFxuJyk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRDc3YoXG4gICAgICAgICAgICBjc3ZDb250ZW50LFxuICAgICAgICAgICAgYGNvbXBhcmUtZ3JhbnVsYXItJHt0aGlzLmZvcm1hdERhdGVGb3JGaWxlbmFtZShuZXcgRGF0ZSgpKX0uY3N2YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG93bmxvYWRDc3YoY29udGVudDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHt0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xuICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KS5yZXBsYWNlKCdUJywgJyAnKSA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RGF0ZUZvckZpbGVuYW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiY3VtdWxhdGl2ZVwiPlxuICAgIDxpb24tY29sIHNpemUtbWQ9XCI2XCIgc2l6ZS14cz1cIjEyXCI+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImNhcmQtY29tcGFyZVwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5DdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgW3t7IGNvbXBhcmVNYW5hZ2VyLmNvbXBhcmVEYXRlc1swXSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19XG4gICAgICAgICAgICAgICAgLSB7eyBjb21wYXJlTWFuYWdlci5jb21wYXJlRGF0ZXNbY29tcGFyZU1hbmFnZXIuY29tcGFyZURhdGVzLmxlbmd0aCAtIDFdIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX1bXG4gICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50ICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWNvbXBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFBvaW50KT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcGFyZUluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludE1heF09XCJjb21wYXJlTWFuYWdlci5nbG9iYWxDb21wYXJlUG9pbnRzTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludHNdPVwiY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50c1wiPjwvcmFhaW4tY29tcGFyZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICA8L2lvbi1jb2w+XG5cbiAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiZXhwb3J0Q3VtdWxhdGl2ZVRvQ3N2KClcIiAqbmdJZj1cImNvbXBhcmVNYW5hZ2VyLmdsb2JhbENvbXBhcmVQb2ludHM/Lmxlbmd0aFwiIGZpbGw9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgRXhwb3J0IENTVlxuICAgIDwvaW9uLWJ1dHRvbj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiIWN1bXVsYXRpdmVcIj5cbiAgICA8aW9uLWNvbCAqbmdGb3I9XCJsZXQgY29tcGFyZSBvZiAgY29tcGFyZU1hbmFnZXI/LnVpQ29tcGFyZXM7IGluZGV4IGFzIGNvbXBhcmVJbmRleFwiIHNpemUtbWQ9XCI2XCIgc2l6ZS14cz1cIjEyXCI+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImNhcmQtY29tcGFyZVwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5HYXVnZXMgZmlsbGVkIHt7IGNvbXBhcmUubmFtZSB9fSB7eyBjb21wYXJlLnJlbWFya3MgfX1cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgKm5nSWY9XCJjb21wYXJlLmNvbXBhcmVQb2ludHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxyYWFpbi1jb21wYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRQb2ludCk9XCJvbkNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVJbmRleF09XCJjb21wYXJlSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludE1heF09XCJjb21wYXJlLmNvbXBhcmVQb2ludHNNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb21wYXJlLmNvbXBhcmVQb2ludHNcIj48L3JhYWluLWNvbXBhcmU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgPC9pb24tY29sPlxuXG4gICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImV4cG9ydEdyYW51bGFyVG9Dc3YoKVwiICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIudWlDb21wYXJlcz8ubGVuZ3RoXCIgZmlsbD1cIm91dGxpbmVcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgRXhwb3J0IENTVlxuICAgIDwvaW9uLWJ1dHRvbj5cbjwvZGl2PlxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tY29tcGFyZS1zdGFjay9yYWFpbi1jb21wYXJlLXN0YWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1jb21wYXJlLXN0YWNrL3JhYWluLWNvbXBhcmUtc3RhY2suY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFTN0UsTUFBTSxPQUFPLDBCQUEwQjtJQWFuQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUwzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUF5QyxDQUFDO0lBSzVDLENBQUM7SUFFNUIsT0FBTyxDQUFDLENBQXdDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRTtZQUNqQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FDWCxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUM7WUFDYixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENB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QyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLE1BQU07Z0JBSUEsVUFBVTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXJ9IGZyb20gJy4uL3Rvb2xzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyYWFpbi1jb21wYXJlLXN0YWNrJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcmFhaW4tY29tcGFyZS1zdGFjay5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBSYWFpbkNvbXBhcmVTdGFja0NvbXBvbmVudCB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VycmVudEhlaWdodDogbnVtYmVyO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkUG9pbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtwb2ludDogWFlUeXBlOyBjb21wYXJlSW5kZXg6IG51bWJlcn0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdW11bGF0aXZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAgIHByb3RlY3RlZCBvbkNsaWNrKGU6IHtwb2ludDogWFlUeXBlOyBjb21wYXJlSW5kZXg6IG51bWJlcn0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvaW50LmVtaXQoe3BvaW50OiBlLnBvaW50LCBjb21wYXJlSW5kZXg6IGUuY29tcGFyZUluZGV4fSk7XG4gICAgfVxuXG4gICAgZXhwb3J0Q3VtdWxhdGl2ZVRvQ3N2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb2ludHMgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdsb2JhbENvbXBhcmVQb2ludHM7XG4gICAgICAgIGlmICghcG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGVzID0gdGhpcy5jb21wYXJlTWFuYWdlci5jb21wYXJlRGF0ZXM7XG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9XG4gICAgICAgICAgICBkYXRlcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYCR7dGhpcy5mb3JtYXREYXRlKGRhdGVzWzBdKX0gLSAke3RoaXMuZm9ybWF0RGF0ZShkYXRlc1tkYXRlcy5sZW5ndGggLSAxXSl9YFxuICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgY29uc3QgY3N2Um93cyA9IFsnZGF0ZVJhbmdlLGdhdWdlTmFtZSxnYXVnZVZhbHVlLHBpeGVsVmFsdWUnXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgIGNzdlJvd3MucHVzaChgJHtkYXRlUmFuZ2V9LCR7cG9pbnQubmFtZX0sJHtwb2ludC54fSwke3BvaW50Lnl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjc3ZDb250ZW50ID0gY3N2Um93cy5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZENzdihcbiAgICAgICAgICAgIGNzdkNvbnRlbnQsXG4gICAgICAgICAgICBgY29tcGFyZS1jdW11bGF0aXZlLSR7dGhpcy5mb3JtYXREYXRlRm9yRmlsZW5hbWUobmV3IERhdGUoKSl9LmNzdmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBleHBvcnRHcmFudWxhclRvQ3N2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbGxQb2ludHMgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdldEFsbEdyYW51bGFyQ29tcGFyZVBvaW50cygpO1xuICAgICAgICBpZiAoIWFsbFBvaW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjc3ZSb3dzID0gWydkYXRlLGdhdWdlTmFtZSxnYXVnZVZhbHVlLHBpeGVsVmFsdWUnXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBhbGxQb2ludHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUocG9pbnQuZGF0ZSk7XG4gICAgICAgICAgICBjc3ZSb3dzLnB1c2goYCR7ZGF0ZVN0cn0sJHtwb2ludC5nYXVnZU5hbWV9LCR7cG9pbnQuZ2F1Z2VWYWx1ZX0sJHtwb2ludC5waXhlbFZhbHVlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3N2Q29udGVudCA9IGNzdlJvd3Muam9pbignXFxuJyk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRDc3YoXG4gICAgICAgICAgICBjc3ZDb250ZW50LFxuICAgICAgICAgICAgYGNvbXBhcmUtZ3JhbnVsYXItJHt0aGlzLmZvcm1hdERhdGVGb3JGaWxlbmFtZShuZXcgRGF0ZSgpKX0uY3N2YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG93bmxvYWRDc3YoY29udGVudDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHt0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xuICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KS5yZXBsYWNlKCdUJywgJyAnKSA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RGF0ZUZvckZpbGVuYW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiY3VtdWxhdGl2ZVwiPlxuICAgIDxpb24tY29sIHNpemUtbWQ9XCI2XCIgc2l6ZS14cz1cIjEyXCI+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImNhcmQtY29tcGFyZVwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5DdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgW3t7IGNvbXBhcmVNYW5hZ2VyLmNvbXBhcmVEYXRlc1swXSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19XG4gICAgICAgICAgICAgICAgLSB7eyBjb21wYXJlTWFuYWdlci5jb21wYXJlRGF0ZXNbY29tcGFyZU1hbmFnZXIuY29tcGFyZURhdGVzLmxlbmd0aCAtIDFdIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX1bXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb21wYXJlTWFuYWdlci5nbG9iYWxRdWFsaXR5SW5kaWNhdG9yICE9PSBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInF1YWxpdHktaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAncXVhbGl0eS1nb29kJzogY29tcGFyZU1hbmFnZXIuZ2xvYmFsUXVhbGl0eUluZGljYXRvciA+PSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgICAncXVhbGl0eS1tZWRpdW0nOiBjb21wYXJlTWFuYWdlci5nbG9iYWxRdWFsaXR5SW5kaWNhdG9yIDwgMC41ICYmIGNvbXBhcmVNYW5hZ2VyLmdsb2JhbFF1YWxpdHlJbmRpY2F0b3IgPj0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaXR5LWJhZCc6IGNvbXBhcmVNYW5hZ2VyLmdsb2JhbFF1YWxpdHlJbmRpY2F0b3IgPCAwXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICBRdWFsaXR5OiB7eyBjb21wYXJlTWFuYWdlci5nbG9iYWxRdWFsaXR5SW5kaWNhdG9yIHwgbnVtYmVyOicxLjAtMicgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50ICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWNvbXBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFBvaW50KT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcGFyZUluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludE1heF09XCJjb21wYXJlTWFuYWdlci5nbG9iYWxDb21wYXJlUG9pbnRzTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludHNdPVwiY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50c1wiPjwvcmFhaW4tY29tcGFyZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICA8L2lvbi1jb2w+XG5cbiAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiZXhwb3J0Q3VtdWxhdGl2ZVRvQ3N2KClcIiAqbmdJZj1cImNvbXBhcmVNYW5hZ2VyLmdsb2JhbENvbXBhcmVQb2ludHM/Lmxlbmd0aFwiIGZpbGw9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgRXhwb3J0IENTVlxuICAgIDwvaW9uLWJ1dHRvbj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiIWN1bXVsYXRpdmVcIj5cbiAgICA8aW9uLWNvbCAqbmdGb3I9XCJsZXQgY29tcGFyZSBvZiAgY29tcGFyZU1hbmFnZXI/LnVpQ29tcGFyZXM7IGluZGV4IGFzIGNvbXBhcmVJbmRleFwiIHNpemUtbWQ9XCI2XCIgc2l6ZS14cz1cIjEyXCI+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImNhcmQtY29tcGFyZVwiPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5HYXVnZXMgZmlsbGVkIHt7IGNvbXBhcmUubmFtZSB9fSB7eyBjb21wYXJlLnJlbWFya3MgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbXBhcmUucXVhbGl0eUluZGljYXRvciAhPT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJxdWFsaXR5LWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YWxpdHktZ29vZCc6IGNvbXBhcmUucXVhbGl0eUluZGljYXRvciA+PSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgICAncXVhbGl0eS1tZWRpdW0nOiBjb21wYXJlLnF1YWxpdHlJbmRpY2F0b3IgPCAwLjUgJiYgY29tcGFyZS5xdWFsaXR5SW5kaWNhdG9yID49IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAncXVhbGl0eS1iYWQnOiBjb21wYXJlLnF1YWxpdHlJbmRpY2F0b3IgPCAwXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICBRdWFsaXR5OiB7eyBjb21wYXJlLnF1YWxpdHlJbmRpY2F0b3IgfCBudW1iZXI6JzEuMC0yJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgKm5nSWY9XCJjb21wYXJlLmNvbXBhcmVQb2ludHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxyYWFpbi1jb21wYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRQb2ludCk9XCJvbkNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVJbmRleF09XCJjb21wYXJlSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludE1heF09XCJjb21wYXJlLmNvbXBhcmVQb2ludHNNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb21wYXJlLmNvbXBhcmVQb2ludHNcIj48L3JhYWluLWNvbXBhcmU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgPC9pb24tY29sPlxuXG4gICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImV4cG9ydEdyYW51bGFyVG9Dc3YoKVwiICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIudWlDb21wYXJlcz8ubGVuZ3RoXCIgZmlsbD1cIm91dGxpbmVcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgRXhwb3J0IENTVlxuICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgIDwhLS0gQ3VtdWxhdGl2ZSBzdW1tYXJ5IG9mIGFsbCBncmFudWxhciBjb21wYXJpc29ucyAtLT5cbiAgICA8aW9uLWNvbCBzaXplLW1kPVwiNlwiIHNpemUteHM9XCIxMlwiICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIuZ3JhbnVsYXJDdW11bGF0aXZlUG9pbnRzPy5sZW5ndGhcIj5cbiAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiY2FyZC1jb21wYXJlIGNhcmQtY29tcGFyZS1jdW11bGF0aXZlXCI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPkN1bXVsYXRpdmUgU3VtbWFyeVxuICAgICAgICAgICAgICAgIFt7eyBjb21wYXJlTWFuYWdlci5jb21wYXJlRGF0ZXNbMF0gfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tJyB9fVxuICAgICAgICAgICAgICAgIC0ge3sgY29tcGFyZU1hbmFnZXIuY29tcGFyZURhdGVzW2NvbXBhcmVNYW5hZ2VyLmNvbXBhcmVEYXRlcy5sZW5ndGggLSAxXSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19W1xuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29tcGFyZU1hbmFnZXIuZ3JhbnVsYXJDdW11bGF0aXZlUXVhbGl0eUluZGljYXRvciAhPT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJxdWFsaXR5LWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YWxpdHktZ29vZCc6IGNvbXBhcmVNYW5hZ2VyLmdyYW51bGFyQ3VtdWxhdGl2ZVF1YWxpdHlJbmRpY2F0b3IgPj0gMC41LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YWxpdHktbWVkaXVtJzogY29tcGFyZU1hbmFnZXIuZ3JhbnVsYXJDdW11bGF0aXZlUXVhbGl0eUluZGljYXRvciA8IDAuNSAmJiBjb21wYXJlTWFuYWdlci5ncmFudWxhckN1bXVsYXRpdmVRdWFsaXR5SW5kaWNhdG9yID49IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAncXVhbGl0eS1iYWQnOiBjb21wYXJlTWFuYWdlci5ncmFudWxhckN1bXVsYXRpdmVRdWFsaXR5SW5kaWNhdG9yIDwgMFxuICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgUXVhbGl0eToge3sgY29tcGFyZU1hbmFnZXIuZ3JhbnVsYXJDdW11bGF0aXZlUXVhbGl0eUluZGljYXRvciB8IG51bWJlcjonMS4wLTInIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICA8cmFhaW4tY29tcGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkUG9pbnQpPVwib25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYXJlSW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludE1heF09XCJjb21wYXJlTWFuYWdlci5ncmFudWxhckN1bXVsYXRpdmVQb2ludHNNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb21wYXJlTWFuYWdlci5ncmFudWxhckN1bXVsYXRpdmVQb2ludHNcIj48L3JhYWluLWNvbXBhcmU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgPC9pb24tY29sPlxuPC9kaXY+XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { MapLatLng } from 'raain-ui';
2
- import { GaugeNode, SpeedMatrixContainer, } from 'raain-model';
2
+ import { GaugeNode, QualityIndicatorMethod, SpeedMatrix, SpeedMatrixContainer, } from 'raain-model';
3
3
  import { XYType } from '../xytype';
4
4
  export class CompareManager {
5
5
  constructor(profileService, onChanges = () => { }) {
@@ -7,6 +7,26 @@ export class CompareManager {
7
7
  this.onChanges = onChanges;
8
8
  this.cleanAll();
9
9
  }
10
+ // Merged cumulative from granular comparisons (computed from buildCompares)
11
+ get granularCumulativePoints() {
12
+ if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {
13
+ return [];
14
+ }
15
+ return this.buildCompares.compareCumulative.qualityPoints.map((qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId));
16
+ }
17
+ get granularCumulativePointsMax() {
18
+ if (!this.buildCompares?.compareCumulative) {
19
+ return new XYType(0, 0);
20
+ }
21
+ const maxValue = this.buildCompares.compareCumulative.maxValue * 1.2;
22
+ return new XYType(maxValue, maxValue);
23
+ }
24
+ get granularCumulativeQualityIndicator() {
25
+ if (!this.buildCompares?.compareCumulative?.qualityPoints?.length) {
26
+ return null;
27
+ }
28
+ return SpeedMatrix.ComputeQualityIndicator(this.buildCompares.compareCumulative.qualityPoints, { method: QualityIndicatorMethod.NASH_SUTCLIFFE });
29
+ }
10
30
  get rainNode() {
11
31
  return this._rainNode;
12
32
  }
@@ -28,6 +48,8 @@ export class CompareManager {
28
48
  };
29
49
  this.globalComparePoints = [];
30
50
  this.globalComparePointsMax = new XYType(0, 0);
51
+ this.globalQualityIndicator = null;
52
+ // granularCumulative* are now getters computed from buildCompares
31
53
  this.rainComputationQualitiesPerDate = {};
32
54
  this.selectedGauge = null;
33
55
  this.selectedGaugeInPoints = null;
@@ -37,8 +59,10 @@ export class CompareManager {
37
59
  const comparePerDate = this.getComparePerDate(frameSet.date);
38
60
  if (!comparePerDate ||
39
61
  !comparePerDate.rainComputationQuality?.qualitySpeedMatrixContainer) {
40
- this.cleanCompareQuality('no current quality ' + Object.keys(this.rainComputationQualitiesPerDate));
41
- this.onChanges();
62
+ // this.cleanCompareQuality(
63
+ // 'no current quality ' + Object.keys(this.rainComputationQualitiesPerDate)
64
+ // );
65
+ // this.onChanges();
42
66
  return;
43
67
  }
44
68
  if (onlyOne) {
@@ -46,6 +70,9 @@ export class CompareManager {
46
70
  }
47
71
  const uiCompares = comparePerDate.compareTimeline
48
72
  .map((c) => {
73
+ const qualityIndicator = SpeedMatrix.ComputeQualityIndicator(c.qualityPoints, {
74
+ method: QualityIndicatorMethod.NASH_SUTCLIFFE,
75
+ });
49
76
  return {
50
77
  date: c.date,
51
78
  name: c.name,
@@ -53,6 +80,7 @@ export class CompareManager {
53
80
  comparePointsMax: new XYType(c.maxValue * 1.2, c.maxValue * 1.2),
54
81
  comparePointsHistory: c.qualityPointsLegacy,
55
82
  remarks: c.remarks,
83
+ qualityIndicator,
56
84
  };
57
85
  })
58
86
  .sort((a, b) => a.date?.getTime() - b.date?.getTime());
@@ -76,8 +104,14 @@ export class CompareManager {
76
104
  }
77
105
  const countForAverage = targetsOrdered.length;
78
106
  const maxValue = this.buildCompares.compareCumulative.maxValue * 1.2;
79
- this.globalComparePoints = this.buildCompares.compareCumulative.qualityPoints.map((qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId));
80
- this.globalComparePointsMax = new XYType(maxValue, maxValue);
107
+ const cumulativePoints = this.buildCompares.compareCumulative.qualityPoints.map((qp) => new XYType(qp.getGaugeValue(), qp.getRainValue(), 2, qp.gaugeLabel, qp.gaugeId));
108
+ const cumulativePointsMax = new XYType(maxValue, maxValue);
109
+ const cumulativeQualityIndicator = SpeedMatrix.ComputeQualityIndicator(this.buildCompares.compareCumulative.qualityPoints, { method: QualityIndicatorMethod.NASH_SUTCLIFFE });
110
+ // Set for cumulative mode
111
+ this.globalComparePoints = cumulativePoints;
112
+ this.globalComparePointsMax = cumulativePointsMax;
113
+ this.globalQualityIndicator = cumulativeQualityIndicator;
114
+ // granularCumulative* are now getters computed from buildCompares.compareCumulative
81
115
  }
82
116
  catch (e) {
83
117
  console.warn(e);
@@ -334,4 +368,4 @@ export class CompareManager {
334
368
  this.selectGaugeInCompare();
335
369
  }
336
370
  }
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvQ29tcGFyZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQ0gsU0FBUyxFQU9ULG9CQUFvQixHQUN2QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBbUJqQyxNQUFNLE9BQU8sY0FBYztJQTRCdkIsWUFDYyxjQUE4QixFQUNqQyxZQUF3QixHQUFHLEVBQUUsR0FBRSxDQUFDO1FBRDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNqQyxjQUFTLEdBQVQsU0FBUyxDQUF1QjtRQUV2QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxRQUFRLENBQUMsUUFBa0I7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNqQixl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QUFDO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXBMYXRMbmd9IGZyb20gJ3JhYWluLXVpJztcbmltcG9ydCB7XG4gICAgR2F1Z2VOb2RlLFxuICAgIElDb21wYXJlUGVyRGF0ZSxcbiAgICBJQ29tcGFyZXMsXG4gICAgUG9zaXRpb25WYWx1ZSxcbiAgICBRdWFsaXR5UG9pbnQsXG4gICAgUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSxcbiAgICBSYWluTm9kZSxcbiAgICBTcGVlZE1hdHJpeENvbnRhaW5lcixcbn0gZnJvbSAncmFhaW4tbW9kZWwnO1xuaW1wb3J0IHtYWVR5cGV9IGZyb20gJy4uL3h5dHlwZSc7XG5pbXBvcnQge1Byb2ZpbGVTZXJ2aWNlfSBmcm9tICcuLi9wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHtGcmFtZVNldH0gZnJvbSAnLi9GcmFtZVNldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBhcmVUYXJnZXQge1xuICAgIGRhdGU6IERhdGU7XG4gICAgcmFpbkNvbXB1dGF0aW9uSWQ/OiBzdHJpbmc7XG4gICAgcmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVSUNvbXBhcmUge1xuICAgIGRhdGU6IERhdGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbXBhcmVQb2ludHM6IFhZVHlwZVtdO1xuICAgIGNvbXBhcmVQb2ludHNNYXg6IFhZVHlwZTtcbiAgICBjb21wYXJlUG9pbnRzSGlzdG9yeTogUXVhbGl0eVBvaW50W107XG4gICAgcmVtYXJrczogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFyZU1hbmFnZXIge1xuICAgIHB1YmxpYyBnYXVnZXNJbk1hcDogTWFwTGF0TG5nW107XG4gICAgcHVibGljIGdhdWdlc0luQ29tcGFyZTogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHNlbGVjdGVkR2F1Z2VzOiBNYXBMYXRMbmdbXTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRQaXhlbHM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyBwaXhlbHNTb2x1dGlvbnM6IE1hcExhdExuZ1tdW107XG4gICAgcHVibGljIHNwZWVkczogTWFwTGF0TG5nW107XG5cbiAgICAvLyBmcm9tIGNvbXBhcmVzVGltZWxpbmVcbiAgICBwdWJsaWMgY29tcGFyZU5hbWVzOiBzdHJpbmdbXTtcbiAgICBwdWJsaWMgdWlDb21wYXJlczogSVVJQ29tcGFyZVtdO1xuICAgIHB1YmxpYyBjb21wYXJlU3BlZWRNYXRyaXg6IFBvc2l0aW9uVmFsdWVbXTtcbiAgICBwdWJsaWMgY29tcGFyZVZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgY29tcGFyZVRydXN0ZWRJbmRpY2F0b3I6IG51bWJlcjtcbiAgICBwdWJsaWMgY29tcGFyZURhdGVzOiBEYXRlW107XG5cbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlEb25lRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5OiBzdHJpbmc7XG4gICAgcHVibGljIGN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NczogbnVtYmVyO1xuICAgIHB1YmxpYyBnbG9iYWxDb21wYXJlUG9pbnRzOiBYWVR5cGVbXTtcbiAgICBwdWJsaWMgZ2xvYmFsQ29tcGFyZVBvaW50c01heDogWFlUeXBlO1xuICAgIHB1YmxpYyBjb21wYXJlU3BlZWQ6IHthbmdsZUluRGVncmVlczogbnVtYmVyOyBwaXhlbHNQZXJQZXJpb2Q6IG51bWJlcn07XG4gICAgcHJvdGVjdGVkIGJ1aWxkQ29tcGFyZXM6IElDb21wYXJlcztcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRHYXVnZTogUXVhbGl0eVBvaW50O1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZEdhdWdlSW5Qb2ludHM6IFF1YWxpdHlQb2ludDtcbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRHYXVnZUluUG9pbnRzRGV0YWlsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgb25DaGFuZ2VzOiAoKSA9PiB2b2lkID0gKCkgPT4ge31cbiAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcmFpbk5vZGU6IFJhaW5Ob2RlO1xuXG4gICAgcHVibGljIGdldCByYWluTm9kZSgpOiBSYWluTm9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWluTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJhaW5Ob2RlKHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICB0aGlzLl9yYWluTm9kZSA9IHJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuQWxsKCkge1xuICAgICAgICB0aGlzLmdhdWdlc0luTWFwID0gW107XG4gICAgICAgIHRoaXMuZ2F1Z2VzSW5Db21wYXJlID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IFtdO1xuICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVEYXRlcyA9IFtdO1xuICAgICAgICB0aGlzLnNwZWVkcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuYnVpbGRDb21wYXJlcyA9IHtcbiAgICAgICAgICAgIGNvbXBhcmVzUGVyRGF0ZTogW10sXG4gICAgICAgICAgICBjb21wYXJlQ3VtdWxhdGl2ZTogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzID0gW107XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50c01heCA9IG5ldyBYWVR5cGUoMCwgMCk7XG4gICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZSA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KCdubyBjb21wYXJlIHlldCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hDb21wYXJlUXVhbGl0eShmcmFtZVNldDogRnJhbWVTZXQsIG9ubHlPbmU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY29tcGFyZVBlckRhdGUgPSB0aGlzLmdldENvbXBhcmVQZXJEYXRlKGZyYW1lU2V0LmRhdGUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFjb21wYXJlUGVyRGF0ZSB8fFxuICAgICAgICAgICAgIWNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHk/LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lclxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW5Db21wYXJlUXVhbGl0eShcbiAgICAgICAgICAgICAgICAnbm8gY3VycmVudCBxdWFsaXR5ICcgKyBPYmplY3Qua2V5cyh0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZXMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbmx5T25lKSB7XG4gICAgICAgICAgICBjb21wYXJlUGVyRGF0ZS5jb21wYXJlVGltZWxpbmUgPSBjb21wYXJlUGVyRGF0ZS5jb21wYXJlVGltZWxpbmUuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChjKSA9PiBjLmRhdGUuZ2V0VGltZSgpID09PSBmcmFtZVNldC5kYXRlLmdldFRpbWUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVpQ29tcGFyZXM6IElVSUNvbXBhcmVbXSA9IGNvbXBhcmVQZXJEYXRlLmNvbXBhcmVUaW1lbGluZVxuICAgICAgICAgICAgLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGMuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXJlUG9pbnRzOiBjLnF1YWxpdHlQb2ludHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhZVHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRHYXVnZVZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UmFpblZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2F1Z2VMYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nYXVnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXJlUG9pbnRzTWF4OiBuZXcgWFlUeXBlKGMubWF4VmFsdWUgKiAxLjIsIGMubWF4VmFsdWUgKiAxLjIpLFxuICAgICAgICAgICAgICAgICAgICBjb21wYXJlUG9pbnRzSGlzdG9yeTogYy5xdWFsaXR5UG9pbnRzTGVnYWN5LFxuICAgICAgICAgICAgICAgICAgICByZW1hcmtzOiBjLnJlbWFya3MsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5kYXRlPy5nZXRUaW1lKCkgLSBiLmRhdGU/LmdldFRpbWUoKSk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eURvbmVEYXRlID0gY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5pc0RvbmVEYXRlO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NcyA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkudGltZVNwZW50SW5NcztcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eUxhdW5jaGVkQnkgPSBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LmxhdW5jaGVkQnk7XG4gICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24gPSBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LmdldFZlcnNpb24oKTtcblxuICAgICAgICB0aGlzLmNvbXBhcmVTcGVlZCA9XG4gICAgICAgICAgICBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LnF1YWxpdHlTcGVlZE1hdHJpeENvbnRhaW5lci5nZXRTcGVlZCgpO1xuICAgICAgICB0aGlzLmNvbXBhcmVOYW1lcyA9IHVpQ29tcGFyZXMubWFwKChjKSA9PiBjLm5hbWUpO1xuICAgICAgICB0aGlzLnVpQ29tcGFyZXMgPSB1aUNvbXBhcmVzO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaEdsb2JhbENvbXBhcmVRdWFsaXR5KFxuICAgICAgICB0YXJnZXRzT3JkZXJlZDogSUNvbXBhcmVUYXJnZXRbXSxcbiAgICAgICAgcGVyaW9kOiB7YmVnaW46IERhdGU7IGVuZDogRGF0ZX0sXG4gICAgICAgIHdpdGhDb21wYXJlRHVwbGljYXRlOiBib29sZWFuLFxuICAgICAgICBjdW11bGF0aXZlSG91cnM6IG51bWJlciA9IDBcbiAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hSYWluQ29tcHV0YXRpb25RdWFsaXRpZXModGFyZ2V0c09yZGVyZWQsIGN1bXVsYXRpdmVIb3Vycyk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRDb21wYXJlc1RpbWVsaW5lKHRhcmdldHNPcmRlcmVkLCBwZXJpb2QsIHdpdGhDb21wYXJlRHVwbGljYXRlKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignbmVlZHMgY3VtdWxhdGl2ZSBjb21wYXJlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb3VudEZvckF2ZXJhZ2UgPSB0YXJnZXRzT3JkZXJlZC5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZS5tYXhWYWx1ZSAqIDEuMjtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cyA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZS5xdWFsaXR5UG9pbnRzLm1hcChcbiAgICAgICAgICAgICAgICAocXApID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBYWVR5cGUocXAuZ2V0R2F1Z2VWYWx1ZSgpLCBxcC5nZXRSYWluVmFsdWUoKSwgMiwgcXAuZ2F1Z2VMYWJlbCwgcXAuZ2F1Z2VJZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHNNYXggPSBuZXcgWFlUeXBlKG1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldEdhdWdlc0luTWFwKCkge1xuICAgICAgICAvLyBHZXQgYWxsIGdhdWdlIElEcyBsaW5rZWQgdG8gdGhpcyByYWluTm9kZVxuICAgICAgICBjb25zdCByYWluTm9kZUdhdWdlSWRzID0gdGhpcy5yYWluTm9kZS5nZXRMaW5rcyhHYXVnZU5vZGUuVFlQRSkubWFwKChsKSA9PiBsLmdldElkKCkpO1xuXG4gICAgICAgIC8vIEZldGNoIGdhdWdlcyBmcm9tIEFQSSAobWF5IGJlIGZpbHRlcmVkL2xpbWl0ZWQpXG4gICAgICAgIGxldCBnYXVnZXNUb0ZpbHRlciA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0R2F1Z2VzKFxuICAgICAgICAgICAgdGhpcy5yYWluTm9kZT8uaWQsXG4gICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLmdldENlbnRlcigpXG4gICAgICAgICk7XG4gICAgICAgIGdhdWdlc1RvRmlsdGVyID0gZ2F1Z2VzVG9GaWx0ZXJcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYS5hcHByb3hEaXN0YW5jZUZyb20odGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKSkgLVxuICAgICAgICAgICAgICAgICAgICBiLmFwcHJveERpc3RhbmNlRnJvbSh0aGlzLnJhaW5Ob2RlLmdldENlbnRlcigpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigodiwgaW5kZXgpID0+IGluZGV4IDwgMjAwKTtcblxuICAgICAgICAvLyBCdWlsZCBhIG1hcCBvZiBnYXVnZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgZ2F1Z2VzRnJvbUFwaSA9IG5ldyBNYXA8XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB7aWQ6IHN0cmluZzsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXI7IG5hbWU6IHN0cmluZ31cbiAgICAgICAgPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGdhdWdlIG9mIGdhdWdlc1RvRmlsdGVyKSB7XG4gICAgICAgICAgICBnYXVnZXNGcm9tQXBpLnNldChnYXVnZS5pZCwgZ2F1Z2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggbWlzc2luZyBnYXVnZXMgaW5kaXZpZHVhbGx5ICh0aG9zZSBsaW5rZWQgYnV0IG5vdCBpbiBBUEkgcmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IG1pc3NpbmdHYXVnZUlkcyA9IHJhaW5Ob2RlR2F1Z2VJZHMuZmlsdGVyKChpZCkgPT4gIWdhdWdlc0Zyb21BcGkuaGFzKGlkKSk7XG4gICAgICAgIGZvciAoY29uc3QgZ2F1Z2VJZCBvZiBtaXNzaW5nR2F1Z2VJZHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2F1Z2UgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEdhdWdlKGdhdWdlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChnYXVnZSkge1xuICAgICAgICAgICAgICAgICAgICBnYXVnZXNGcm9tQXBpLnNldChnYXVnZS5pZCwgZ2F1Z2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmZXRjaCBnYXVnZSAke2dhdWdlSWR9OmAsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlsdGVyIHRvIG9ubHkgZ2F1Z2VzIGxpbmtlZCB0byB0aGlzIHJhaW5Ob2RlXG4gICAgICAgIGNvbnN0IHZpc2libGVHYXVnZXMgPSByYWluTm9kZUdhdWdlSWRzXG4gICAgICAgICAgICAubWFwKChpZCkgPT4gZ2F1Z2VzRnJvbUFwaS5nZXQoaWQpKVxuICAgICAgICAgICAgLmZpbHRlcigoZykgPT4gISFnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3Zpc2libGVHYXVnZXM6JywgdmlzaWJsZUdhdWdlcy5sZW5ndGgsICcvJywgcmFpbk5vZGVHYXVnZUlkcy5sZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IGdhdWdlc0xhdExuZzogTWFwTGF0TG5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBnYXVnZSBvZiB2aXNpYmxlR2F1Z2VzKSB7XG4gICAgICAgICAgICBnYXVnZXNMYXRMbmcucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgTWFwTGF0TG5nKGdhdWdlLmxhdGl0dWRlLCBnYXVnZS5sb25naXR1ZGUsIHVuZGVmaW5lZCwgZ2F1Z2UuaWQsIGdhdWdlLm5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2F1Z2VzSW5NYXAgPSBnYXVnZXNMYXRMbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0R2F1Z2VzSW5Db21wYXJlKCkge1xuICAgICAgICBjb25zdCBxdWFsaXR5UG9pbnRzOiBRdWFsaXR5UG9pbnRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBhcmUgb2YgdGhpcy51aUNvbXBhcmVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1YWxpdHlQb2ludCBvZiBjb21wYXJlLmNvbXBhcmVQb2ludHNIaXN0b3J5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeUFkZGVkID0gcXVhbGl0eVBvaW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChwKSA9PiBwPy5nYXVnZUlkID09PSBxdWFsaXR5UG9pbnQuZ2F1Z2VJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlBZGRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcXVhbGl0eVBvaW50cy5wdXNoKHF1YWxpdHlQb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nYXVnZXNJbkNvbXBhcmUgPSBxdWFsaXR5UG9pbnRzLm1hcCgocCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgcC5nYXVnZUNhcnRlc2lhblZhbHVlLmxhdCxcbiAgICAgICAgICAgICAgICBwLmdhdWdlQ2FydGVzaWFuVmFsdWUubG5nLFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgcC5nYXVnZUlkLFxuICAgICAgICAgICAgICAgIHAuZ2F1Z2VMYWJlbCArICc+JyArIHAuZ2V0R2F1Z2VWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHAuZ2V0R2F1Z2VWYWx1ZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRHYXVnZXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWxlY3RHYXVnZShnYXVnZUlkOiBzdHJpbmcsIGNvbXBhcmVJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChnYXVnZUlkKSB7XG4gICAgICAgICAgICBjb25zdCB4eXMgPSB0aGlzLmdldEN1cnJlbnRRdWFsaXR5UG9pbnRzKGNvbXBhcmVJbmRleCkuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChwKSA9PiBwLmdhdWdlSWQgPT09IGdhdWdlSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSB4eXMubGVuZ3RoID09PSAxID8geHlzWzBdIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHYXVnZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkR2F1Z2VzKCk7XG4gICAgICAgICAgICBjb25zdCBnYXVnZXNGaWx0ZXJlZCA9IHRoaXMuZ2F1Z2VzSW5NYXAuZmlsdGVyKChnKSA9PiBnLmlkID09PSBnYXVnZUlkKTtcbiAgICAgICAgICAgIGlmIChnYXVnZXNGaWx0ZXJlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW2dhdWdlc0ZpbHRlcmVkWzBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IHRoaXMuZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4KS5maWx0ZXIoXG4gICAgICAgICAgICAocCkgPT4gcC5nYXVnZUlkID09PSB0aGlzLnNlbGVjdGVkR2F1Z2UuZ2F1Z2VJZFxuICAgICAgICApO1xuICAgICAgICBsZXQgcGl4ZWxzU29sdXRpb25zOiBNYXBMYXRMbmdbXVtdID0gW107XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkR2F1Z2VJblBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFya3MgPSBKU09OLnBhcnNlKHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5yZW1hcmspLnNvcnQoXG4gICAgICAgICAgICAgICAgKGEsIGIpID0+IGEuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bSAtIGIuY3JpdGVyaWFBdHRlbXB0ZWRUb0JlTWluaW11bVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlbWFya3MpO1xuICAgICAgICAgICAgcGl4ZWxzU29sdXRpb25zID0gcmVtYXJrcy5tYXAoKHJlbWFyaykgPT5cbiAgICAgICAgICAgICAgICByZW1hcmsuc29sdXRpb25Gb3JHYXVnZS5waXhlbHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC55ICsgMC4wMDUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC54ICsgMC4wMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICsgIXJlbWFyay5ub3RQb3NzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyArICFyZW1hcmsubm90UG9zc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVEZWx0YUluTWludXRlcyA9IHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nZXRUaW1lRGVsdGFJbk1pbnV0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzRGV0YWlsID1cbiAgICAgICAgICAgICAgICAnJyArXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdhdWdlTGFiZWwgK1xuICAgICAgICAgICAgICAgICcgPiAnICtcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nZXRHYXVnZVZhbHVlKCkgKiAxMDApIC8gMTAwICtcbiAgICAgICAgICAgICAgICAnIC8gJyArXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2V0UmFpblZhbHVlKCkgKiAxMDApIC8gMTAwICtcbiAgICAgICAgICAgICAgICAnIGRUPScgK1xuICAgICAgICAgICAgICAgIHRpbWVEZWx0YUluTWludXRlcztcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gW107XG4gICAgICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtcbiAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sYXQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VMYWJlbCArXG4gICAgICAgICAgICAgICAgICAgICc+JyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmdhdWdlQ2FydGVzaWFuVmFsdWUudmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS52YWx1ZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNlbGVjdEdhdWdlSW5Db21wYXJlKCk7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzOiBNYXBMYXRMbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJhaW5DYXJ0ZXNpYW5WYWx1ZSBvZiB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5yYWluQ2FydGVzaWFuVmFsdWVzKSB7XG4gICAgICAgICAgICBwaXhlbHMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgTWFwTGF0TG5nKHJhaW5DYXJ0ZXNpYW5WYWx1ZS5sYXQgKyAwLjAwNSwgcmFpbkNhcnRlc2lhblZhbHVlLmxuZyArIDAuMDEpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBwaXhlbHM7XG5cbiAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBwaXhlbHNTb2x1dGlvbnM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBhbGwgZ3JhbnVsYXIgcXVhbGl0eSBwb2ludHMgYWNyb3NzIGFsbCBkYXRlcyBpbiB0aGUgcGVyaW9kIChleGNsdWRlcyBjdW11bGF0aXZlIGVuZCBkYXRlKVxuICAgIGdldEFsbEdyYW51bGFyQ29tcGFyZVBvaW50cygpOiB7XG4gICAgICAgIGRhdGU6IERhdGU7XG4gICAgICAgIGdhdWdlTmFtZTogc3RyaW5nO1xuICAgICAgICBnYXVnZVZhbHVlOiBudW1iZXI7XG4gICAgICAgIHBpeGVsVmFsdWU6IG51bWJlcjtcbiAgICB9W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHtkYXRlOiBEYXRlOyBnYXVnZU5hbWU6IHN0cmluZzsgZ2F1Z2VWYWx1ZTogbnVtYmVyOyBwaXhlbFZhbHVlOiBudW1iZXJ9W10gPVxuICAgICAgICAgICAgW107XG5cbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXM/LmNvbXBhcmVzUGVyRGF0ZT8ubGVuZ3RoIHx8ICF0aGlzLmNvbXBhcmVEYXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBkYXRlIChjdW11bGF0aXZlIGVuZCBkYXRlKSB0byBleGNsdWRlIGl0XG4gICAgICAgIGNvbnN0IGxhc3REYXRlVGltZSA9IE1hdGgubWF4KC4uLnRoaXMuY29tcGFyZURhdGVzLm1hcCgoZCkgPT4gZC5nZXRUaW1lKCkpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBhcmVQZXJEYXRlIG9mIHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlc1BlckRhdGUpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhlIGxhc3QgZGF0ZSB3aGljaCBjb250YWlucyBjdW11bGF0aXZlIHZhbHVlc1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVQZXJEYXRlLmRhdGUuZ2V0VGltZSgpID49IGxhc3REYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb21wYXJlUGVyRGF0ZS5jb21wYXJlVGltZWxpbmU/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGZpcnN0IHRpbWVsaW5lIGVudHJ5IChjdXJyZW50IHN0ZXApIGZvciBlYWNoIGRhdGVcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb21wYXJlID0gY29tcGFyZVBlckRhdGUuY29tcGFyZVRpbWVsaW5lWzBdO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Q29tcGFyZT8ucXVhbGl0eVBvaW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHFwIG9mIGN1cnJlbnRDb21wYXJlLnF1YWxpdHlQb2ludHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGNvbXBhcmVQZXJEYXRlLmRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGdhdWdlTmFtZTogcXAuZ2F1Z2VMYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgZ2F1Z2VWYWx1ZTogcXAuZ2V0R2F1Z2VWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFZhbHVlOiBxcC5nZXRSYWluVmFsdWUoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBidWlsZENvbXBhcmVzVGltZWxpbmUoXG4gICAgICAgIHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdLFxuICAgICAgICBwZXJpb2Q6IHtiZWdpbjogRGF0ZTsgZW5kOiBEYXRlfSxcbiAgICAgICAgd2l0aENvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW5cbiAgICApOiBQcm9taXNlPElDb21wYXJlcz4ge1xuICAgICAgICBjb25zdCBjb21wYXJlRGF0ZXMgPSB0YXJnZXRzT3JkZXJlZC5tYXAoKHQpID0+IHQuZGF0ZSk7XG5cbiAgICAgICAgY29uc3QgcXVhbGl0aWVzOiBSYWluQ29tcHV0YXRpb25RdWFsaXR5W10gPSBjb21wYXJlRGF0ZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGQpID0+ICEhZClcbiAgICAgICAgICAgIC5tYXAoKGQpID0+IHRoaXMuZ2V0UmFpbkNvbXB1dGF0aW9uUXVhbGl0eShkKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHJjcSkgPT4gISFyY3EpO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZURhdGVzID0gY29tcGFyZURhdGVzPy5sZW5ndGggPiAxID8gY29tcGFyZURhdGVzIDogW3BlcmlvZC5iZWdpbiwgcGVyaW9kLmVuZF07IC8vIGNvbXBhcmVEYXRlcy5zbGljZSgxLCAtMSk7XG5cbiAgICAgICAgdGhpcy5idWlsZENvbXBhcmVzID0gU3BlZWRNYXRyaXhDb250YWluZXIuQnVpbGRDb21wYXJlcyhxdWFsaXRpZXMsICF3aXRoQ29tcGFyZUR1cGxpY2F0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ29tcGFyZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENvbXBhcmVQZXJEYXRlKGRhdGU6IERhdGUpOiBJQ29tcGFyZVBlckRhdGUge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlc1BlckRhdGUuZmlsdGVyKFxuICAgICAgICAgICAgKGMpID0+IGMuZGF0ZS5nZXRUaW1lKCkgPT09IGRhdGUuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy51aUNvbXBhcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgY29tcGFyZUluZGV4IDwgMCB8fFxuICAgICAgICAgICAgdGhpcy5jb21wYXJlTmFtZXMubGVuZ3RoIDwgY29tcGFyZUluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudWlDb21wYXJlc1tjb21wYXJlSW5kZXhdLmNvbXBhcmVQb2ludHNIaXN0b3J5O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhbkNvbXBhcmVRdWFsaXR5KGRldGFpbHM/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbiA9IGRldGFpbHM7XG4gICAgICAgIHRoaXMuY29tcGFyZU5hbWVzID0gW107XG4gICAgICAgIHRoaXMudWlDb21wYXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVTcGVlZE1hdHJpeCA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBhcmVUcnVzdGVkSW5kaWNhdG9yID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlEb25lRGF0ZSA9IG5ldyBEYXRlKC0xKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eUxhdW5jaGVkQnkgPSAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgPSAtMTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hSYWluQ29tcHV0YXRpb25RdWFsaXRpZXMoXG4gICAgICAgIHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdLFxuICAgICAgICBjdW11bGF0aXZlSG91cnM6IG51bWJlciA9IDBcbiAgICApIHtcbiAgICAgICAgLy8gRm9yIE4taG91ciBjdW11bGF0aXZlLCBvbmx5IGZldGNoIG9uY2UgZm9yIHRoZSBsYXN0IHRhcmdldCAoZW5kIG9mIHBlcmlvZClcbiAgICAgICAgY29uc3QgdGFyZ2V0c1RvRmV0Y2ggPVxuICAgICAgICAgICAgY3VtdWxhdGl2ZUhvdXJzID4gMCA/IFt0YXJnZXRzT3JkZXJlZFt0YXJnZXRzT3JkZXJlZC5sZW5ndGggLSAxXV0gOiB0YXJnZXRzT3JkZXJlZDtcblxuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzVG9GZXRjaCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGVbdGFyZ2V0LmRhdGUudG9JU09TdHJpbmcoKV0pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eTogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VtdWxhdGl2ZUhvdXJzID4gMCAmJiB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOLWhvdXIgY3VtdWxhdGl2ZTogZmV0Y2ggYWdncmVnYXRlZCBxdWFsaXR5IGZvciB0aGUgd2hvbGUgcGVyaW9kXG4gICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5DdW11bGF0aXZlQ3VtdWxhdGl2ZXNDb21wYXJlQnlEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZUhvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA1LW1pbiBncmFudWxhcjogZmV0Y2ggaW5kaXZpZHVhbCBxdWFsaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICByYWluQ29tcHV0YXRpb25RdWFsaXR5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFJhaW5DdW11bGF0aXZlQ29tcGFyZUJ5RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYWluTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJhaW5Db21wdXRhdGlvbkN1bXVsYXRpdmVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhaW5Db21wdXRhdGlvblF1YWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0NvbnNpc3RlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0cmljZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHkucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyLmdldE1hdHJpY2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdHJpeCBvZiBtYXRyaWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWF0cml4LmlzQ29uc2lzdGVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc2lzdGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbnNpc3RlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbmUgb2YgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eSBtYXRyaWNlcyBpcyBub3QgY29uc2lzdGVudCBmb3IgJHt0YXJnZXQuZGF0ZS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGVbdGFyZ2V0LmRhdGUudG9JU09TdHJpbmcoKV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UmFpbkNvbXB1dGF0aW9uUXVhbGl0eShkYXRlOiBEYXRlKTogUmFpbkNvbXB1dGF0aW9uUXVhbGl0eSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhaW5Db21wdXRhdGlvblF1YWxpdGllc1BlckRhdGVbZGF0ZS50b0lTT1N0cmluZygpXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0R2F1Z2VJbkNvbXBhcmUoKSB7XG4gICAgICAgIGNvbnN0IGdsb2JhbENvbXBhcmVQb2ludHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cykpO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgZ2xvYmFsQ29tcGFyZVBvaW50cykge1xuICAgICAgICAgICAgaWYgKHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzPy5nYXVnZUlkKSB7XG4gICAgICAgICAgICAgICAgcC5yID0gMTA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHAuciA9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzID0gZ2xvYmFsQ29tcGFyZVBvaW50cztcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBhcmUgb2YgdGhpcy51aUNvbXBhcmVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wYXJlUG9pbnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb21wYXJlLmNvbXBhcmVQb2ludHMpKTtcbiAgICAgICAgICAgIGNvbXBhcmVQb2ludHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwLmlkID09PSB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cz8uZ2F1Z2VJZCkge1xuICAgICAgICAgICAgICAgICAgICBwLnIgPSAxMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwLnIgPSAzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29tcGFyZS5jb21wYXJlUG9pbnRzID0gY29tcGFyZVBvaW50cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNldFNlbGVjdGVkR2F1Z2VzKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncmVzZXRTZWxlY3RlZEdhdWdlcyByZXNldCcpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IFtdO1xuICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdEdhdWdlSW5Db21wYXJlKCk7XG4gICAgfVxufVxuIl19
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGFyZU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvdG9vbHMvQ29tcGFyZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQ0gsU0FBUyxFQUlULHNCQUFzQixFQUl0QixXQUFXLEVBQ1gsb0JBQW9CLEdBQ3ZCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFvQmpDLE1BQU0sT0FBTyxjQUFjO0lBNkJ2QixZQUNjLGNBQThCLEVBQ2pDLFlBQXdCLEdBQUcsRUFBRSxHQUFFLENBQUM7UUFEN0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBRXZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLElBQVcsd0JBQXdCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUU7WUFDL0QsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUN6RCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQzFGLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBVywyQkFBMkI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUU7WUFDeEMsT0FBTyxJQUFJLE1B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QUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLEVBQUU7b0JBQzlDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNaO3FCQUFNO29CQUNILENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFUyxtQkFBbUI7UUFDekIsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXBMYXRMbmd9IGZyb20gJ3JhYWluLXVpJztcbmltcG9ydCB7XG4gICAgR2F1Z2VOb2RlLFxuICAgIElDb21wYXJlUGVyRGF0ZSxcbiAgICBJQ29tcGFyZXMsXG4gICAgUG9zaXRpb25WYWx1ZSxcbiAgICBRdWFsaXR5SW5kaWNhdG9yTWV0aG9kLFxuICAgIFF1YWxpdHlQb2ludCxcbiAgICBSYWluQ29tcHV0YXRpb25RdWFsaXR5LFxuICAgIFJhaW5Ob2RlLFxuICAgIFNwZWVkTWF0cml4LFxuICAgIFNwZWVkTWF0cml4Q29udGFpbmVyLFxufSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4uL3Byb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0ZyYW1lU2V0fSBmcm9tICcuL0ZyYW1lU2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcGFyZVRhcmdldCB7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICByYWluQ29tcHV0YXRpb25JZD86IHN0cmluZztcbiAgICByYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVJQ29tcGFyZSB7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29tcGFyZVBvaW50czogWFlUeXBlW107XG4gICAgY29tcGFyZVBvaW50c01heDogWFlUeXBlO1xuICAgIGNvbXBhcmVQb2ludHNIaXN0b3J5OiBRdWFsaXR5UG9pbnRbXTtcbiAgICByZW1hcmtzOiBzdHJpbmc7XG4gICAgcXVhbGl0eUluZGljYXRvcjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGFyZU1hbmFnZXIge1xuICAgIHB1YmxpYyBnYXVnZXNJbk1hcDogTWFwTGF0TG5nW107XG4gICAgcHVibGljIGdhdWdlc0luQ29tcGFyZTogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHNlbGVjdGVkR2F1Z2VzOiBNYXBMYXRMbmdbXTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRQaXhlbHM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyBwaXhlbHNTb2x1dGlvbnM6IE1hcExhdExuZ1tdW107XG4gICAgcHVibGljIHNwZWVkczogTWFwTGF0TG5nW107XG5cbiAgICAvLyBmcm9tIGNvbXBhcmVzVGltZWxpbmVcbiAgICBwdWJsaWMgY29tcGFyZU5hbWVzOiBzdHJpbmdbXTtcbiAgICBwdWJsaWMgdWlDb21wYXJlczogSVVJQ29tcGFyZVtdO1xuICAgIHB1YmxpYyBjb21wYXJlU3BlZWRNYXRyaXg6IFBvc2l0aW9uVmFsdWVbXTtcbiAgICBwdWJsaWMgY29tcGFyZVZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaWMgY29tcGFyZVRydXN0ZWRJbmRpY2F0b3I6IG51bWJlcjtcbiAgICBwdWJsaWMgY29tcGFyZURhdGVzOiBEYXRlW107XG5cbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlEb25lRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5OiBzdHJpbmc7XG4gICAgcHVibGljIGN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NczogbnVtYmVyO1xuICAgIHB1YmxpYyBnbG9iYWxDb21wYXJlUG9pbnRzOiBYWVR5cGVbXTtcbiAgICBwdWJsaWMgZ2xvYmFsQ29tcGFyZVBvaW50c01heDogWFlUeXBlO1xuICAgIHB1YmxpYyBnbG9iYWxRdWFsaXR5SW5kaWNhdG9yOiBudW1iZXI7XG4gICAgcHVibGljIGNvbXBhcmVTcGVlZDoge2FuZ2xlSW5EZWdyZWVzOiBudW1iZXI7IHBpeGVsc1BlclBlcmlvZDogbnVtYmVyfTtcbiAgICBwcm90ZWN0ZWQgYnVpbGRDb21wYXJlczogSUNvbXBhcmVzO1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZEdhdWdlOiBRdWFsaXR5UG9pbnQ7XG4gICAgcHJvdGVjdGVkIHNlbGVjdGVkR2F1Z2VJblBvaW50czogUXVhbGl0eVBvaW50O1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZEdhdWdlSW5Qb2ludHNEZXRhaWw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZTogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBvbkNoYW5nZXM6ICgpID0+IHZvaWQgPSAoKSA9PiB7fVxuICAgICkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2VkIGN1bXVsYXRpdmUgZnJvbSBncmFudWxhciBjb21wYXJpc29ucyAoY29tcHV0ZWQgZnJvbSBidWlsZENvbXBhcmVzKVxuICAgIHB1YmxpYyBnZXQgZ3JhbnVsYXJDdW11bGF0aXZlUG9pbnRzKCk6IFhZVHlwZVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXM/LmNvbXBhcmVDdW11bGF0aXZlPy5xdWFsaXR5UG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZENvbXBhcmVzLmNvbXBhcmVDdW11bGF0aXZlLnF1YWxpdHlQb2ludHMubWFwKFxuICAgICAgICAgICAgKHFwKSA9PiBuZXcgWFlUeXBlKHFwLmdldEdhdWdlVmFsdWUoKSwgcXAuZ2V0UmFpblZhbHVlKCksIDIsIHFwLmdhdWdlTGFiZWwsIHFwLmdhdWdlSWQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncmFudWxhckN1bXVsYXRpdmVQb2ludHNNYXgoKTogWFlUeXBlIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXM/LmNvbXBhcmVDdW11bGF0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhZVHlwZSgwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZS5tYXhWYWx1ZSAqIDEuMjtcbiAgICAgICAgcmV0dXJuIG5ldyBYWVR5cGUobWF4VmFsdWUsIG1heFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdyYW51bGFyQ3VtdWxhdGl2ZVF1YWxpdHlJbmRpY2F0b3IoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkQ29tcGFyZXM/LmNvbXBhcmVDdW11bGF0aXZlPy5xdWFsaXR5UG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTcGVlZE1hdHJpeC5Db21wdXRlUXVhbGl0eUluZGljYXRvcihcbiAgICAgICAgICAgIHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZS5xdWFsaXR5UG9pbnRzLFxuICAgICAgICAgICAge21ldGhvZDogUXVhbGl0eUluZGljYXRvck1ldGhvZC5OQVNIX1NVVENMSUZGRX1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JhaW5Ob2RlOiBSYWluTm9kZTtcblxuICAgIHB1YmxpYyBnZXQgcmFpbk5vZGUoKTogUmFpbk5vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFpbk5vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByYWluTm9kZShyYWluTm9kZTogUmFpbk5vZGUpIHtcbiAgICAgICAgdGhpcy5fcmFpbk5vZGUgPSByYWluTm9kZTtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkFsbCgpIHtcbiAgICAgICAgdGhpcy5nYXVnZXNJbk1hcCA9IFtdO1xuICAgICAgICB0aGlzLmdhdWdlc0luQ29tcGFyZSA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5waXhlbHNTb2x1dGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb21wYXJlRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGVlZHMgPSBbXTtcblxuICAgICAgICB0aGlzLmJ1aWxkQ29tcGFyZXMgPSB7XG4gICAgICAgICAgICBjb21wYXJlc1BlckRhdGU6IFtdLFxuICAgICAgICAgICAgY29tcGFyZUN1bXVsYXRpdmU6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHNNYXggPSBuZXcgWFlUeXBlKDAsIDApO1xuICAgICAgICB0aGlzLmdsb2JhbFF1YWxpdHlJbmRpY2F0b3IgPSBudWxsO1xuICAgICAgICAvLyBncmFudWxhckN1bXVsYXRpdmUqIGFyZSBub3cgZ2V0dGVycyBjb21wdXRlZCBmcm9tIGJ1aWxkQ29tcGFyZXNcbiAgICAgICAgdGhpcy5yYWluQ29tcHV0YXRpb25RdWFsaXRpZXNQZXJEYXRlID0ge307XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsZWFuQ29tcGFyZVF1YWxpdHkoJ25vIGNvbXBhcmUgeWV0Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaENvbXBhcmVRdWFsaXR5KGZyYW1lU2V0OiBGcmFtZVNldCwgb25seU9uZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBjb21wYXJlUGVyRGF0ZSA9IHRoaXMuZ2V0Q29tcGFyZVBlckRhdGUoZnJhbWVTZXQuZGF0ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWNvbXBhcmVQZXJEYXRlIHx8XG4gICAgICAgICAgICAhY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eT8ucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gdGhpcy5jbGVhbkNvbXBhcmVRdWFsaXR5KFxuICAgICAgICAgICAgLy8gICAgICdubyBjdXJyZW50IHF1YWxpdHkgJyArIE9iamVjdC5rZXlzKHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZSlcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAvLyB0aGlzLm9uQ2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9ubHlPbmUpIHtcbiAgICAgICAgICAgIGNvbXBhcmVQZXJEYXRlLmNvbXBhcmVUaW1lbGluZSA9IGNvbXBhcmVQZXJEYXRlLmNvbXBhcmVUaW1lbGluZS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGMpID0+IGMuZGF0ZS5nZXRUaW1lKCkgPT09IGZyYW1lU2V0LmRhdGUuZ2V0VGltZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdWlDb21wYXJlczogSVVJQ29tcGFyZVtdID0gY29tcGFyZVBlckRhdGUuY29tcGFyZVRpbWVsaW5lXG4gICAgICAgICAgICAubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVhbGl0eUluZGljYXRvciA9IFNwZWVkTWF0cml4LkNvbXB1dGVRdWFsaXR5SW5kaWNhdG9yKGMucXVhbGl0eVBvaW50cywge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFF1YWxpdHlJbmRpY2F0b3JNZXRob2QuTkFTSF9TVVRDTElGRkUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogYy5kYXRlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHM6IGMucXVhbGl0eVBvaW50cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWFlUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldEdhdWdlVmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRSYWluVmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nYXVnZUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdhdWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHNNYXg6IG5ldyBYWVR5cGUoYy5tYXhWYWx1ZSAqIDEuMiwgYy5tYXhWYWx1ZSAqIDEuMiksXG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQb2ludHNIaXN0b3J5OiBjLnF1YWxpdHlQb2ludHNMZWdhY3ksXG4gICAgICAgICAgICAgICAgICAgIHJlbWFya3M6IGMucmVtYXJrcyxcbiAgICAgICAgICAgICAgICAgICAgcXVhbGl0eUluZGljYXRvcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmRhdGU/LmdldFRpbWUoKSAtIGIuZGF0ZT8uZ2V0VGltZSgpKTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5RG9uZURhdGUgPSBjb21wYXJlUGVyRGF0ZS5yYWluQ29tcHV0YXRpb25RdWFsaXR5LmlzRG9uZURhdGU7XG4gICAgICAgIHRoaXMuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zID0gY29tcGFyZVBlckRhdGUucmFpbkNvbXB1dGF0aW9uUXVhbGl0eS50aW1lU3BlbnRJbk1zO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkubGF1bmNoZWRCeTtcbiAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbiA9IGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkuZ2V0VmVyc2lvbigpO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZVNwZWVkID1cbiAgICAgICAgICAgIGNvbXBhcmVQZXJEYXRlLnJhaW5Db21wdXRhdGlvblF1YWxpdHkucXVhbGl0eVNwZWVkTWF0cml4Q29udGFpbmVyLmdldFNwZWVkKCk7XG4gICAgICAgIHRoaXMuY29tcGFyZU5hbWVzID0gdWlDb21wYXJlcy5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgICAgIHRoaXMudWlDb21wYXJlcyA9IHVpQ29tcGFyZXM7XG5cbiAgICAgICAgdGhpcy5vbkNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoR2xvYmFsQ29tcGFyZVF1YWxpdHkoXG4gICAgICAgIHRhcmdldHNPcmRlcmVkOiBJQ29tcGFyZVRhcmdldFtdLFxuICAgICAgICBwZXJpb2Q6IHtiZWdpbjogRGF0ZTsgZW5kOiBEYXRlfSxcbiAgICAgICAgd2l0aENvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW4sXG4gICAgICAgIGN1bXVsYXRpdmVIb3VyczogbnVtYmVyID0gMFxuICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFJhaW5Db21wdXRhdGlvblF1YWxpdGllcyh0YXJnZXRzT3JkZXJlZCwgY3VtdWxhdGl2ZUhvdXJzKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZENvbXBhcmVzVGltZWxpbmUodGFyZ2V0c09yZGVyZWQsIHBlcmlvZCwgd2l0aENvbXBhcmVEdXBsaWNhdGUpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRocm93IEVycm9yKCduZWVkcyBjdW11bGF0aXZlIGNvbXBhcmUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvdW50Rm9yQXZlcmFnZSA9IHRhcmdldHNPcmRlcmVkLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5idWlsZENvbXBhcmVzLmNvbXBhcmVDdW11bGF0aXZlLm1heFZhbHVlICogMS4yO1xuICAgICAgICAgICAgY29uc3QgY3VtdWxhdGl2ZVBvaW50cyA9IHRoaXMuYnVpbGRDb21wYXJlcy5jb21wYXJlQ3VtdWxhdGl2ZS5xdWFsaXR5UG9pbnRzLm1hcChcbiAgICAgICAgICAgICAgICAocXApID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBYWVR5cGUocXAuZ2V0R2F1Z2VWYWx1ZSgpLCBxcC5nZXRSYWluVmFsdWUoKSwgMiwgcXAuZ2F1Z2VMYWJlbCwgcXAuZ2F1Z2VJZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjdW11bGF0aXZlUG9pbnRzTWF4ID0gbmV3IFhZVHlwZShtYXhWYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgY3VtdWxhdGl2ZVF1YWxpdHlJbmRpY2F0b3IgPSBTcGVlZE1hdHJpeC5Db21wdXRlUXVhbGl0eUluZGljYXRvcihcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmUucXVhbGl0eVBvaW50cyxcbiAgICAgICAgICAgICAgICB7bWV0aG9kOiBRdWFsaXR5SW5kaWNhdG9yTWV0aG9kLk5BU0hfU1VUQ0xJRkZFfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2V0IGZvciBjdW11bGF0aXZlIG1vZGVcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsQ29tcGFyZVBvaW50cyA9IGN1bXVsYXRpdmVQb2ludHM7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHNNYXggPSBjdW11bGF0aXZlUG9pbnRzTWF4O1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxRdWFsaXR5SW5kaWNhdG9yID0gY3VtdWxhdGl2ZVF1YWxpdHlJbmRpY2F0b3I7XG4gICAgICAgICAgICAvLyBncmFudWxhckN1bXVsYXRpdmUqIGFyZSBub3cgZ2V0dGVycyBjb21wdXRlZCBmcm9tIGJ1aWxkQ29tcGFyZXMuY29tcGFyZUN1bXVsYXRpdmVcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0R2F1Z2VzSW5NYXAoKSB7XG4gICAgICAgIC8vIEdldCBhbGwgZ2F1Z2UgSURzIGxpbmtlZCB0byB0aGlzIHJhaW5Ob2RlXG4gICAgICAgIGNvbnN0IHJhaW5Ob2RlR2F1Z2VJZHMgPSB0aGlzLnJhaW5Ob2RlLmdldExpbmtzKEdhdWdlTm9kZS5UWVBFKS5tYXAoKGwpID0+IGwuZ2V0SWQoKSk7XG5cbiAgICAgICAgLy8gRmV0Y2ggZ2F1Z2VzIGZyb20gQVBJIChtYXkgYmUgZmlsdGVyZWQvbGltaXRlZClcbiAgICAgICAgbGV0IGdhdWdlc1RvRmlsdGVyID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRHYXVnZXMoXG4gICAgICAgICAgICB0aGlzLnJhaW5Ob2RlPy5pZCxcbiAgICAgICAgICAgIHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKClcbiAgICAgICAgKTtcbiAgICAgICAgZ2F1Z2VzVG9GaWx0ZXIgPSBnYXVnZXNUb0ZpbHRlclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBhLmFwcHJveERpc3RhbmNlRnJvbSh0aGlzLnJhaW5Ob2RlLmdldENlbnRlcigpKSAtXG4gICAgICAgICAgICAgICAgICAgIGIuYXBwcm94RGlzdGFuY2VGcm9tKHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh2LCBpbmRleCkgPT4gaW5kZXggPCAyMDApO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgbWFwIG9mIGdhdWdlcyBmcm9tIEFQSSByZXNwb25zZVxuICAgICAgICBjb25zdCBnYXVnZXNGcm9tQXBpID0gbmV3IE1hcDxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHtpZDogc3RyaW5nOyBsYXRpdHVkZTogbnVtYmVyOyBsb25naXR1ZGU6IG51bWJlcjsgbmFtZTogc3RyaW5nfVxuICAgICAgICA+KCk7XG4gICAgICAgIGZvciAoY29uc3QgZ2F1Z2Ugb2YgZ2F1Z2VzVG9GaWx0ZXIpIHtcbiAgICAgICAgICAgIGdhdWdlc0Zyb21BcGkuc2V0KGdhdWdlLmlkLCBnYXVnZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCBtaXNzaW5nIGdhdWdlcyBpbmRpdmlkdWFsbHkgKHRob3NlIGxpbmtlZCBidXQgbm90IGluIEFQSSByZXNwb25zZSlcbiAgICAgICAgY29uc3QgbWlzc2luZ0dhdWdlSWRzID0gcmFpbk5vZGVHYXVnZUlkcy5maWx0ZXIoKGlkKSA9PiAhZ2F1Z2VzRnJvbUFwaS5oYXMoaWQpKTtcbiAgICAgICAgZm9yIChjb25zdCBnYXVnZUlkIG9mIG1pc3NpbmdHYXVnZUlkcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBnYXVnZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0R2F1Z2UoZ2F1Z2VJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGdhdWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdhdWdlc0Zyb21BcGkuc2V0KGdhdWdlLmlkLCBnYXVnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIGdhdWdlICR7Z2F1Z2VJZH06YCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWx0ZXIgdG8gb25seSBnYXVnZXMgbGlua2VkIHRvIHRoaXMgcmFpbk5vZGVcbiAgICAgICAgY29uc3QgdmlzaWJsZUdhdWdlcyA9IHJhaW5Ob2RlR2F1Z2VJZHNcbiAgICAgICAgICAgIC5tYXAoKGlkKSA9PiBnYXVnZXNGcm9tQXBpLmdldChpZCkpXG4gICAgICAgICAgICAuZmlsdGVyKChnKSA9PiAhIWcpO1xuICAgICAgICBjb25zb2xlLmxvZygndmlzaWJsZUdhdWdlczonLCB2aXNpYmxlR2F1Z2VzLmxlbmd0aCwgJy8nLCByYWluTm9kZUdhdWdlSWRzLmxlbmd0aCk7XG5cbiAgICAgICAgY29uc3QgZ2F1Z2VzTGF0TG5nOiBNYXBMYXRMbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdhdWdlIG9mIHZpc2libGVHYXVnZXMpIHtcbiAgICAgICAgICAgIGdhdWdlc0xhdExuZy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcoZ2F1Z2UubGF0aXR1ZGUsIGdhdWdlLmxvbmdpdHVkZSwgdW5kZWZpbmVkLCBnYXVnZS5pZCwgZ2F1Z2UubmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYXVnZXNJbk1hcCA9IGdhdWdlc0xhdExuZztcbiAgICB9XG5cbiAgICBhc3luYyBzZXRHYXVnZXNJbkNvbXBhcmUoKSB7XG4gICAgICAgIGNvbnN0IHF1YWxpdHlQb2ludHM6IFF1YWxpdHlQb2ludFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLnVpQ29tcGFyZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcXVhbGl0eVBvaW50IG9mIGNvbXBhcmUuY29tcGFyZVBvaW50c0hpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5QWRkZWQgPSBxdWFsaXR5UG9pbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKHApID0+IHA/LmdhdWdlSWQgPT09IHF1YWxpdHlQb2ludC5nYXVnZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUFkZGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBxdWFsaXR5UG9pbnRzLnB1c2gocXVhbGl0eVBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdhdWdlc0luQ29tcGFyZSA9IHF1YWxpdHlQb2ludHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcExhdExuZyhcbiAgICAgICAgICAgICAgICBwLmdhdWdlQ2FydGVzaWFuVmFsdWUubGF0LFxuICAgICAgICAgICAgICAgIHAuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS5sbmcsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBwLmdhdWdlSWQsXG4gICAgICAgICAgICAgICAgcC5nYXVnZUxhYmVsICsgJz4nICsgcC5nZXRHYXVnZVZhbHVlKCksXG4gICAgICAgICAgICAgICAgcC5nZXRHYXVnZVZhbHVlKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdhdWdlcygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdEdhdWdlKGdhdWdlSWQ6IHN0cmluZywgY29tcGFyZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGdhdWdlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHh5cyA9IHRoaXMuZ2V0Q3VycmVudFF1YWxpdHlQb2ludHMoY29tcGFyZUluZGV4KS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHApID0+IHAuZ2F1Z2VJZCA9PT0gZ2F1Z2VJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IHh5cy5sZW5ndGggPT09IDEgPyB4eXNbMF0gOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEdhdWdlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRHYXVnZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGdhdWdlc0ZpbHRlcmVkID0gdGhpcy5nYXVnZXNJbk1hcC5maWx0ZXIoKGcpID0+IGcuaWQgPT09IGdhdWdlSWQpO1xuICAgICAgICAgICAgaWYgKGdhdWdlc0ZpbHRlcmVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbZ2F1Z2VzRmlsdGVyZWRbMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gdGhpcy5nZXRDdXJyZW50UXVhbGl0eVBvaW50cyhjb21wYXJlSW5kZXgpLmZpbHRlcihcbiAgICAgICAgICAgIChwKSA9PiBwLmdhdWdlSWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZS5nYXVnZUlkXG4gICAgICAgICk7XG4gICAgICAgIGxldCBwaXhlbHNTb2x1dGlvbnM6IE1hcExhdExuZ1tdW10gPSBbXTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRHYXVnZUluUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgcmVtYXJrcyA9IEpTT04ucGFyc2Uoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLnJlbWFyaykuc29ydChcbiAgICAgICAgICAgICAgICAoYSwgYikgPT4gYS5jcml0ZXJpYUF0dGVtcHRlZFRvQmVNaW5pbXVtIC0gYi5jcml0ZXJpYUF0dGVtcHRlZFRvQmVNaW5pbXVtXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVtYXJrcyk7XG4gICAgICAgICAgICBwaXhlbHNTb2x1dGlvbnMgPSByZW1hcmtzLm1hcCgocmVtYXJrKSA9PlxuICAgICAgICAgICAgICAgIHJlbWFyay5zb2x1dGlvbkZvckdhdWdlLnBpeGVscy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hcExhdExuZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnkgKyAwLjAwNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnggKyAwLjAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJycgKyAhcmVtYXJrLm5vdFBvc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICsgIXJlbWFyay5ub3RQb3NzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgdGltZURlbHRhSW5NaW51dGVzID0gc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdldFRpbWVEZWx0YUluTWludXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHNEZXRhaWwgPVxuICAgICAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdhdWdlSW5Qb2ludHNbMF0uZ2F1Z2VMYWJlbCArXG4gICAgICAgICAgICAgICAgJyA+ICcgK1xuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoc2VsZWN0ZWRHYXVnZUluUG9pbnRzWzBdLmdldEdhdWdlVmFsdWUoKSAqIDEwMCkgLyAxMDAgK1xuICAgICAgICAgICAgICAgICcgLyAnICtcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXS5nZXRSYWluVmFsdWUoKSAqIDEwMCkgLyAxMDAgK1xuICAgICAgICAgICAgICAgICcgZFQ9JyArXG4gICAgICAgICAgICAgICAgdGltZURlbHRhSW5NaW51dGVzO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cyA9IHNlbGVjdGVkR2F1Z2VJblBvaW50c1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaXhlbHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxzU29sdXRpb25zID0gW107XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VzID0gW1xuICAgICAgICAgICAgbmV3IE1hcExhdExuZyhcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUNhcnRlc2lhblZhbHVlLmxhdCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUNhcnRlc2lhblZhbHVlLmxuZyxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VJZCxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUxhYmVsICtcbiAgICAgICAgICAgICAgICAgICAgJz4nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHMuZ2F1Z2VDYXJ0ZXNpYW5WYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkR2F1Z2VJblBvaW50cy5nYXVnZUNhcnRlc2lhblZhbHVlLnZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0R2F1Z2VJbkNvbXBhcmUoKTtcblxuICAgICAgICBjb25zdCBwaXhlbHM6IE1hcExhdExuZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmFpbkNhcnRlc2lhblZhbHVlIG9mIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzLnJhaW5DYXJ0ZXNpYW5WYWx1ZXMpIHtcbiAgICAgICAgICAgIHBpeGVscy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBNYXBMYXRMbmcocmFpbkNhcnRlc2lhblZhbHVlLmxhdCArIDAuMDA1LCByYWluQ2FydGVzaWFuVmFsdWUubG5nICsgMC4wMSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZFBpeGVscyA9IHBpeGVscztcblxuICAgICAgICB0aGlzLnBpeGVsc1NvbHV0aW9ucyA9IHBpeGVsc1NvbHV0aW9ucztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGFsbCBncmFudWxhciBxdWFsaXR5IHBvaW50cyBhY3Jvc3MgYWxsIGRhdGVzIGluIHRoZSBwZXJpb2QgKGV4Y2x1ZGVzIGN1bXVsYXRpdmUgZW5kIGRhdGUpXG4gICAgZ2V0QWxsR3JhbnVsYXJDb21wYXJlUG9pbnRzKCk6IHtcbiAgICAgICAgZGF0ZTogRGF0ZTtcbiAgICAgICAgZ2F1Z2VOYW1lOiBzdHJpbmc7XG4gICAgICAgIGdhdWdlVmFsdWU6IG51bWJlcjtcbiAgICAgICAgcGl4ZWxWYWx1ZTogbnVtYmVyO1xuICAgIH1bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDoge2RhdGU6IERhdGU7IGdhdWdlTmFtZTogc3RyaW5nOyBnYXVnZVZhbHVlOiBudW1iZXI7IHBpeGVsVmFsdWU6IG51bWJlcn1bXSA9XG4gICAgICAgICAgICBbXTtcblxuICAgICAgICBpZiAoIXRoaXMuYnVpbGRDb21wYXJlcz8uY29tcGFyZXNQZXJEYXRlPy5sZW5ndGggfHwgIXRoaXMuY29tcGFyZURhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IGRhdGUgKGN1bXVsYXRpdmUgZW5kIGRhdGUpIHRvIGV4Y2x1ZGUgaXRcbiAgICAgICAgY29uc3QgbGFzdERhdGVUaW1lID0gTWF0aC5tYXgoLi4udGhpcy5jb21wYXJlRGF0ZXMubWFwKChkKSA9PiBkLmdldFRpbWUoKSkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29tcGFyZVBlckRhdGUgb2YgdGhpcy5idWlsZENvbXBhcmVzLmNvbXBhcmVzUGVyRGF0ZSkge1xuICAgICAgICAgICAgLy8gU2tpcCB0aGUgbGFzdCBkYXRlIHdoaWNoIGNvbnRhaW5zIGN1bXVsYXRpdmUgdmFsdWVzXG4gICAgICAgICAgICBpZiAoY29tcGFyZVBlckRhdGUuZGF0ZS5nZXRUaW1lKCkgPj0gbGFzdERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVQZXJEYXRlLmNvbXBhcmVUaW1lbGluZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgZmlyc3QgdGltZWxpbmUgZW50cnkgKGN1cnJlbnQgc3RlcCkgZm9yIGVhY2ggZGF0ZVxuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbXBhcmUgPSBjb21wYXJlUGVyRGF0ZS5jb21wYXJlVGltZWxpbmVbMF07XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRDb21wYXJlPy5xdWFsaXR5UG9pbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcXAgb2YgY3VycmVudENvbXBhcmUucXVhbGl0eVBvaW50cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogY29tcGFyZVBlckRhdGUuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2F1Z2VOYW1lOiBxcC5nYXVnZUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBnYXVnZVZhbHVlOiBxcC5nZXRHYXVnZVZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsVmFsdWU6IHFwLmdldFJhaW5WYWx1ZSgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmRhdGUuZ2V0VGltZSgpIC0gYi5kYXRlLmdldFRpbWUoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkQ29tcGFyZXNUaW1lbGluZShcbiAgICAgICAgdGFyZ2V0c09yZGVyZWQ6IElDb21wYXJlVGFyZ2V0W10sXG4gICAgICAgIHBlcmlvZDoge2JlZ2luOiBEYXRlOyBlbmQ6IERhdGV9LFxuICAgICAgICB3aXRoQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhblxuICAgICk6IFByb21pc2U8SUNvbXBhcmVzPiB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVEYXRlcyA9IHRhcmdldHNPcmRlcmVkLm1hcCgodCkgPT4gdC5kYXRlKTtcblxuICAgICAgICBjb25zdCBxdWFsaXRpZXM6IFJhaW5Db21wdXRhdGlvblF1YWxpdHlbXSA9IGNvbXBhcmVEYXRlc1xuICAgICAgICAgICAgLmZpbHRlcigoZCkgPT4gISFkKVxuICAgICAgICAgICAgLm1hcCgoZCkgPT4gdGhpcy5nZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5KGQpKVxuICAgICAgICAgICAgLmZpbHRlcigocmNxKSA9PiAhIXJjcSk7XG5cbiAgICAgICAgdGhpcy5jb21wYXJlRGF0ZXMgPSBjb21wYXJlRGF0ZXM/Lmxlbmd0aCA+IDEgPyBjb21wYXJlRGF0ZXMgOiBbcGVyaW9kLmJlZ2luLCBwZXJpb2QuZW5kXTsgLy8gY29tcGFyZURhdGVzLnNsaWNlKDEsIC0xKTtcblxuICAgICAgICB0aGlzLmJ1aWxkQ29tcGFyZXMgPSBTcGVlZE1hdHJpeENvbnRhaW5lci5CdWlsZENvbXBhcmVzKHF1YWxpdGllcywgIXdpdGhDb21wYXJlRHVwbGljYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDb21wYXJlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q29tcGFyZVBlckRhdGUoZGF0ZTogRGF0ZSk6IElDb21wYXJlUGVyRGF0ZSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5idWlsZENvbXBhcmVzLmNvbXBhcmVzUGVyRGF0ZS5maWx0ZXIoXG4gICAgICAgICAgICAoYykgPT4gYy5kYXRlLmdldFRpbWUoKSA9PT0gZGF0ZS5nZXRUaW1lKClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDdXJyZW50UXVhbGl0eVBvaW50cyhjb21wYXJlSW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnVpQ29tcGFyZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBjb21wYXJlSW5kZXggPCAwIHx8XG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVOYW1lcy5sZW5ndGggPCBjb21wYXJlSW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy51aUNvbXBhcmVzW2NvbXBhcmVJbmRleF0uY29tcGFyZVBvaW50c0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsZWFuQ29tcGFyZVF1YWxpdHkoZGV0YWlscz86IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbXBhcmVWZXJzaW9uID0gZGV0YWlscztcbiAgICAgICAgdGhpcy5jb21wYXJlTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy51aUNvbXBhcmVzID0gW107XG4gICAgICAgIHRoaXMuY29tcGFyZVNwZWVkTWF0cml4ID0gW107XG4gICAgICAgIHRoaXMuY29tcGFyZVRydXN0ZWRJbmRpY2F0b3IgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50UXVhbGl0eURvbmVEYXRlID0gbmV3IERhdGUoLTEpO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSA9ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWFsaXR5VGltZVNwZW50SW5NcyA9IC0xO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaFJhaW5Db21wdXRhdGlvblF1YWxpdGllcyhcbiAgICAgICAgdGFyZ2V0c09yZGVyZWQ6IElDb21wYXJlVGFyZ2V0W10sXG4gICAgICAgIGN1bXVsYXRpdmVIb3VyczogbnVtYmVyID0gMFxuICAgICkge1xuICAgICAgICAvLyBGb3IgTi1ob3VyIGN1bXVsYXRpdmUsIG9ubHkgZmV0Y2ggb25jZSBmb3IgdGhlIGxhc3QgdGFyZ2V0IChlbmQgb2YgcGVyaW9kKVxuICAgICAgICBjb25zdCB0YXJnZXRzVG9GZXRjaCA9XG4gICAgICAgICAgICBjdW11bGF0aXZlSG91cnMgPiAwID8gW3RhcmdldHNPcmRlcmVkW3RhcmdldHNPcmRlcmVkLmxlbmd0aCAtIDFdXSA6IHRhcmdldHNPcmRlcmVkO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHNUb0ZldGNoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVt0YXJnZXQuZGF0ZS50b0lTT1N0cmluZygpXSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYWluQ29tcHV0YXRpb25RdWFsaXR5OiBSYWluQ29tcHV0YXRpb25RdWFsaXR5O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdW11bGF0aXZlSG91cnMgPiAwICYmIHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE4taG91ciBjdW11bGF0aXZlOiBmZXRjaCBhZ2dyZWdhdGVkIHF1YWxpdHkgZm9yIHRoZSB3aG9sZSBwZXJpb2RcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkN1bXVsYXRpdmVDdW11bGF0aXZlc0NvbXBhcmVCeURhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFpbk5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bGF0aXZlSG91cnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5yYWluQ29tcHV0YXRpb25DdW11bGF0aXZlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUtbWluIGdyYW51bGFyOiBmZXRjaCBpbmRpdmlkdWFsIHF1YWxpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaW5Db21wdXRhdGlvblF1YWxpdHkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UmFpbkN1bXVsYXRpdmVDb21wYXJlQnlEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhaW5Ob2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmFpbkNvbXB1dGF0aW9uQ3VtdWxhdGl2ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmFpbkNvbXB1dGF0aW9uUXVhbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ29uc2lzdGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRyaWNlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eS5xdWFsaXR5U3BlZWRNYXRyaXhDb250YWluZXIuZ2V0TWF0cmljZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0cml4IG9mIG1hdHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRyaXguaXNDb25zaXN0ZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zaXN0ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29uc2lzdGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uZSBvZiByYWluQ29tcHV0YXRpb25RdWFsaXR5IG1hdHJpY2VzIGlzIG5vdCBjb25zaXN0ZW50IGZvciAke3RhcmdldC5kYXRlLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVt0YXJnZXQuZGF0ZS50b0lTT1N0cmluZygpXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpbkNvbXB1dGF0aW9uUXVhbGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRSYWluQ29tcHV0YXRpb25RdWFsaXR5KGRhdGU6IERhdGUpOiBSYWluQ29tcHV0YXRpb25RdWFsaXR5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFpbkNvbXB1dGF0aW9uUXVhbGl0aWVzUGVyRGF0ZVtkYXRlLnRvSVNPU3RyaW5nKCldO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RHYXVnZUluQ29tcGFyZSgpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsQ29tcGFyZVBvaW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5nbG9iYWxDb21wYXJlUG9pbnRzKSk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBnbG9iYWxDb21wYXJlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAocC5pZCA9PT0gdGhpcy5zZWxlY3RlZEdhdWdlSW5Qb2ludHM/LmdhdWdlSWQpIHtcbiAgICAgICAgICAgICAgICBwLnIgPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcC5yID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsb2JhbENvbXBhcmVQb2ludHMgPSBnbG9iYWxDb21wYXJlUG9pbnRzO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29tcGFyZSBvZiB0aGlzLnVpQ29tcGFyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVQb2ludHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbXBhcmUuY29tcGFyZVBvaW50cykpO1xuICAgICAgICAgICAgY29tcGFyZVBvaW50cy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzPy5nYXVnZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuciA9IDEwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHAuciA9IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb21wYXJlLmNvbXBhcmVQb2ludHMgPSBjb21wYXJlUG9pbnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0U2VsZWN0ZWRHYXVnZXMoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXNldFNlbGVjdGVkR2F1Z2VzIHJlc2V0Jyk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHYXVnZUluUG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEdhdWdlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGl4ZWxzID0gW107XG4gICAgICAgIHRoaXMucGl4ZWxzU29sdXRpb25zID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0R2F1Z2VJbkNvbXBhcmUoKTtcbiAgICB9XG59XG4iXX0=