@firestitch/report 18.2.2 → 18.3.1

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.
Files changed (35) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +34 -0
  2. package/app/reports/components/report-canvas/report-canvas.component.d.ts +17 -5
  3. package/app/reports/components/report-component/report-component.component.d.ts +11 -1
  4. package/app/reports/data/report.data.d.ts +12 -1
  5. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +3 -0
  6. package/app/reports/export/report-export-collector.service.d.ts +1 -0
  7. package/app/reports/export/report-pdf.service.d.ts +7 -0
  8. package/app/reports/export/report-pptx.service.d.ts +2 -0
  9. package/app/reports/interfaces/report.interface.d.ts +16 -2
  10. package/app/reports/layout.d.ts +1 -0
  11. package/app/reports/text.d.ts +29 -0
  12. package/app/reports/views/report/fs-ai-report.component.d.ts +3 -0
  13. package/app/reports/views/report/report.component.d.ts +3 -0
  14. package/app/reports/views/reports/fs-ai-reports.component.d.ts +1 -1
  15. package/esm2022/app/reports/components/component-text/component-text.component.mjs +186 -0
  16. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +128 -17
  17. package/esm2022/app/reports/components/report-component/report-component.component.mjs +71 -7
  18. package/esm2022/app/reports/data/report.data.mjs +20 -9
  19. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +17 -5
  20. package/esm2022/app/reports/export/report-export-collector.service.mjs +12 -2
  21. package/esm2022/app/reports/export/report-pdf.service.mjs +156 -4
  22. package/esm2022/app/reports/export/report-pptx.service.mjs +76 -5
  23. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  24. package/esm2022/app/reports/layout.mjs +4 -1
  25. package/esm2022/app/reports/text.mjs +221 -0
  26. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +14 -3
  27. package/esm2022/app/reports/views/report/report.component.mjs +18 -3
  28. package/esm2022/app/reports/views/reports/fs-ai-reports.component.mjs +11 -5
  29. package/fesm2022/{firestitch-report-echarts-BLtDCank.mjs → firestitch-report-echarts-Dg5PjbjT.mjs} +2 -2
  30. package/fesm2022/{firestitch-report-echarts-BLtDCank.mjs.map → firestitch-report-echarts-Dg5PjbjT.mjs.map} +1 -1
  31. package/fesm2022/{firestitch-report-firestitch-report-eTeJyMPo.mjs → firestitch-report-firestitch-report-JORFp_xa.mjs} +925 -62
  32. package/fesm2022/firestitch-report-firestitch-report-JORFp_xa.mjs.map +1 -0
  33. package/fesm2022/firestitch-report.mjs +1 -1
  34. package/package.json +1 -1
  35. package/fesm2022/firestitch-report-firestitch-report-eTeJyMPo.mjs.map +0 -1
@@ -130,6 +130,17 @@ export class FsAiReportComponent {
130
130
  toggleEditMode() {
131
131
  this.editMode = !this.editMode;
132
132
  }
133
+ // The edit tools live in this toolbar, but the canvas owns what they act on
134
+ // (the active page, the header/footer bands, which layer is live).
135
+ get isMasterMode() {
136
+ return this._canvas?.masterMode() ?? false;
137
+ }
138
+ addText() {
139
+ this._canvas?.addText();
140
+ }
141
+ toggleMasterMode() {
142
+ this._canvas?.toggleMasterMode();
143
+ }
133
144
  // Report settings — name, page size, orientation, layout mode, delete. The
134
145
  // dialog performs the delete itself; we react to what it reports back.
135
146
  reportSettings() {
@@ -396,7 +407,7 @@ export class FsAiReportComponent {
396
407
  ReportExportService,
397
408
  // Tree-shaken ECharts core + the 'report' house theme, loaded lazily.
398
409
  provideEchartsCore({ echarts: () => import('../../theme/echarts').then((module) => module.default) }),
399
- ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div class=\"fs-ai-report fs-column\">\r\n\r\n <div class=\"fs-ai-report__header fs-row.align-center\">\r\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report?.name }}</h2>\r\n\r\n @if (report) {\r\n <!-- Report-level filters, inline with the toolbar actions. fs-filter\r\n reads its config once at init, so it's keyed on the filter\r\n signature: when the report-level filter set changes the block is\r\n recreated and re-reads the rebuilt config. -->\r\n @if (reportHasFilters) {\r\n @for (key of [reportFilterKey]; track key) {\r\n <fs-filter\r\n class=\"fs-ai-report__filters\"\r\n [config]=\"reportFilterConfig\">\r\n </fs-filter>\r\n }\r\n }\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"editMode ? 'Done' : 'Edit layout'\"\r\n (click)=\"toggleEditMode()\">\r\n <mat-icon>{{ editMode ? 'lock' : 'open_with' }}</mat-icon>\r\n </button>\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Export\"\r\n [fsMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <fs-menu #exportMenu>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportPowerpoint()\">\r\n Export PowerPoint\r\n </ng-template>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportPdf()\">\r\n Export PDF\r\n </ng-template>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportData()\">\r\n Export Raw Data\r\n </ng-template>\r\n @if ((report?.pages?.length ?? 0) > 1) {\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportData(true)\">\r\n Export Raw Data (This Page)\r\n </ng-template>\r\n }\r\n </fs-menu>\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Report settings\"\r\n (click)=\"reportSettings()\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div\r\n #split\r\n class=\"fs-ai-report__split fs-row.align-start\">\r\n <fs-ai-chat\r\n #chatPanel\r\n class=\"chat\"\r\n [basePath]=\"basePath()\"\r\n [requestData]=\"chatRequestData()\"\r\n [ready]=\"chatPageId() !== null\"\r\n (response)=\"onChatResponse($event)\">\r\n </fs-ai-chat>\r\n\r\n <div\r\n class=\"resizer\"\r\n (pointerdown)=\"onResizeStart($event)\">\r\n </div>\r\n\r\n <div class=\"viewer fs-flex fs-column\">\r\n @if (report) {\r\n <app-report-canvas\r\n [report]=\"report\"\r\n [editMode]=\"editMode\"\r\n [pageId]=\"pageId\"\r\n (componentSettings)=\"componentSettings($event)\"\r\n (reportChanged)=\"onCanvasReportChanged()\"\r\n (pageChanged)=\"onCanvasPageChanged($event)\"\r\n (editDone)=\"toggleEditMode()\">\r\n </app-report-canvas>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i1.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "editDone", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
410
+ ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report?.name }}</h2>\n\n @if (report) {\n <!-- Report-level filters, inline with the toolbar actions. fs-filter\n reads its config once at init, so it's keyed on the filter\n signature: when the report-level filter set changes the block is\n recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode\"\n [matTooltip]=\"editMode ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"basePath()\"\n [requestData]=\"chatRequestData()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report) {\n <app-report-canvas\n [report]=\"report\"\n [editMode]=\"editMode\"\n [pageId]=\"pageId\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i1.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
400
411
  }
401
412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportComponent, decorators: [{
402
413
  type: Component,
@@ -418,7 +429,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
418
429
  MatIconModule,
419
430
  MatTooltipModule,
420
431
  ReportCanvasComponent,
421
- ], template: "<div class=\"fs-ai-report fs-column\">\r\n\r\n <div class=\"fs-ai-report__header fs-row.align-center\">\r\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report?.name }}</h2>\r\n\r\n @if (report) {\r\n <!-- Report-level filters, inline with the toolbar actions. fs-filter\r\n reads its config once at init, so it's keyed on the filter\r\n signature: when the report-level filter set changes the block is\r\n recreated and re-reads the rebuilt config. -->\r\n @if (reportHasFilters) {\r\n @for (key of [reportFilterKey]; track key) {\r\n <fs-filter\r\n class=\"fs-ai-report__filters\"\r\n [config]=\"reportFilterConfig\">\r\n </fs-filter>\r\n }\r\n }\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [matTooltip]=\"editMode ? 'Done' : 'Edit layout'\"\r\n (click)=\"toggleEditMode()\">\r\n <mat-icon>{{ editMode ? 'lock' : 'open_with' }}</mat-icon>\r\n </button>\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Export\"\r\n [fsMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <fs-menu #exportMenu>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportPowerpoint()\">\r\n Export PowerPoint\r\n </ng-template>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportPdf()\">\r\n Export PDF\r\n </ng-template>\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportData()\">\r\n Export Raw Data\r\n </ng-template>\r\n @if ((report?.pages?.length ?? 0) > 1) {\r\n <ng-template\r\n fs-menu-item\r\n (click)=\"exportData(true)\">\r\n Export Raw Data (This Page)\r\n </ng-template>\r\n }\r\n </fs-menu>\r\n\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Report settings\"\r\n (click)=\"reportSettings()\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div\r\n #split\r\n class=\"fs-ai-report__split fs-row.align-start\">\r\n <fs-ai-chat\r\n #chatPanel\r\n class=\"chat\"\r\n [basePath]=\"basePath()\"\r\n [requestData]=\"chatRequestData()\"\r\n [ready]=\"chatPageId() !== null\"\r\n (response)=\"onChatResponse($event)\">\r\n </fs-ai-chat>\r\n\r\n <div\r\n class=\"resizer\"\r\n (pointerdown)=\"onResizeStart($event)\">\r\n </div>\r\n\r\n <div class=\"viewer fs-flex fs-column\">\r\n @if (report) {\r\n <app-report-canvas\r\n [report]=\"report\"\r\n [editMode]=\"editMode\"\r\n [pageId]=\"pageId\"\r\n (componentSettings)=\"componentSettings($event)\"\r\n (reportChanged)=\"onCanvasReportChanged()\"\r\n (pageChanged)=\"onCanvasPageChanged($event)\"\r\n (editDone)=\"toggleEditMode()\">\r\n </app-report-canvas>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"] }]
432
+ ], template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report?.name }}</h2>\n\n @if (report) {\n <!-- Report-level filters, inline with the toolbar actions. fs-filter\n reads its config once at init, so it's keyed on the filter\n signature: when the report-level filter set changes the block is\n recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode\"\n [matTooltip]=\"editMode ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"basePath()\"\n [requestData]=\"chatRequestData()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report) {\n <app-report-canvas\n [report]=\"report\"\n [editMode]=\"editMode\"\n [pageId]=\"pageId\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"] }]
422
433
  }], ctorParameters: () => [], propDecorators: { _split: [{
423
434
  type: ViewChild,
424
435
  args: ['split', { static: true }]
@@ -429,4 +440,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
429
440
  type: ViewChild,
430
441
  args: [ReportCanvasComponent]
431
442
  }] } });
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQzdFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FDM0YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQWdCLGNBQWMsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVB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QkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7cUJBQ3RHLFdBQ1E7d0JBQ1AsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIscUJBQXFCO3FCQUN0Qjt3REFzRU8sTUFBTTtzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTVCLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU1sRCxPQUFPO3NCQURkLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCxcclxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuXHJcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIElGaWx0ZXJDb25maWdJdGVtIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcclxuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XHJcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xyXG5cclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xyXG5cclxuaW1wb3J0IHsgRnNBaUNoYXRDb21wb25lbnQsIEZzQWlDaGF0UmVzcG9uc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9haSc7XHJcblxyXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBvcnRQZGZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wZGYuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENoYXJ0R3JhbnVsYXJpdHksIFJlcG9ydCwgUmVwb3J0Q2hhdFJlc3BvbnNlLFxyXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXHJcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBHUk9VUF9CWV9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwQnlGaWx0ZXJJdGVtLCBncm91cEJ5U2lnbmF0dXJlLCBncm91cFZhbHVlc0Zyb21RdWVyeSxcclxuICBpc0dyYW51bGFyaXR5T2ZmZXJlZCxcclxufSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcclxuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLCBkZWZhdWx0U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcclxuXHJcblxyXG4vLyBBIHNpbmdsZSByZXBvcnQ6IHRoZSBBSSBjaGF0IG9uIHRoZSBsZWZ0LCB0aGUgcmVwb3J0IGNhbnZhcyBvbiB0aGUgcmlnaHQsXHJcbi8vIHVuZGVyIGFuIEgyIHRpdGxlICsgc2V0dGluZ3MgZ2Vhci4gVGhlIGhvc3Qgc3VwcGxpZXMgW3JlcG9ydElkXSAoZnJvbSBpdHNcclxuLy8gcm91dGUpIGFuZCBzd2l0Y2hlcyByZXBvcnRzIGJ5IG5hdmlnYXRpbmcg4oCUIHRoaXMgY29tcG9uZW50IG5ldmVyIHBpY2tzIG9uZS5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgLy8gU2Vzc2lvbiBmaWx0ZXIgc3RhdGUgaXMgcGVyLW9wZW4tcmVwb3J0LCBub3QgYXBwLWdsb2JhbDsgdGhlIGV4cG9ydFxyXG4gICAgLy8gc2VydmljZXMgcmVzb2x2ZSBmaWx0ZXJzIHRocm91Z2ggaXQsIHNvIHRoZXkgbGl2ZSBhdCB0aGUgc2FtZSBsZXZlbC5cclxuICAgIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSxcclxuICAgIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UsXHJcbiAgICBSZXBvcnRQcHR4U2VydmljZSxcclxuICAgIFJlcG9ydFBkZlNlcnZpY2UsXHJcbiAgICBSZXBvcnRFeHBvcnRTZXJ2aWNlLFxyXG4gICAgLy8gVHJlZS1zaGFrZW4gRUNoYXJ0cyBjb3JlICsgdGhlICdyZXBvcnQnIGhvdXNlIHRoZW1lLCBsb2FkZWQgbGF6aWx5LlxyXG4gICAgcHJvdmlkZUVjaGFydHNDb3JlKHsgZWNoYXJ0czogKCkgPT4gaW1wb3J0KCcuLi8uLi90aGVtZS9lY2hhcnRzJykudGhlbigobW9kdWxlKSA9PiBtb2R1bGUuZGVmYXVsdCkgfSksXHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGc0ZpbHRlck1vZHVsZSxcclxuICAgIEZzTWVudU1vZHVsZSxcclxuICAgIEZzQWlDaGF0Q29tcG9uZW50LFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBSZXBvcnRDYW52YXNDb21wb25lbnQsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZzQWlSZXBvcnRDb21wb25lbnQge1xyXG5cclxuICAvLyBUaGUgcmVwb3J0IHRoaXMgdmlldyBpcyBmb2N1c2VkIG9uIOKAlCBzdXBwbGllZCBieSB0aGUgaG9zdCBmcm9tIHRoZSByb3V0ZS5cclxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dDxudW1iZXIgfCBudWxsPihudWxsKTtcclxuXHJcbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzICsgY2hhdCBlbmRwb2ludHM7IG92ZXJyaWRlIHRvIG1vdW50IGVsc2V3aGVyZS5cclxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZVBhdGggPSBpbnB1dDxzdHJpbmc+KCdyZXBvcnRzJyk7XHJcblxyXG4gIC8vIFRoZSBxdWVyeSBwYXJhbSB0aGF0IGNhcnJpZXMgdGhlIG9wZW4gcGFnZSdzIGlkLiBEZWVwIGxpbmtpbmcgaXMgb24gYnlcclxuICAvLyBkZWZhdWx0OyBhIGhvc3QgdGhhdCBtb3VudHMgc2V2ZXJhbCByZXBvcnRzIG9uIG9uZSByb3V0ZSwgb3Igd2FudHMgbm8gVVJMXHJcbiAgLy8gd3JpdGVzIGF0IGFsbCwgc2V0cyB0aGlzIHRvIG51bGwgdG8gdHVybiBpdCBvZmYuXHJcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcclxuXHJcbiAgLy8gVGhlIHJlcG9ydCB3YXMgZGVsZXRlZCBmcm9tIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBob3N0IHJvdXRlcyBiYWNrIHRvXHJcbiAgLy8gdGhlIGxpc3RpbmcuXHJcbiAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZWQgPSBvdXRwdXQ8bnVtYmVyPigpO1xyXG5cclxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxyXG4gIC8vIGJyZWFkY3J1bWIgLyBkb2N1bWVudCB0aXRsZS5cclxuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lZCA9IG91dHB1dDxSZXBvcnQ+KCk7XHJcblxyXG4gIC8vIFRoZSB2aWV3ZXIgbW92ZWQgdG8gYW5vdGhlciBwYWdlLiBUaGUgVVJMIGlzIGFscmVhZHkgdXBkYXRlZCBieSB0aGVuIOKAlFxyXG4gIC8vIHRoaXMgaXMgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3IgdGhlaXIgb3duIHJlYXNvbnMuXHJcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VDaGFuZ2VkID0gb3V0cHV0PG51bWJlciB8IG51bGw+KCk7XHJcblxyXG4gIHB1YmxpYyByZXBvcnQ6IFJlcG9ydCB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xyXG5cclxuICAvLyBUaGUgcGFnZSB0aGUgY2FudmFzIHNob3VsZCBvcGVuIG9uLCByZWFkIGZyb20gdGhlIFVSTCBvbmNlIHBlciByZXBvcnQuXHJcbiAgLy8gQ2xlYXJlZCBhcyBzb29uIGFzIHRoZSBjYW52YXMgcmVwb3J0cyBiYWNrLCBzbyBhIGxhdGVyIGluLWFwcCBwYWdlIGNoYW5nZVxyXG4gIC8vIGlzIG5ldmVyIGZvdWdodCBieSBhIHN0YWxlIHZhbHVlLlxyXG4gIHB1YmxpYyBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBUaGUgcGFnZSB0aGUgY2hhdCBpcyBib3VuZCB0bzogdGhlIG9uZSBvbiBzY3JlZW4uIEEgcmVwb3J0IGNvbnZlcnNhdGlvblxyXG4gIC8vIGJlbG9uZ3MgdG8gZXhhY3RseSBvbmUgcGFnZSwgc28gdGhpcyBib3RoIHNjb3BlcyB0aGUgY29udmVyc2F0aW9uIGxpc3QgYW5kXHJcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcclxuICAvLyBbcmVxdWVzdERhdGFdIOKAlCBjaGFuZ2luZyBpdCBpcyB3aGF0IHJlbG9hZHMgdGhlIHBhbmVsIG9udG8gdGhlIG5ldyBwYWdlJ3NcclxuICAvLyBjb252ZXJzYXRpb25zLiBOdWxsIHVudGlsIHRoZSBjYW52YXMgcmVwb3J0cyB3aGljaCBwYWdlIGl0IG9wZW5lZCBvbiwgd2hpY2hcclxuICAvLyBrZWVwcyB0aGUgY2hhdCBmcm9tIGxpc3RpbmcgYWdhaW5zdCBhIHBhZ2UgZ3Vlc3MuXHJcbiAgcHVibGljIHJlYWRvbmx5IGNoYXRQYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIFdoYXQgdGhlIGNoYXQgc2VuZHMgd2l0aCBldmVyeSBjb252ZXJzYXRpb24gY2FsbDogdGhlIHJlcG9ydCwgYW5kIHRoZSBwYWdlXHJcbiAgLy8gaXQgaXMgYm91bmQgdG8uXHJcbiAgLy9cclxuICAvLyByZXBvcnRQYWdlSWQgaXMgT01JVFRFRCwgbm90IHNlbnQgYXMgbnVsbCwgd2hpbGUgdGhlIG9wZW4gcGFnZSBpcyB1bmtub3duLlxyXG4gIC8vIFRoZSBiYWNrZW5kIHJlYWRzIGEgUFJFU0VOVCByZXBvcnRQYWdlSWQgb2YgMC9udWxsIGFzIFwidGhlIHJlcG9ydCdzIGVhcmxpZXIsXHJcbiAgLy8gcGFnZS1sZXNzIGNvbnZlcnNhdGlvbnNcIiwgc28gc2VuZGluZyBudWxsIGJlZm9yZSB0aGUgY2FudmFzIGhhcyByZXBvcnRlZCBpblxyXG4gIC8vIHdvdWxkIGFzayBmb3IgdGhlIHdyb25nIGxpc3Qg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGJpbmQgYSBjb252ZXJzYXRpb24gc3RhcnRlZFxyXG4gIC8vIGluIHRoYXQgd2luZG93IHRvIG5vIHBhZ2UgYXQgYWxsLlxyXG4gIC8vXHJcbiAgLy8gVGhlIGNoYXQgaXMgYWxzbyBoZWxkIGNsb3NlZCAoW3JlYWR5XSBpbiB0aGUgdGVtcGxhdGUpIHVudGlsIHRoZSBwYWdlIGlzXHJcbiAgLy8ga25vd24sIHNvIHRoaXMgcGFydGlhbCBjb250ZXh0IGlzIG5ldmVyIGFjdHVhbGx5IHNlbnQ6IG9uIGEgZnJlc2ggbG9hZCB0aGVcclxuICAvLyByZXBvcnQgaGFzIHRvIGFycml2ZSBhbmQgdGhlIGNhbnZhcyBoYXMgdG8gcmVuZGVyIGJlZm9yZSBhbnkgcGFnZSBleGlzdHMsXHJcbiAgLy8gYW5kIGEgbGlzdCBmZXRjaGVkIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIHRoZSB3aG9sZSByZXBvcnQncyBjb252ZXJzYXRpb25zXHJcbiAgLy8g4oCUIHRoZSB1bnNjb3BlZCBsaXN0LCBzaG93biBhbmQgYXV0by1zZWxlY3RlZCBiZWZvcmUgdGhlIHJlYWwgb25lIGxhbmRzLlxyXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UmVxdWVzdERhdGEgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKCkgPT4ge1xyXG4gICAgY29uc3QgcmVwb3J0UGFnZUlkID0gdGhpcy5jaGF0UGFnZUlkKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlcG9ydFBhZ2VJZCA9PT0gbnVsbFxyXG4gICAgICA/IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSB9XHJcbiAgICAgIDogeyByZXBvcnRJZDogdGhpcy5yZXBvcnRJZCgpLCByZXBvcnRQYWdlSWQgfTtcclxuICB9KTtcclxuXHJcbiAgLy8gVGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgdG9vbGJhciAoZnMtZmlsdGVyKS4gUmVidWlsdCB3aGVuZXZlciB0aGUgbG9hZGVkXHJcbiAgLy8gcmVwb3J0IChhbmQgdGh1cyBpdHMgZ3JvdXBzKSBjaGFuZ2VzLlxyXG4gIHB1YmxpYyByZXBvcnRGaWx0ZXJDb25maWchOiBGaWx0ZXJDb25maWc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NwbGl0JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIF9zcGxpdCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICBAVmlld0NoaWxkKCdjaGF0UGFuZWwnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxyXG4gIHByaXZhdGUgX2NoYXRQYW5lbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICAvLyBPbmx5IHRoZSBjYW52YXMga25vd3Mgd2hpY2ggcGFnZSBpcyBvbiBzY3JlZW4sIGFuZCBhIHBhZ2Utc2NvcGVkIGV4cG9ydFxyXG4gIC8vIGhhcyB0byBhc2sgaXQuXHJcbiAgQFZpZXdDaGlsZChSZXBvcnRDYW52YXNDb21wb25lbnQpXHJcbiAgcHJpdmF0ZSBfY2FudmFzPzogUmVwb3J0Q2FudmFzQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xyXG4gIHByaXZhdGUgX3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcclxuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgX2V4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XHJcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xyXG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XHJcbiAgICAvLyBsb2FkIGJlbG93IHJlYWRzIGl0KS5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XHJcbiAgICAgIHRoaXMuZWRpdE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIEEgbmV3IHJlcG9ydCdzIHBhZ2VzIGFyZSBub3QgdGhpcyByZXBvcnQncyBwYWdlcyDigJQgZHJvcCB0aGUgYmluZGluZ1xyXG4gICAgICAvLyB1bnRpbCBpdHMgY2FudmFzIHNheXMgd2hpY2ggcGFnZSBpdCBsYW5kZWQgb24uXHJcbiAgICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQobnVsbCk7XHJcblxyXG4gICAgICAvLyBTZWVkIHRoZSBvcGVuIHBhZ2UgZnJvbSB0aGUgVVJMIGZvciB0aGlzIHJlcG9ydC4gUmVhZCBwZXIgbG9hZCByYXRoZXJcclxuICAgICAgLy8gdGhhbiBvbmNlIGF0IGNvbnN0cnVjdGlvbjogdGhlIGhvc3QgbWF5IHN3YXAgcmVwb3J0cyBvbiB0aGUgc2FtZSByb3V0ZSxcclxuICAgICAgLy8gYW5kIGVhY2ggYXJyaXZhbCBjYXJyaWVzIGl0cyBvd24gP3BhZ2U9LlxyXG4gICAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuX3BhZ2VJZEZyb21VcmwoKTtcclxuXHJcbiAgICAgIGlmIChyZXBvcnRJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XHJcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRNb2RlID0gIXRoaXMuZWRpdE1vZGU7XHJcbiAgfVxyXG5cclxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZSwgb3JpZW50YXRpb24sIGxheW91dCBtb2RlLCBkZWxldGUuIFRoZVxyXG4gIC8vIGRpYWxvZyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZjsgd2UgcmVhY3QgdG8gd2hhdCBpdCByZXBvcnRzIGJhY2suXHJcbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydC5pZDtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2cub3BlbjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgdW5rbm93biwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+KFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHsgcmVwb3J0OiB0aGlzLnJlcG9ydCB9LFxyXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcclxuICAgIH0pXHJcbiAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnZGVsZXRlZCcpIHtcclxuICAgICAgICAgIHRoaXMuZGVsZXRlZC5lbWl0KHJlcG9ydElkKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdzYXZlZCcpIHtcclxuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBDb21wb25lbnQgc2V0dGluZ3Mg4oCUIHRpdGxlLCBleGFjdCBnZW9tZXRyeSwgYW5kIHRoZSBkaWFnbm9zdGljIHZpZXdzXHJcbiAgLy8gKFNRTCwgY29uZmlnLCBmaWx0ZXIgd2lyaW5nKS5cclxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnRNb2RlbCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydC5pZDtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3BlbjxDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgdW5rbm93biwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxyXG4gICAgICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCxcclxuICAgICAge1xyXG4gICAgICAgIGRhdGE6IHsgcmVwb3J0OiB0aGlzLnJlcG9ydCwgY29tcG9uZW50IH0sXHJcbiAgICAgICAgd2lkdGg6ICc2NDBweCcsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEZpbHRlciBhZGQvcmVtb3ZlL2xldmVsIGNoYW5nZXMgcGVyc2lzdCBpbW1lZGlhdGVseSBpbnNpZGUgdGhlIGRpYWxvZyAobm9cclxuICAgIC8vIFwic2F2ZVwiKSBhbmQgY2FuIGxlYXZlIGl0IGJ5IGFuIGV4aXQgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCwgc28gdGhleSBhcmVcclxuICAgIC8vIGFubm91bmNlZCBhcyB0aGV5IGxhbmQuIFRoZSByZWxvYWQgd2FpdHMgZm9yIHRoZSBjbG9zZSBzbyB0aGUgY2FudmFzIGlzbid0XHJcbiAgICAvLyByZS1yZW5kZXJpbmcgdW5kZXJuZWF0aCBhbiBvcGVuIGRpYWxvZy5cclxuICAgIGxldCBmaWx0ZXJzQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmZpbHRlcnNDaGFuZ2VkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZmlsdGVyc0NoYW5nZWQgPSB0cnVlKTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIC8vIFRoZSBkaWFsb2cgY29uZmlybXMgKyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZi4gVGhlIGNvbXBvbmVudCBpc1xyXG4gICAgICAgIC8vIGdvbmUgZnJvbSB0aGUgcmVwb3J0LCBzbyByZWxvYWQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgaXQgb3V0IGxvY2FsbHkg4oCUXHJcbiAgICAgICAgLy8gaXRzIGZpbHRlcnMgd2VudCB3aXRoIGl0LCB3aGljaCB0aGUgcmVwb3J0IGJhciBoYXMgdG8gYmUgcmVidWlsdCBmb3IuXHJcbiAgICAgICAgaWYgKHJlc3VsdD8uZGVsZXRlZCkge1xyXG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhlIHJlcG9ydCdzIGZpbHRlciBncm91cHMgY2hhbmdlZCwgc28gdGhlIHJlcG9ydCBiYXIgYW5kIHRoZVxyXG4gICAgICAgIC8vIG9uLWNvbXBvbmVudCBzdHJpcHMgaGF2ZSB0byBiZSByZWJ1aWx0IGZyb20gYSBmcmVzaCByZXBvcnQuXHJcbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGRpYWxvZyB0b3VjaGVzIHRoZSBxdWVyeSDigJQgdGl0bGUgYW5kIHBhZGRpbmcgYXJlXHJcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLiBSZXBhaW50IHRoZSBvbmUgY29tcG9uZW50IGl0IHdhcyBvcGVuZWQgZm9yIGFuZCBsZWF2ZVxyXG4gICAgICAgIC8vIGV2ZXJ5IG90aGVyIGNvbXBvbmVudCdzIGRhdGEsIGFuZCBpdHMgcXVlcnksIGFsb25lLlxyXG4gICAgICAgIGlmIChyZXN1bHQ/LnNldHRpbmdzKSB7XHJcbiAgICAgICAgICB0aGlzLl9jYW52YXM/LmFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50LmlkLCByZXN1bHQuc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZTogcmVmbGVjdCBpdCBpbiB0aGUgVVJMIHNvIGEgcmVmcmVzaCBvciBhXHJcbiAgLy8gc2hhcmVkIGxpbmsgY29tZXMgYmFjayBoZXJlLiByZXBsYWNlVXJsIGtlZXBzIHBhZ2luZyBvdXQgb2YgdGhlIGJyb3dzZXJcclxuICAvLyBoaXN0b3J5IOKAlCBCYWNrIHNob3VsZCBsZWF2ZSB0aGUgcmVwb3J0LCBub3Qgd2FsayBldmVyeSBwYWdlIHZpc2l0ZWQuXHJcbiAgcHVibGljIG9uQ2FudmFzUGFnZUNoYW5nZWQocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyBUaGUgZGVlcCBsaW5rIGhhcyBiZWVuIGNvbnN1bWVkOyBmcm9tIGhlcmUgdGhlIGNhbnZhcyBvd25zIHRoZSBwYWdlLlxyXG4gICAgdGhpcy5wYWdlSWQgPSBudWxsO1xyXG4gICAgdGhpcy5jaGF0UGFnZUlkLnNldChwYWdlSWQpO1xyXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2VJZCk7XHJcblxyXG4gICAgY29uc3QgcGFyYW0gPSB0aGlzLnBhZ2VRdWVyeVBhcmFtKCk7XHJcbiAgICBpZiAoIXBhcmFtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IFtwYXJhbV06IHBhZ2VJZCB9LFxyXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxyXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBUaGUgY2FudmFzIGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSAoYWRkZWQgYSBwYWdlKSDigJQgcmUtZmV0Y2ggc28gdGhlXHJcbiAgLy8gbmV3IHBhZ2UgcmVuZGVyczsgdGhlIGNhbnZhcyBsYW5kcyB0aGUgdmlldyBvbiBpdC5cclxuICBwdWJsaWMgb25DYW52YXNSZXBvcnRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0KSB7XHJcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQodGhpcy5yZXBvcnQuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG5hdGl2ZSBlZGl0YWJsZVxyXG4gIC8vIGNoYXJ0czsgcGFnZSA9IHNsaWRlKS4gVGhlIGRvY2sgc2hvd3MgcHJvZ3Jlc3MgdW50aWwgdGhlIGZpbGUgc2F2ZXMuXHJcbiAgcHVibGljIGV4cG9ydFBvd2VycG9pbnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucmVwb3J0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcclxuICAgICAgJ0V4cG9ydGluZyBQb3dlclBvaW50JyxcclxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHRoaXMucmVwb3J0KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBFeHBvcnQgdG8gUERGLCBlbnRpcmVseSBjbGllbnQtc2lkZSAob2Zmc2NyZWVuIEVDaGFydHMgYXQgM8OXOyBwYWdlID0gUERGIHBhZ2UpLlxyXG4gIHB1YmxpYyBleHBvcnRQZGYoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucmVwb3J0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcclxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxyXG4gICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLnBkZih0aGlzLnJlcG9ydCksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIHJhdyBkYXRhIGJlaGluZCB0aGUgd2hvbGUgcmVwb3J0IGluIG9uZSBhY3Rpb246IHRoZSBzZXJ2ZXIgZXhwb3J0cyBldmVyeVxyXG4gIC8vIGNvbXBvbmVudCdzIGZ1bGwgZmlsdGVyZWQgZGF0YXNldCBhbmQgemlwcyBvbmUgQ1NWIHBlciBjb21wb25lbnQsIGZvbGRlcmVkXHJcbiAgLy8gYnkgcGFnZS4gYHRoaXNQYWdlYCBuYXJyb3dzIGl0IHRvIHRoZSBwYWdlIHRoZSBjYW52YXMgaXMgc2hvd2luZy4gVW5saWtlIHRoZVxyXG4gIC8vIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdGhpcyBpcyBlbnRpcmVseSBzZXJ2ZXItc2lkZSDigJQgbm90aGluZyBpcyBjb2xsZWN0ZWRcclxuICAvLyBpbiB0aGUgYnJvd3Nlciwgc28gaXQgaXMgbm90IGNhcHBlZCBieSB3aGF0IGEgc2xpZGUgY2FuIGhvbGQuXHJcbiAgcHVibGljIGV4cG9ydERhdGEodGhpc1BhZ2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQ7XHJcbiAgICBpZiAoIXJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFnZUlkID0gdGhpc1BhZ2UgPyB0aGlzLl9jYW52YXM/LmFjdGl2ZVBhZ2U/LmlkID8/IG51bGwgOiBudWxsO1xyXG5cclxuICAgIHRoaXMuX3Byb2Nlc3MuZG93bmxvYWQoXHJcbiAgICAgICdFeHBvcnRpbmcgZGF0YScsXHJcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuZXhwb3J0UmVwb3J0KHJlcG9ydC5pZCwgdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvclJlcG9ydChyZXBvcnQsIHBhZ2VJZCksIHBhZ2VJZCksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVhY3QgdG8gZWFjaCBjaGF0IHR1cm4gKGZzLWNoYXQgaGFuZGxlcyB0aGUgcmVxdWVzdCArIHBlcnNpc3RlbmNlKTsgd2VcclxuICAvLyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlcG9ydCBzaWRlIGVmZmVjdHMgdGhpcyBjb250ZXh0J3MgYmFja2VuZCBmbGFncy5cclxuICBwdWJsaWMgb25DaGF0UmVzcG9uc2UocmVzcG9uc2U6IEZzQWlDaGF0UmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnRJZCgpO1xyXG4gICAgaWYgKHJlcG9ydElkID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcG9ydFJlc3BvbnNlID0gcmVzcG9uc2UgYXMgRnNBaUNoYXRSZXNwb25zZSAmIFJlcG9ydENoYXRSZXNwb25zZTtcclxuXHJcbiAgICAvLyBBIHN0cnVjdHVyYWwgY2hhbmdlIG9yIGEgcmVuYW1lIGJvdGggcmUtZmV0Y2ggdGhlIHJlcG9ydCAoc2Vzc2lvbiBmaWx0ZXJcclxuICAgIC8vIHZhbHVlcyBzdXJ2aXZlKTsgYSByZW5hbWUgYWRkaXRpb25hbGx5IG5vdGlmaWVzIHRoZSBob3N0IHNvIGl0IGNhblxyXG4gICAgLy8gcmVmcmVzaCBhIGJyZWFkY3J1bWIgLyB0aXRsZS5cclxuICAgIGlmIChyZXBvcnRSZXNwb25zZS5yZXBvcnRDaGFuZ2VkIHx8IHJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpIHtcclxuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgISFyZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIERyYWcgdGhlIGRpdmlkZXIgYmV0d2VlbiB0aGUgY2hhdCBhbmQgY2FudmFzIHBhbmVzIChwb2ludGVyLWNhcHR1cmUgbG9vcFxyXG4gIC8vIG91dHNpZGUgQW5ndWxhcikuXHJcbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcclxuICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcclxuXHJcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgY29uc3QgbW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHRoaXMuX3Jlc2l6ZVRvKGUuY2xpZW50WCk7XHJcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcclxuICAgICAgICBoYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XHJcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XHJcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xyXG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcclxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNpemVUbyhjbGllbnRYOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYgKHJlY3Qud2lkdGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhdGlvID0gKGNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDtcclxuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcclxuICAgIHRoaXMuX2NoYXRQYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZsZXhCYXNpcyA9IGAke2NsYW1wZWQgKiAxMDB9JWA7XHJcbiAgfVxyXG5cclxuICAvLyBUaGUgcGFnZSBpZCBzaXR0aW5nIGluIHRoZSBVUkwgcmlnaHQgbm93LCBvciBudWxsIHdoZW4gZGVlcCBsaW5raW5nIGlzIG9mZlxyXG4gIC8vIG9yIHRoZSB2YWx1ZSBpcyBub3QgYSB1c2FibGUgaWQuXHJcbiAgcHJpdmF0ZSBfcGFnZUlkRnJvbVVybCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xyXG4gICAgaWYgKCFwYXJhbSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYWdlSWQgPSBOdW1iZXIodGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQocGFyYW0pKTtcclxuXHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhZ2VJZCkgJiYgcGFnZUlkID4gMCA/IHBhZ2VJZCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIGVtaXRSZW5hbWVkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9ydERhdGEuZ2V0KHJlcG9ydElkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpO1xyXG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XHJcblxyXG4gICAgICAgIGlmIChlbWl0UmVuYW1lZCkge1xyXG4gICAgICAgICAgdGhpcy5yZW5hbWVkLmVtaXQocmVwb3J0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxyXG4gIC8vIHRoZSB0b29sYmFyIChjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBvbiB0aGVpciBjb21wb25lbnRzKS5cclxuICBwcml2YXRlIF9yZXBvcnRHcm91cHMoKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pXHJcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5sZXZlbCA9PT0gJ3JlcG9ydCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJylcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuICB9XHJcblxyXG4gIC8vIEdhdGVzIHRoZSB0b29sYmFyIGZzLWZpbHRlciBzbyBpdCBpc24ndCByZW5kZXJlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cclxuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxyXG4gIHB1YmxpYyBnZXQgcmVwb3J0SGFzRmlsdGVycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXBvcnRHcm91cHMoKS5sZW5ndGggPiAwIHx8ICEhdGhpcy5fZ3JvdXBCeUl0ZW0oKTtcclxuICB9XHJcblxyXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxyXG4gIC8vIHRvb2xiYXIgZnMtZmlsdGVyIG9uIHRoaXMgc2lnbmF0dXJlIHNvIGl0J3MgcmVjcmVhdGVkIChhbmQgcmUtcmVhZHMgdGhlXHJcbiAgLy8gcmVidWlsdCBjb25maWcpIHdoZW5ldmVyIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzLlxyXG4gIHB1YmxpYyBnZXQgcmVwb3J0RmlsdGVyS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAvLyBUaGUgc3RvcmVkIGRlZmF1bHQgaXMgcGFydCBvZiB0aGUgc2lnbmF0dXJlOiBzYXZpbmcgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnRcclxuICAgICAgLy8gc2V0dGluZ3MgcmVidWlsZHMgdGhlIGNvbmZpZywgYnV0IHdpdGhvdXQgYSBrZXkgY2hhbmdlIGZzLWZpbHRlciBrZWVwc1xyXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cclxuICAgICAgZ3JvdXBCeVNpZ25hdHVyZSh0aGlzLnJlcG9ydCksXHJcbiAgICAgIC4uLnRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfToke2dyb3VwLmxhYmVsfToke2RlZmF1bHRTaWduYXR1cmUoZ3JvdXApfWApLFxyXG4gICAgXS5qb2luKCd8Jyk7XHJcbiAgfVxyXG5cclxuICAvLyAoUmUpYnVpbGQgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIGNvbmZpZyDigJQgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaXRlbXMgYW5kXHJcbiAgLy8gdGhlbiB0aGUgZ3JvdXAtYnkgY29udHJvbC5cclxuICBwcml2YXRlIF9idWlsZFJlcG9ydENvbmZpZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnQ/LmlkID8/IG51bGw7XHJcblxyXG4gICAgLy8gRHJvcCBhIGdyYWluIHRoZSBjb250cm9sIG5vIGxvbmdlciBvZmZlcnMg4oCUIHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0XHJcbiAgICAvLyBtaWQtc2Vzc2lvbiwgYW5kIGFuIG92ZXJyaWRlIHRoZSB2aWV3ZXIgY2FuJ3Qgc2VlIGlzIHdvcnNlIHRoYW4gbm9uZS5cclxuICAgIGlmICh0aGlzLnJlcG9ydCAmJiAhaXNHcmFudWxhcml0eU9mZmVyZWQodGhpcy5yZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKSkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3kobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXRlbXMgPSByZXBvcnRJZFxyXG4gICAgICA/IHRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+XHJcbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpKSlcclxuICAgICAgOiBbXTtcclxuXHJcbiAgICAvLyBUaGUgZ3JvdXAtYnkgY29udHJvbCBsZWFkcyB0aGUgYmFyLCBhaGVhZCBvZiBldmVyeSBmaWx0ZXI6IGl0IHNldHMgdGhlXHJcbiAgICAvLyBncmFpbiB0aGUgd2hvbGUgcmVwb3J0IGlzIHJlYWQgYXQsIHNvIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBhIHZpZXdlclxyXG4gICAgLy8gZGVjaWRlcy4gSXQgaXMgbm90IGEgZmlsdGVyIGdyb3VwIOKAlCBpdCByZS1idWNrZXRzIHJvd3MgcmF0aGVyIHRoYW5cclxuICAgIC8vIG5hcnJvd2luZyB0aGVtIOKAlCBzbyBpdCBpcyBwbGFjZWQgaGVyZSByYXRoZXIgdGhhbiBvcmRlcmVkIGFtb25nIHRoZW0uXHJcbiAgICBjb25zdCBncm91cEJ5SXRlbSA9IHRoaXMuX2dyb3VwQnlJdGVtKCk7XHJcbiAgICBpZiAoZ3JvdXBCeUl0ZW0pIHtcclxuICAgICAgaXRlbXMudW5zaGlmdChncm91cEJ5SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXBvcnRGaWx0ZXJDb25maWcgPSB7XHJcbiAgICAgIC8vIE5ldmVyIHRvdWNoIHRoZSBVUkwgb3IgcGVyc2lzdCBmaWx0ZXIgc3RhdGUg4oCUIHJlcG9ydCBmaWx0ZXJzIGFyZVxyXG4gICAgICAvLyBzZXNzaW9uLW9ubHksIG93bmVkIGJ5IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5cclxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXHJcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxyXG4gICAgICBpdGVtcyxcclxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IHsgZ3JvdXBJZCwgdmFsdWUgfSBvZiBncm91cFZhbHVlc0Zyb21RdWVyeShxdWVyeSA/PyB7fSwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpKSB7XHJcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE5vdCBhIGZpbHRlciBncm91cCDigJQgdGhlIGdyYWluIGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBxdWVyeS5cclxuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3koKHF1ZXJ5Py5bR1JPVVBfQllfSVRFTV0gYXMgQ2hhcnRHcmFudWxhcml0eSkgfHwgbnVsbCk7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wgYXMgYW4gZnMtZmlsdGVyIGl0ZW0sIG9yIG51bGwgd2hlbiB0aGUgcmVwb3J0XHJcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcclxuICAvLyBwaWNrZWQgc3Vydml2ZXMgdGhlIHJlcG9ydCBiZWluZyByZS1mZXRjaGVkIGFmdGVyIGEgY2hhdCBlZGl0LlxyXG4gIHByaXZhdGUgX2dyb3VwQnlJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRcclxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbSh0aGlzLnJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydCBmcy1jb2x1bW5cIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydF9faGVhZGVyIGZzLXJvdy5hbGlnbi1jZW50ZXJcIj5cclxuICAgIDxoMiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdGl0bGUgZnMtZmxleFwiPnt7IHJlcG9ydD8ubmFtZSB9fTwvaDI+XHJcblxyXG4gICAgQGlmIChyZXBvcnQpIHtcclxuICAgICAgPCEtLSBSZXBvcnQtbGV2ZWwgZmlsdGVycywgaW5saW5lIHdpdGggdGhlIHRvb2xiYXIgYWN0aW9ucy4gZnMtZmlsdGVyXHJcbiAgICAgICAgICAgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIHNvIGl0J3Mga2V5ZWQgb24gdGhlIGZpbHRlclxyXG4gICAgICAgICAgIHNpZ25hdHVyZTogd2hlbiB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcyB0aGUgYmxvY2sgaXNcclxuICAgICAgICAgICByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XHJcbiAgICAgIEBpZiAocmVwb3J0SGFzRmlsdGVycykge1xyXG4gICAgICAgIEBmb3IgKGtleSBvZiBbcmVwb3J0RmlsdGVyS2V5XTsgdHJhY2sga2V5KSB7XHJcbiAgICAgICAgICA8ZnMtZmlsdGVyXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2ZpbHRlcnNcIlxyXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnXCI+XHJcbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJlZGl0TW9kZSA/ICdEb25lJyA6ICdFZGl0IGxheW91dCdcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+e3sgZWRpdE1vZGUgPyAnbG9jaycgOiAnb3Blbl93aXRoJyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJFeHBvcnRcIlxyXG4gICAgICAgICAgW2ZzTWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZnMtbWVudSAjZXhwb3J0TWVudT5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQb3dlcnBvaW50KClcIj5cclxuICAgICAgICAgIEV4cG9ydCBQb3dlclBvaW50XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQZGYoKVwiPlxyXG4gICAgICAgICAgRXhwb3J0IFBERlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICBFeHBvcnQgUmF3IERhdGFcclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIEBpZiAoKHJlcG9ydD8ucGFnZXM/Lmxlbmd0aCA/PyAwKSA+IDEpIHtcclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKHRydWUpXCI+XHJcbiAgICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YSAoVGhpcyBQYWdlKVxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZnMtbWVudT5cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVwb3J0IHNldHRpbmdzXCJcclxuICAgICAgICAgIChjbGljayk9XCJyZXBvcnRTZXR0aW5ncygpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXZcclxuICAgICAgI3NwbGl0XHJcbiAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19zcGxpdCBmcy1yb3cuYWxpZ24tc3RhcnRcIj5cclxuICAgIDxmcy1haS1jaGF0XHJcbiAgICAgICAgI2NoYXRQYW5lbFxyXG4gICAgICAgIGNsYXNzPVwiY2hhdFwiXHJcbiAgICAgICAgW2Jhc2VQYXRoXT1cImJhc2VQYXRoKClcIlxyXG4gICAgICAgIFtyZXF1ZXN0RGF0YV09XCJjaGF0UmVxdWVzdERhdGEoKVwiXHJcbiAgICAgICAgW3JlYWR5XT1cImNoYXRQYWdlSWQoKSAhPT0gbnVsbFwiXHJcbiAgICAgICAgKHJlc3BvbnNlKT1cIm9uQ2hhdFJlc3BvbnNlKCRldmVudClcIj5cclxuICAgIDwvZnMtYWktY2hhdD5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJyZXNpemVyXCJcclxuICAgICAgICAocG9pbnRlcmRvd24pPVwib25SZXNpemVTdGFydCgkZXZlbnQpXCI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwidmlld2VyIGZzLWZsZXggZnMtY29sdW1uXCI+XHJcbiAgICAgIEBpZiAocmVwb3J0KSB7XHJcbiAgICAgICAgPGFwcC1yZXBvcnQtY2FudmFzXHJcbiAgICAgICAgICAgIFtyZXBvcnRdPVwicmVwb3J0XCJcclxuICAgICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlXCJcclxuICAgICAgICAgICAgW3BhZ2VJZF09XCJwYWdlSWRcIlxyXG4gICAgICAgICAgICAoY29tcG9uZW50U2V0dGluZ3MpPVwiY29tcG9uZW50U2V0dGluZ3MoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChyZXBvcnRDaGFuZ2VkKT1cIm9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpXCJcclxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cIm9uQ2FudmFzUGFnZUNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChlZGl0RG9uZSk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XHJcbiAgICAgICAgPC9hcHAtcmVwb3J0LWNhbnZhcz5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQzdFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FDM0YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQWdCLGNBQWMsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVB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YyxtQkFHUCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLHNCQUFzQixDQUFDLGFBQ3RCO3dCQUNULHNFQUFzRTt3QkFDdEUsdUVBQXVFO3dCQUN2RSx3QkFBd0I7d0JBQ3hCLDRCQUE0Qjt3QkFDNUIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsc0VBQXNFO3dCQUN0RSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3FCQUN0RyxXQUNRO3dCQUNQLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjtxQkFDdEI7d0RBc0VPLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk1QixVQUFVO3NCQURqQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFNbEQsT0FBTztzQkFEZCxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsXHJcbiAgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgTmdab25lLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBGaWx0ZXJDb25maWcsIEZzRmlsdGVyTW9kdWxlLCBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XHJcbmltcG9ydCB7IEZzTWVudU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lbnUnO1xyXG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcclxuXHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IHByb3ZpZGVFY2hhcnRzQ29yZSB9IGZyb20gJ25neC1lY2hhcnRzJztcclxuXHJcbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xyXG5cclxuaW1wb3J0IHsgUmVwb3J0Q2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIFJlcG9ydFNldHRpbmdzUmVzdWx0IH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9yZXBvcnQtc2V0dGluZ3MvcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0UGRmU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXBvcnRQcHR4U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcHB0eC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDaGFydEdyYW51bGFyaXR5LCBSZXBvcnQsIFJlcG9ydENoYXRSZXNwb25zZSxcclxuICBSZXBvcnRDb21wb25lbnQgYXMgUmVwb3J0Q29tcG9uZW50TW9kZWwsIFJlcG9ydEZpbHRlckdyb3VwLFxyXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgR1JPVVBfQllfSVRFTSwgZmlsdGVySXRlbUZvckdyb3VwLCBncm91cEJ5RmlsdGVySXRlbSwgZ3JvdXBCeVNpZ25hdHVyZSwgZ3JvdXBWYWx1ZXNGcm9tUXVlcnksXHJcbiAgaXNHcmFudWxhcml0eU9mZmVyZWQsXHJcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XHJcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSwgZGVmYXVsdFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XHJcblxyXG5cclxuLy8gQSBzaW5nbGUgcmVwb3J0OiB0aGUgQUkgY2hhdCBvbiB0aGUgbGVmdCwgdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0LFxyXG4vLyB1bmRlciBhbiBIMiB0aXRsZSArIHNldHRpbmdzIGdlYXIuIFRoZSBob3N0IHN1cHBsaWVzIFtyZXBvcnRJZF0gKGZyb20gaXRzXHJcbi8vIHJvdXRlKSBhbmQgc3dpdGNoZXMgcmVwb3J0cyBieSBuYXZpZ2F0aW5nIOKAlCB0aGlzIGNvbXBvbmVudCBuZXZlciBwaWNrcyBvbmUuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIC8vIFNlc3Npb24gZmlsdGVyIHN0YXRlIGlzIHBlci1vcGVuLXJlcG9ydCwgbm90IGFwcC1nbG9iYWw7IHRoZSBleHBvcnRcclxuICAgIC8vIHNlcnZpY2VzIHJlc29sdmUgZmlsdGVycyB0aHJvdWdoIGl0LCBzbyB0aGV5IGxpdmUgYXQgdGhlIHNhbWUgbGV2ZWwuXHJcbiAgICBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsXHJcbiAgICBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlLFxyXG4gICAgUmVwb3J0UHB0eFNlcnZpY2UsXHJcbiAgICBSZXBvcnRQZGZTZXJ2aWNlLFxyXG4gICAgUmVwb3J0RXhwb3J0U2VydmljZSxcclxuICAgIC8vIFRyZWUtc2hha2VuIEVDaGFydHMgY29yZSArIHRoZSAncmVwb3J0JyBob3VzZSB0aGVtZSwgbG9hZGVkIGxhemlseS5cclxuICAgIHByb3ZpZGVFY2hhcnRzQ29yZSh7IGVjaGFydHM6ICgpID0+IGltcG9ydCgnLi4vLi4vdGhlbWUvZWNoYXJ0cycpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlLmRlZmF1bHQpIH0pLFxyXG4gIF0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRnNGaWx0ZXJNb2R1bGUsXHJcbiAgICBGc01lbnVNb2R1bGUsXHJcbiAgICBGc0FpQ2hhdENvbXBvbmVudCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxyXG4gICAgUmVwb3J0Q2FudmFzQ29tcG9uZW50LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0Q29tcG9uZW50IHtcclxuXHJcbiAgLy8gVGhlIHJlcG9ydCB0aGlzIHZpZXcgaXMgZm9jdXNlZCBvbiDigJQgc3VwcGxpZWQgYnkgdGhlIGhvc3QgZnJvbSB0aGUgcm91dGUuXHJcbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyArIGNoYXQgZW5kcG9pbnRzOyBvdmVycmlkZSB0byBtb3VudCBlbHNld2hlcmUuXHJcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VQYXRoID0gaW5wdXQ8c3RyaW5nPigncmVwb3J0cycpO1xyXG5cclxuICAvLyBUaGUgcXVlcnkgcGFyYW0gdGhhdCBjYXJyaWVzIHRoZSBvcGVuIHBhZ2UncyBpZC4gRGVlcCBsaW5raW5nIGlzIG9uIGJ5XHJcbiAgLy8gZGVmYXVsdDsgYSBob3N0IHRoYXQgbW91bnRzIHNldmVyYWwgcmVwb3J0cyBvbiBvbmUgcm91dGUsIG9yIHdhbnRzIG5vIFVSTFxyXG4gIC8vIHdyaXRlcyBhdCBhbGwsIHNldHMgdGhpcyB0byBudWxsIHRvIHR1cm4gaXQgb2ZmLlxyXG4gIHB1YmxpYyByZWFkb25seSBwYWdlUXVlcnlQYXJhbSA9IGlucHV0PHN0cmluZyB8IG51bGw+KCdwYWdlJyk7XHJcblxyXG4gIC8vIFRoZSByZXBvcnQgd2FzIGRlbGV0ZWQgZnJvbSBpdHMgc2V0dGluZ3MgZGlhbG9nIOKAlCB0aGUgaG9zdCByb3V0ZXMgYmFjayB0b1xyXG4gIC8vIHRoZSBsaXN0aW5nLlxyXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcclxuXHJcbiAgLy8gVGhlIHJlcG9ydCB3YXMgcmVuYW1lZCAoc2V0dGluZ3MsIG9yIHRoZSBhZ2VudCkg4oCUIHRoZSBob3N0IGNhbiByZWZyZXNoIGFcclxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXHJcbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZWQgPSBvdXRwdXQ8UmVwb3J0PigpO1xyXG5cclxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gVGhlIFVSTCBpcyBhbHJlYWR5IHVwZGF0ZWQgYnkgdGhlbiDigJRcclxuICAvLyB0aGlzIGlzIGZvciBob3N0cyB0aGF0IHRyYWNrIHRoZSBvcGVuIHBhZ2UgZm9yIHRoZWlyIG93biByZWFzb25zLlxyXG4gIHB1YmxpYyByZWFkb25seSBwYWdlQ2hhbmdlZCA9IG91dHB1dDxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICBwdWJsaWMgcmVwb3J0OiBSZXBvcnQgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgZWRpdE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgLy8gVGhlIHBhZ2UgdGhlIGNhbnZhcyBzaG91bGQgb3BlbiBvbiwgcmVhZCBmcm9tIHRoZSBVUkwgb25jZSBwZXIgcmVwb3J0LlxyXG4gIC8vIENsZWFyZWQgYXMgc29vbiBhcyB0aGUgY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYSBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2VcclxuICAvLyBpcyBuZXZlciBmb3VnaHQgYnkgYSBzdGFsZSB2YWx1ZS5cclxuICBwdWJsaWMgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cclxuICAvLyBiZWxvbmdzIHRvIGV4YWN0bHkgb25lIHBhZ2UsIHNvIHRoaXMgYm90aCBzY29wZXMgdGhlIGNvbnZlcnNhdGlvbiBsaXN0IGFuZFxyXG4gIC8vIGJlY29tZXMgdGhlIG5ldyBjb252ZXJzYXRpb24ncyBwYWdlLiBBIHNpZ25hbCBiZWNhdXNlIGl0IGZlZWRzXHJcbiAgLy8gW3JlcXVlc3REYXRhXSDigJQgY2hhbmdpbmcgaXQgaXMgd2hhdCByZWxvYWRzIHRoZSBwYW5lbCBvbnRvIHRoZSBuZXcgcGFnZSdzXHJcbiAgLy8gY29udmVyc2F0aW9ucy4gTnVsbCB1bnRpbCB0aGUgY2FudmFzIHJlcG9ydHMgd2hpY2ggcGFnZSBpdCBvcGVuZWQgb24sIHdoaWNoXHJcbiAgLy8ga2VlcHMgdGhlIGNoYXQgZnJvbSBsaXN0aW5nIGFnYWluc3QgYSBwYWdlIGd1ZXNzLlxyXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvLyBXaGF0IHRoZSBjaGF0IHNlbmRzIHdpdGggZXZlcnkgY29udmVyc2F0aW9uIGNhbGw6IHRoZSByZXBvcnQsIGFuZCB0aGUgcGFnZVxyXG4gIC8vIGl0IGlzIGJvdW5kIHRvLlxyXG4gIC8vXHJcbiAgLy8gcmVwb3J0UGFnZUlkIGlzIE9NSVRURUQsIG5vdCBzZW50IGFzIG51bGwsIHdoaWxlIHRoZSBvcGVuIHBhZ2UgaXMgdW5rbm93bi5cclxuICAvLyBUaGUgYmFja2VuZCByZWFkcyBhIFBSRVNFTlQgcmVwb3J0UGFnZUlkIG9mIDAvbnVsbCBhcyBcInRoZSByZXBvcnQncyBlYXJsaWVyLFxyXG4gIC8vIHBhZ2UtbGVzcyBjb252ZXJzYXRpb25zXCIsIHNvIHNlbmRpbmcgbnVsbCBiZWZvcmUgdGhlIGNhbnZhcyBoYXMgcmVwb3J0ZWQgaW5cclxuICAvLyB3b3VsZCBhc2sgZm9yIHRoZSB3cm9uZyBsaXN0IOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBiaW5kIGEgY29udmVyc2F0aW9uIHN0YXJ0ZWRcclxuICAvLyBpbiB0aGF0IHdpbmRvdyB0byBubyBwYWdlIGF0IGFsbC5cclxuICAvL1xyXG4gIC8vIFRoZSBjaGF0IGlzIGFsc28gaGVsZCBjbG9zZWQgKFtyZWFkeV0gaW4gdGhlIHRlbXBsYXRlKSB1bnRpbCB0aGUgcGFnZSBpc1xyXG4gIC8vIGtub3duLCBzbyB0aGlzIHBhcnRpYWwgY29udGV4dCBpcyBuZXZlciBhY3R1YWxseSBzZW50OiBvbiBhIGZyZXNoIGxvYWQgdGhlXHJcbiAgLy8gcmVwb3J0IGhhcyB0byBhcnJpdmUgYW5kIHRoZSBjYW52YXMgaGFzIHRvIHJlbmRlciBiZWZvcmUgYW55IHBhZ2UgZXhpc3RzLFxyXG4gIC8vIGFuZCBhIGxpc3QgZmV0Y2hlZCBpbiB0aGF0IHdpbmRvdyB3b3VsZCBiZSB0aGUgd2hvbGUgcmVwb3J0J3MgY29udmVyc2F0aW9uc1xyXG4gIC8vIOKAlCB0aGUgdW5zY29wZWQgbGlzdCwgc2hvd24gYW5kIGF1dG8tc2VsZWN0ZWQgYmVmb3JlIHRoZSByZWFsIG9uZSBsYW5kcy5cclxuICBwdWJsaWMgcmVhZG9ubHkgY2hhdFJlcXVlc3REYXRhID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCgpID0+IHtcclxuICAgIGNvbnN0IHJlcG9ydFBhZ2VJZCA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xyXG5cclxuICAgIHJldHVybiByZXBvcnRQYWdlSWQgPT09IG51bGxcclxuICAgICAgPyB7IHJlcG9ydElkOiB0aGlzLnJlcG9ydElkKCkgfVxyXG4gICAgICA6IHsgcmVwb3J0SWQ6IHRoaXMucmVwb3J0SWQoKSwgcmVwb3J0UGFnZUlkIH07XHJcbiAgfSk7XHJcblxyXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxyXG4gIC8vIHJlcG9ydCAoYW5kIHRodXMgaXRzIGdyb3VwcykgY2hhbmdlcy5cclxuICBwdWJsaWMgcmVwb3J0RmlsdGVyQ29uZmlnITogRmlsdGVyQ29uZmlnO1xyXG5cclxuICBAVmlld0NoaWxkKCdzcGxpdCcsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSBfc3BsaXQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2hhdFBhbmVsJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcclxuICBwcml2YXRlIF9jaGF0UGFuZWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgLy8gT25seSB0aGUgY2FudmFzIGtub3dzIHdoaWNoIHBhZ2UgaXMgb24gc2NyZWVuLCBhbmQgYSBwYWdlLXNjb3BlZCBleHBvcnRcclxuICAvLyBoYXMgdG8gYXNrIGl0LlxyXG4gIEBWaWV3Q2hpbGQoUmVwb3J0Q2FudmFzQ29tcG9uZW50KVxyXG4gIHByaXZhdGUgX2NhbnZhcz86IFJlcG9ydENhbnZhc0NvbXBvbmVudDtcclxuXHJcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcclxuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcml2YXRlIF9yb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcclxuICBwcml2YXRlIF9leHBvcnRTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4cG9ydFNlcnZpY2UpO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcclxuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcclxuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gUG9pbnQgdGhlIHNoYXJlZCBkYXRhIGdhdGV3YXkgYXQgdGhlIGNvbmZpZ3VyZWQgYmFzZSBmaXJzdCAoYmVmb3JlIGFueVxyXG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gKFJlKWxvYWQgd2hlbmV2ZXIgdGhlIGhvc3Qgc3dpdGNoZXMgdGhlIHJlcG9ydCBpZC5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnRJZCgpO1xyXG4gICAgICB0aGlzLmVkaXRNb2RlID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBBIG5ldyByZXBvcnQncyBwYWdlcyBhcmUgbm90IHRoaXMgcmVwb3J0J3MgcGFnZXMg4oCUIGRyb3AgdGhlIGJpbmRpbmdcclxuICAgICAgLy8gdW50aWwgaXRzIGNhbnZhcyBzYXlzIHdoaWNoIHBhZ2UgaXQgbGFuZGVkIG9uLlxyXG4gICAgICB0aGlzLmNoYXRQYWdlSWQuc2V0KG51bGwpO1xyXG5cclxuICAgICAgLy8gU2VlZCB0aGUgb3BlbiBwYWdlIGZyb20gdGhlIFVSTCBmb3IgdGhpcyByZXBvcnQuIFJlYWQgcGVyIGxvYWQgcmF0aGVyXHJcbiAgICAgIC8vIHRoYW4gb25jZSBhdCBjb25zdHJ1Y3Rpb246IHRoZSBob3N0IG1heSBzd2FwIHJlcG9ydHMgb24gdGhlIHNhbWUgcm91dGUsXHJcbiAgICAgIC8vIGFuZCBlYWNoIGFycml2YWwgY2FycmllcyBpdHMgb3duID9wYWdlPS5cclxuICAgICAgdGhpcy5wYWdlSWQgPSB0aGlzLl9wYWdlSWRGcm9tVXJsKCk7XHJcblxyXG4gICAgICBpZiAocmVwb3J0SWQgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZUVkaXRNb2RlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0TW9kZSA9ICF0aGlzLmVkaXRNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxyXG4gIC8vICh0aGUgYWN0aXZlIHBhZ2UsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRzLCB3aGljaCBsYXllciBpcyBsaXZlKS5cclxuICBwdWJsaWMgZ2V0IGlzTWFzdGVyTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FudmFzPy5hZGRUZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlTWFzdGVyTW9kZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbnZhcz8udG9nZ2xlTWFzdGVyTW9kZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVwb3J0IHNldHRpbmdzIOKAlCBuYW1lLCBwYWdlIHNpemUsIG9yaWVudGF0aW9uLCBsYXlvdXQgbW9kZSwgZGVsZXRlLiBUaGVcclxuICAvLyBkaWFsb2cgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGY7IHdlIHJlYWN0IHRvIHdoYXQgaXQgcmVwb3J0cyBiYWNrLlxyXG4gIHB1YmxpYyByZXBvcnRTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZXBvcnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnQuaWQ7XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nLm9wZW48UmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIFJlcG9ydFNldHRpbmdzUmVzdWx0PihSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7IHJlcG9ydDogdGhpcy5yZXBvcnQgfSxcclxuICAgICAgd2lkdGg6ICc0NjBweCcsXHJcbiAgICB9KVxyXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ2RlbGV0ZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZWQuZW1pdChyZXBvcnRJZCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzIOKAlCB0aXRsZSwgZXhhY3QgZ2VvbWV0cnksIGFuZCB0aGUgZGlhZ25vc3RpYyB2aWV3c1xyXG4gIC8vIChTUUwsIGNvbmZpZywgZmlsdGVyIHdpcmluZykuXHJcbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50TW9kZWwpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZXBvcnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnQuaWQ7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIENvbXBvbmVudFNldHRpbmdzUmVzdWx0PihcclxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXHJcbiAgICAgIHtcclxuICAgICAgICBkYXRhOiB7IHJlcG9ydDogdGhpcy5yZXBvcnQsIGNvbXBvbmVudCB9LFxyXG4gICAgICAgIHdpZHRoOiAnNjQwcHgnLFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBGaWx0ZXIgYWRkL3JlbW92ZS9sZXZlbCBjaGFuZ2VzIHBlcnNpc3QgaW1tZWRpYXRlbHkgaW5zaWRlIHRoZSBkaWFsb2cgKG5vXHJcbiAgICAvLyBcInNhdmVcIikgYW5kIGNhbiBsZWF2ZSBpdCBieSBhbiBleGl0IHRoYXQgY2FycmllcyBubyByZXN1bHQsIHNvIHRoZXkgYXJlXHJcbiAgICAvLyBhbm5vdW5jZWQgYXMgdGhleSBsYW5kLiBUaGUgcmVsb2FkIHdhaXRzIGZvciB0aGUgY2xvc2Ugc28gdGhlIGNhbnZhcyBpc24ndFxyXG4gICAgLy8gcmUtcmVuZGVyaW5nIHVuZGVybmVhdGggYW4gb3BlbiBkaWFsb2cuXHJcbiAgICBsZXQgZmlsdGVyc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5maWx0ZXJzQ2hhbmdlZFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwoZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGZpbHRlcnNDaGFuZ2VkID0gdHJ1ZSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICAvLyBUaGUgZGlhbG9nIGNvbmZpcm1zICsgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGYuIFRoZSBjb21wb25lbnQgaXNcclxuICAgICAgICAvLyBnb25lIGZyb20gdGhlIHJlcG9ydCwgc28gcmVsb2FkIHJhdGhlciB0aGFuIHBhdGNoaW5nIGl0IG91dCBsb2NhbGx5IOKAlFxyXG4gICAgICAgIC8vIGl0cyBmaWx0ZXJzIHdlbnQgd2l0aCBpdCwgd2hpY2ggdGhlIHJlcG9ydCBiYXIgaGFzIHRvIGJlIHJlYnVpbHQgZm9yLlxyXG4gICAgICAgIGlmIChyZXN1bHQ/LmRlbGV0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRoZSByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzIGNoYW5nZWQsIHNvIHRoZSByZXBvcnQgYmFyIGFuZCB0aGVcclxuICAgICAgICAvLyBvbi1jb21wb25lbnQgc3RyaXBzIGhhdmUgdG8gYmUgcmVidWlsdCBmcm9tIGEgZnJlc2ggcmVwb3J0LlxyXG4gICAgICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xyXG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGluIHRoZSBkaWFsb2cgdG91Y2hlcyB0aGUgcXVlcnkg4oCUIHRpdGxlIGFuZCBwYWRkaW5nIGFyZVxyXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi4gUmVwYWludCB0aGUgb25lIGNvbXBvbmVudCBpdCB3YXMgb3BlbmVkIGZvciBhbmQgbGVhdmVcclxuICAgICAgICAvLyBldmVyeSBvdGhlciBjb21wb25lbnQncyBkYXRhLCBhbmQgaXRzIHF1ZXJ5LCBhbG9uZS5cclxuICAgICAgICBpZiAocmVzdWx0Py5zZXR0aW5ncykge1xyXG4gICAgICAgICAgdGhpcy5fY2FudmFzPy5hcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudC5pZCwgcmVzdWx0LnNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIGNhbnZhcyBtb3ZlZCB0byBhbm90aGVyIHBhZ2U6IHJlZmxlY3QgaXQgaW4gdGhlIFVSTCBzbyBhIHJlZnJlc2ggb3IgYVxyXG4gIC8vIHNoYXJlZCBsaW5rIGNvbWVzIGJhY2sgaGVyZS4gcmVwbGFjZVVybCBrZWVwcyBwYWdpbmcgb3V0IG9mIHRoZSBicm93c2VyXHJcbiAgLy8gaGlzdG9yeSDigJQgQmFjayBzaG91bGQgbGVhdmUgdGhlIHJlcG9ydCwgbm90IHdhbGsgZXZlcnkgcGFnZSB2aXNpdGVkLlxyXG4gIHB1YmxpYyBvbkNhbnZhc1BhZ2VDaGFuZ2VkKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gVGhlIGRlZXAgbGluayBoYXMgYmVlbiBjb25zdW1lZDsgZnJvbSBoZXJlIHRoZSBjYW52YXMgb3ducyB0aGUgcGFnZS5cclxuICAgIHRoaXMucGFnZUlkID0gbnVsbDtcclxuICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQocGFnZUlkKTtcclxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChwYWdlSWQpO1xyXG5cclxuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xyXG4gICAgaWYgKCFwYXJhbSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuX3JvdXRlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBbcGFyYW1dOiBwYWdlSWQgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIGNhbnZhcyBjaGFuZ2VkIHRoZSByZXBvcnQncyBzdHJ1Y3R1cmUgKGFkZGVkIGEgcGFnZSkg4oCUIHJlLWZldGNoIHNvIHRoZVxyXG4gIC8vIG5ldyBwYWdlIHJlbmRlcnM7IHRoZSBjYW52YXMgbGFuZHMgdGhlIHZpZXcgb24gaXQuXHJcbiAgcHVibGljIG9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJlcG9ydCkge1xyXG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHRoaXMucmVwb3J0LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEV4cG9ydCB0aGUgcmVwb3J0IHRvIFBvd2VyUG9pbnQsIGVudGlyZWx5IGNsaWVudC1zaWRlIChuYXRpdmUgZWRpdGFibGVcclxuICAvLyBjaGFydHM7IHBhZ2UgPSBzbGlkZSkuIFRoZSBkb2NrIHNob3dzIHByb2dyZXNzIHVudGlsIHRoZSBmaWxlIHNhdmVzLlxyXG4gIHB1YmxpYyBleHBvcnRQb3dlcnBvaW50KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXHJcbiAgICAgICdFeHBvcnRpbmcgUG93ZXJQb2ludCcsXHJcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucG93ZXJwb2ludCh0aGlzLnJlcG9ydCksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gRXhwb3J0IHRvIFBERiwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG9mZnNjcmVlbiBFQ2hhcnRzIGF0IDPDlzsgcGFnZSA9IFBERiBwYWdlKS5cclxuICBwdWJsaWMgZXhwb3J0UGRmKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXHJcbiAgICAgICdFeHBvcnRpbmcgUERGJyxcclxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYodGhpcy5yZXBvcnQpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFRoZSByYXcgZGF0YSBiZWhpbmQgdGhlIHdob2xlIHJlcG9ydCBpbiBvbmUgYWN0aW9uOiB0aGUgc2VydmVyIGV4cG9ydHMgZXZlcnlcclxuICAvLyBjb21wb25lbnQncyBmdWxsIGZpbHRlcmVkIGRhdGFzZXQgYW5kIHppcHMgb25lIENTViBwZXIgY29tcG9uZW50LCBmb2xkZXJlZFxyXG4gIC8vIGJ5IHBhZ2UuIGB0aGlzUGFnZWAgbmFycm93cyBpdCB0byB0aGUgcGFnZSB0aGUgY2FudmFzIGlzIHNob3dpbmcuIFVubGlrZSB0aGVcclxuICAvLyBQREYvUG93ZXJQb2ludCBleHBvcnRzIHRoaXMgaXMgZW50aXJlbHkgc2VydmVyLXNpZGUg4oCUIG5vdGhpbmcgaXMgY29sbGVjdGVkXHJcbiAgLy8gaW4gdGhlIGJyb3dzZXIsIHNvIGl0IGlzIG5vdCBjYXBwZWQgYnkgd2hhdCBhIHNsaWRlIGNhbiBob2xkLlxyXG4gIHB1YmxpYyBleHBvcnREYXRhKHRoaXNQYWdlID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0O1xyXG4gICAgaWYgKCFyZXBvcnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXNQYWdlID8gdGhpcy5fY2FudmFzPy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsIDogbnVsbDtcclxuXHJcbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxyXG4gICAgICAnRXhwb3J0aW5nIGRhdGEnLFxyXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFJlcG9ydChyZXBvcnQuaWQsIHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JSZXBvcnQocmVwb3J0LCBwYWdlSWQpLCBwYWdlSWQpLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFJlYWN0IHRvIGVhY2ggY2hhdCB0dXJuIChmcy1jaGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QgKyBwZXJzaXN0ZW5jZSk7IHdlXHJcbiAgLy8gb25seSBjYXJlIGFib3V0IHRoZSByZXBvcnQgc2lkZSBlZmZlY3RzIHRoaXMgY29udGV4dCdzIGJhY2tlbmQgZmxhZ3MuXHJcbiAgcHVibGljIG9uQ2hhdFJlc3BvbnNlKHJlc3BvbnNlOiBGc0FpQ2hhdFJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcclxuICAgIGlmIChyZXBvcnRJZCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXBvcnRSZXNwb25zZSA9IHJlc3BvbnNlIGFzIEZzQWlDaGF0UmVzcG9uc2UgJiBSZXBvcnRDaGF0UmVzcG9uc2U7XHJcblxyXG4gICAgLy8gQSBzdHJ1Y3R1cmFsIGNoYW5nZSBvciBhIHJlbmFtZSBib3RoIHJlLWZldGNoIHRoZSByZXBvcnQgKHNlc3Npb24gZmlsdGVyXHJcbiAgICAvLyB2YWx1ZXMgc3Vydml2ZSk7IGEgcmVuYW1lIGFkZGl0aW9uYWxseSBub3RpZmllcyB0aGUgaG9zdCBzbyBpdCBjYW5cclxuICAgIC8vIHJlZnJlc2ggYSBicmVhZGNydW1iIC8gdGl0bGUuXHJcbiAgICBpZiAocmVwb3J0UmVzcG9uc2UucmVwb3J0Q2hhbmdlZCB8fCByZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsICEhcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBEcmFnIHRoZSBkaXZpZGVyIGJldHdlZW4gdGhlIGNoYXQgYW5kIGNhbnZhcyBwYW5lcyAocG9pbnRlci1jYXB0dXJlIGxvb3BcclxuICAvLyBvdXRzaWRlIEFuZ3VsYXIpLlxyXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcbiAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XHJcblxyXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vdmUgPSAoZTogUG9pbnRlckV2ZW50KSA9PiB0aGlzLl9yZXNpemVUbyhlLmNsaWVudFgpO1xyXG4gICAgICBjb25zdCBlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xyXG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xyXG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xyXG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcclxuICAgICAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc2l6aW5nJyk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcclxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XHJcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplVG8oY2xpZW50WDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByYXRpbyA9IChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7XHJcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4oMC44LCBNYXRoLm1heCgwLjIsIHJhdGlvKSk7XHJcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhlIHBhZ2UgaWQgc2l0dGluZyBpbiB0aGUgVVJMIHJpZ2h0IG5vdywgb3IgbnVsbCB3aGVuIGRlZXAgbGlua2luZyBpcyBvZmZcclxuICAvLyBvciB0aGUgdmFsdWUgaXMgbm90IGEgdXNhYmxlIGlkLlxyXG4gIHByaXZhdGUgX3BhZ2VJZEZyb21VcmwoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcclxuICAgIGlmICghcGFyYW0pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFnZUlkID0gTnVtYmVyKHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KHBhcmFtKSk7XHJcblxyXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYWdlSWQpICYmIHBhZ2VJZCA+IDAgPyBwYWdlSWQgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvcnREYXRhLmdldChyZXBvcnRJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcclxuICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xyXG5cclxuICAgICAgICBpZiAoZW1pdFJlbmFtZWQpIHtcclxuICAgICAgICAgIHRoaXMucmVuYW1lZC5lbWl0KHJlcG9ydCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXBvcnQtbGV2ZWwgZmlsdGVyIGdyb3VwcyBpbiB0aGVpciBzYXZlZCBvcmRlciDigJQgdGhlIG9uZXMgdGhhdCByZW5kZXIgaW5cclxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cykuXHJcbiAgcHJpdmF0ZSBfcmVwb3J0R3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKVxyXG4gICAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcbiAgfVxyXG5cclxuICAvLyBHYXRlcyB0aGUgdG9vbGJhciBmcy1maWx0ZXIgc28gaXQgaXNuJ3QgcmVuZGVyZWQgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvXHJcbiAgLy8gcHV0IGluIGl0IOKAlCBubyByZXBvcnQtbGV2ZWwgZmlsdGVycyBhbmQgbm8gZ3JvdXAtYnkgY29udHJvbC5cclxuICBwdWJsaWMgZ2V0IHJlcG9ydEhhc0ZpbHRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XHJcbiAgfVxyXG5cclxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgKGF0IGluaXQpLiBUaGUgdGVtcGxhdGUga2V5cyB0aGVcclxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxyXG4gIC8vIHJlYnVpbHQgY29uZmlnKSB3aGVuZXZlciB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcy5cclxuICBwdWJsaWMgZ2V0IHJlcG9ydEZpbHRlcktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XHJcbiAgICAgIC8vIHNldHRpbmdzIHJlYnVpbGRzIHRoZSBjb25maWcsIGJ1dCB3aXRob3V0IGEga2V5IGNoYW5nZSBmcy1maWx0ZXIga2VlcHNcclxuICAgICAgLy8gcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXHJcbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQpLFxyXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcclxuICAgIF0uam9pbignfCcpO1xyXG4gIH1cclxuXHJcbiAgLy8gKFJlKWJ1aWxkIHRoZSB0b29sYmFyIGZzLWZpbHRlciBjb25maWcg4oCUIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIGl0ZW1zIGFuZFxyXG4gIC8vIHRoZW4gdGhlIGdyb3VwLWJ5IGNvbnRyb2wuXHJcbiAgcHJpdmF0ZSBfYnVpbGRSZXBvcnRDb25maWcoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0Py5pZCA/PyBudWxsO1xyXG5cclxuICAgIC8vIERyb3AgYSBncmFpbiB0aGUgY29udHJvbCBubyBsb25nZXIgb2ZmZXJzIOKAlCB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdFxyXG4gICAgLy8gbWlkLXNlc3Npb24sIGFuZCBhbiBvdmVycmlkZSB0aGUgdmlld2VyIGNhbid0IHNlZSBpcyB3b3JzZSB0aGFuIG5vbmUuXHJcbiAgICBpZiAodGhpcy5yZXBvcnQgJiYgIWlzR3JhbnVsYXJpdHlPZmZlcmVkKHRoaXMucmVwb3J0LCB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKSkpIHtcclxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcclxuICAgICAgPyB0aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PlxyXG4gICAgICAgIGZpbHRlckl0ZW1Gb3JHcm91cChncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQsIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSkpXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wgbGVhZHMgdGhlIGJhciwgYWhlYWQgb2YgZXZlcnkgZmlsdGVyOiBpdCBzZXRzIHRoZVxyXG4gICAgLy8gZ3JhaW4gdGhlIHdob2xlIHJlcG9ydCBpcyByZWFkIGF0LCBzbyBpdCBpcyB0aGUgZmlyc3QgdGhpbmcgYSB2aWV3ZXJcclxuICAgIC8vIGRlY2lkZXMuIEl0IGlzIG5vdCBhIGZpbHRlciBncm91cCDigJQgaXQgcmUtYnVja2V0cyByb3dzIHJhdGhlciB0aGFuXHJcbiAgICAvLyBuYXJyb3dpbmcgdGhlbSDigJQgc28gaXQgaXMgcGxhY2VkIGhlcmUgcmF0aGVyIHRoYW4gb3JkZXJlZCBhbW9uZyB0aGVtLlxyXG4gICAgY29uc3QgZ3JvdXBCeUl0ZW0gPSB0aGlzLl9ncm91cEJ5SXRlbSgpO1xyXG4gICAgaWYgKGdyb3VwQnlJdGVtKSB7XHJcbiAgICAgIGl0ZW1zLnVuc2hpZnQoZ3JvdXBCeUl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVwb3J0RmlsdGVyQ29uZmlnID0ge1xyXG4gICAgICAvLyBOZXZlciB0b3VjaCB0aGUgVVJMIG9yIHBlcnNpc3QgZmlsdGVyIHN0YXRlIOKAlCByZXBvcnQgZmlsdGVycyBhcmVcclxuICAgICAgLy8gc2Vzc2lvbi1vbmx5LCBvd25lZCBieSBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UuXHJcbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxyXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgaXRlbXMsXHJcbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCB7IGdyb3VwSWQsIHZhbHVlIH0gb2YgZ3JvdXBWYWx1ZXNGcm9tUXVlcnkocXVlcnkgPz8ge30sIHRoaXMuX3JlcG9ydEdyb3VwcygpKSkge1xyXG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0VmFsdWUoZ3JvdXBJZCwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOb3QgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSBncmFpbiBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgcXVlcnkuXHJcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RnJlcXVlbmN5KChxdWVyeT8uW0dST1VQX0JZX0lURU1dIGFzIENoYXJ0R3JhbnVsYXJpdHkpIHx8IG51bGwpO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIGFzIGFuIGZzLWZpbHRlciBpdGVtLCBvciBudWxsIHdoZW4gdGhlIHJlcG9ydFxyXG4gIC8vIGhhcyBub25lIHRvIHNob3cuIFNlZWRlZCBmcm9tIHRoZSBzZXNzaW9uIHN0YXRlIHNvIHRoZSBncmFpbiB0aGUgdmlld2VyXHJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cclxuICBwcml2YXRlIF9ncm91cEJ5SXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMucmVwb3J0XHJcbiAgICAgID8gZ3JvdXBCeUZpbHRlckl0ZW0odGhpcy5yZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnQgZnMtY29sdW1uXCI+XG5cbiAgPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydF9faGVhZGVyIGZzLXJvdy5hbGlnbi1jZW50ZXJcIj5cbiAgICA8aDIgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3RpdGxlIGZzLWZsZXhcIj57eyByZXBvcnQ/Lm5hbWUgfX08L2gyPlxuXG4gICAgQGlmIChyZXBvcnQpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMuIGZzLWZpbHRlclxuICAgICAgICAgICByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgc28gaXQncyBrZXllZCBvbiB0aGUgZmlsdGVyXG4gICAgICAgICAgIHNpZ25hdHVyZTogd2hlbiB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcyB0aGUgYmxvY2sgaXNcbiAgICAgICAgICAgcmVjcmVhdGVkIGFuZCByZS1yZWFkcyB0aGUgcmVidWlsdCBjb25maWcuIC0tPlxuICAgICAgQGlmIChyZXBvcnRIYXNGaWx0ZXJzKSB7XG4gICAgICAgIEBmb3IgKGtleSBvZiBbcmVwb3J0RmlsdGVyS2V5XTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnXCI+XG4gICAgICAgICAgPC9mcy1maWx0ZXI+XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgPCEtLSBXaGF0IGxheW91dCBlZGl0aW5nIGNhbiBhZGQgb3Igc3dpdGNoIHRvLCBhbmQgdGhlIHdheSBvdXQgb2YgaXQuXG4gICAgICAgICAgIE9uZSBzdHlsZSBmb3IgYWxsIHRocmVlIOKAlCBvdXRsaW5lZCwgaWNvbiBhbmQgdGV4dC4gXCJIZWFkZXIgJiBmb290ZXJcIlxuICAgICAgICAgICBpcyBhIHRvZ2dsZTogaXQga2VlcHMgaXRzIGxhYmVsIGFuZCB0dXJucyBncmF5IHdoaWxlIGl0IGlzIG9uLiAtLT5cbiAgICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZWRpdC10b29scyBmcy1yb3cuYWxpZ24tY2VudGVyLmdhcC14c1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRkIGEgYmxvY2sgb2YgdGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRUZXh0KClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj50aXRsZTwvbWF0LWljb24+XG4gICAgICAgICAgICBBZGQgdGV4dFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fbWFzdGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc01hc3Rlck1vZGVcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc01hc3Rlck1vZGUgPyAnQmFjayB0byBlZGl0aW5nIHRoaXMgcGFnZScgOiAnRWRpdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgc2hvd24gb24gZXZlcnkgcGFnZSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWFzdGVyTW9kZSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEhlYWRlciAmIGZvb3RlclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIERvbmUgZWRpdGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBPbmUgaWNvbiBmb3IgYm90aCBzdGF0ZXM6IGl0IHJlYWRzIGFzIHByZXNzZWQgd2hpbGUgZWRpdGluZyByYXRoZXJcbiAgICAgICAgICAgdGhhbiBzd2FwcGluZyB0byBzb21ldGhpbmcgZWxzZS4gLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3RvZ2dsZVwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiZWRpdE1vZGUgPyAnRG9uZSBlZGl0aW5nJyA6ICdFZGl0IGxheW91dCdcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZGl0TW9kZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kYXNoYm9hcmRfY3VzdG9taXplPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydFwiXG4gICAgICAgICAgW2ZzTWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiPlxuICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZnMtbWVudSAjZXhwb3J0TWVudT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQb3dlcnBvaW50KClcIj5cbiAgICAgICAgICBFeHBvcnQgUG93ZXJQb2ludFxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCI+XG4gICAgICAgICAgRXhwb3J0IFBERlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEoKVwiPlxuICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICBAaWYgKChyZXBvcnQ/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSh0cnVlKVwiPlxuICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhIChUaGlzIFBhZ2UpXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgPC9mcy1tZW51PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlJlcG9ydCBzZXR0aW5nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICAgI3NwbGl0XG4gICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fc3BsaXQgZnMtcm93LmFsaWduLXN0YXJ0XCI+XG4gICAgPGZzLWFpLWNoYXRcbiAgICAgICAgI2NoYXRQYW5lbFxuICAgICAgICBjbGFzcz1cImNoYXRcIlxuICAgICAgICBbYmFzZVBhdGhdPVwiYmFzZVBhdGgoKVwiXG4gICAgICAgIFtyZXF1ZXN0RGF0YV09XCJjaGF0UmVxdWVzdERhdGEoKVwiXG4gICAgICAgIFtyZWFkeV09XCJjaGF0UGFnZUlkKCkgIT09IG51bGxcIlxuICAgICAgICAocmVzcG9uc2UpPVwib25DaGF0UmVzcG9uc2UoJGV2ZW50KVwiPlxuICAgIDwvZnMtYWktY2hhdD5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZXNpemVyXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInZpZXdlciBmcy1mbGV4IGZzLWNvbHVtblwiPlxuICAgICAgQGlmIChyZXBvcnQpIHtcbiAgICAgICAgPGFwcC1yZXBvcnQtY2FudmFzXG4gICAgICAgICAgICBbcmVwb3J0XT1cInJlcG9ydFwiXG4gICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIlxuICAgICAgICAgICAgW3BhZ2VJZF09XCJwYWdlSWRcIlxuICAgICAgICAgICAgKGNvbXBvbmVudFNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzKCRldmVudClcIlxuICAgICAgICAgICAgKHJlcG9ydENoYW5nZWQpPVwib25DYW52YXNSZXBvcnRDaGFuZ2VkKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cIm9uQ2FudmFzUGFnZUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L2FwcC1yZXBvcnQtY2FudmFzPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19