@firestitch/report 18.10.0 → 18.10.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 (44) hide show
  1. package/app/reports/data/report.data.d.ts +3 -5
  2. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +30 -2
  3. package/app/reports/filter-settings-rules.d.ts +4 -0
  4. package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
  5. package/app/reports/interfaces/report.interface.d.ts +1 -14
  6. package/app/reports/report-filter-items.d.ts +2 -8
  7. package/app/reports/report-view-config.d.ts +1 -3
  8. package/app/reports/services/report-filter-state.service.d.ts +5 -14
  9. package/app/reports/services/report-view.service.d.ts +1 -13
  10. package/app/reports/views/report/fs-ai-report.component.d.ts +2 -8
  11. package/esm2022/app/reports/canvas-landing-page.mjs +7 -6
  12. package/esm2022/app/reports/components/component-list/component-list.component.mjs +5 -5
  13. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +13 -12
  14. package/esm2022/app/reports/components/report-component/report-component.component.mjs +9 -9
  15. package/esm2022/app/reports/data/report.data.mjs +8 -5
  16. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +169 -21
  17. package/esm2022/app/reports/filter-settings-rules.mjs +8 -1
  18. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  19. package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
  20. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  21. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +1 -1
  22. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  23. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  24. package/esm2022/app/reports/report-filter-items.mjs +25 -105
  25. package/esm2022/app/reports/report-view-config.mjs +6 -116
  26. package/esm2022/app/reports/services/report-filter-state.service.mjs +92 -269
  27. package/esm2022/app/reports/services/report-view.service.mjs +25 -165
  28. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +56 -120
  29. package/esm2022/app/reports/views/report/report.component.mjs +11 -8
  30. package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
  31. package/fesm2022/{firestitch-report-echarts-UBg8Wlhd.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
  32. package/fesm2022/{firestitch-report-firestitch-report-B1keNrcK.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +454 -1470
  33. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
  34. package/fesm2022/firestitch-report.mjs +1 -1
  35. package/package.json +1 -1
  36. package/app/reports/interfaces/report-url-link.interface.d.ts +0 -4
  37. package/app/reports/interfaces/report-url-value-name.type.d.ts +0 -1
  38. package/app/reports/interfaces/report-url-write.interface.d.ts +0 -4
  39. package/app/reports/report-url-state.d.ts +0 -36
  40. package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +0 -2
  41. package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +0 -2
  42. package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +0 -2
  43. package/esm2022/app/reports/report-url-state.mjs +0 -677
  44. package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +0 -1
@@ -81,8 +81,8 @@ export class ComponentListComponent {
81
81
  // How many leading columns stay in view while the list scrolls sideways.
82
82
  pinned = computed(() => listPinnedColumns(this.component().config));
83
83
  columnClasses = columnClasses;
84
- // The config columns the viewer hid on this list (the Columns dialog, or the
85
- // URL). fs-list hides and shows them in place through [show], so the rows
84
+ // The config columns the viewer hid on this list (the Columns dialog, or a
85
+ // saved view). fs-list hides and shows them in place through [show], so the rows
86
86
  // already fetched stand.
87
87
  hidden = computed(() => new Set(this._filterState.hiddenColumns(this.component().id)));
88
88
  totalLabel = LIST_TOTAL_LABEL;
@@ -157,8 +157,8 @@ export class ComponentListComponent {
157
157
  status: false,
158
158
  reload: false,
159
159
  // FsList never touches the URL or persists sort/paging state. The sort
160
- // reaches the URL through ReportFilterStateService (setListSort), and
161
- // paging stays out of it.
160
+ // is kept in ReportFilterStateService (setListSort), and paging stays
161
+ // out of it.
162
162
  queryParam: false,
163
163
  persist: false,
164
164
  sort: sort
@@ -348,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
348
348
  ReportOutputPipe,
349
349
  ], template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<!-- The windows a comparison compares, and why it reads as it does. A\n windowed column's own notes are in its header's tooltip. -->\n<app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n</app-report-component-note>\n\n<!-- fs-list reads a column's footer template once, as a direct child of\n fs-list-column, so a list with totals renders its columns in a branch of\n their own rather than wrapping the footer in an @if. Its header template too,\n which every column carries: an output column's tooltip says what it holds.\n Columns are tracked by alignment as well as name, since fs-list reads a\n column's alignment only when it builds the column. -->\n<fs-list\n [config]=\"listConfig\"\n [class.report-totals-empty]=\"!totals()\">\n @if (showTotals()) {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n <ng-template fs-list-footer>\n @if (totals()?.[column.column] !== undefined) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: totals()?.[column.column], row: totals(), column: column }\">\n </ng-container>\n } @else if (column.column === totalsLabelColumn()) {\n {{ totalLabel }}\n }\n </ng-template>\n </fs-list-column>\n }\n } @else {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n </fs-list-column>\n }\n }\n</fs-list>\n\n@if (caption()) {\n <div class=\"list-caption small\">\n {{ caption() }}\n </div>\n}\n\n<!-- A column's heading, with what an output column holds as its tooltip (an\n empty one never shows). -->\n<ng-template\n #headerTpl\n let-column=\"column\">\n <span [matTooltip]=\"columnNotes()[column.column] ?? ''\">{{ column.label || column.column }}</span>\n</ng-template>\n\n<!-- One cell, in the body and the totals row alike: an output column by what\n it holds (its row gives a change its prior), a date column as a day in the\n report's zone and locale, any other through its number format. -->\n<ng-template\n #cellTpl\n let-value\n let-row=\"row\"\n let-column=\"column\">\n @if (outputColumns()[column.column]; as output) {\n @if (row | fsReportOutput: column : output : formatContext(); as cell) {\n <span [attr.title]=\"cell.title\">{{ cell.text }}</span>\n }\n } @else if (column.format === ReportListColumnFormat.Date) {\n {{ value | fsReportDate: timezone() : formatContext().locale }}\n } @else {\n {{ value | fsReportNumber: column : formatContext() }}\n }\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;flex:1 1 auto;height:auto;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list .fs-list-table tfoot td{position:sticky;bottom:0;z-index:1;background-color:#fff;font-weight:500;box-shadow:inset 0 1px #0000001f}:host ::ng-deep fs-list.report-totals-empty tfoot{display:none}:host ::ng-deep fs-list .report-pinned{position:sticky;left:var(--report-pin-left, 0px);z-index:1;background-color:#fff}:host ::ng-deep fs-list .report-pin-0{--report-pin-left: var(--report-pin-left-0, 0px)}:host ::ng-deep fs-list .report-pin-1{--report-pin-left: var(--report-pin-left-1, 0px)}:host ::ng-deep fs-list .report-pin-2{--report-pin-left: var(--report-pin-left-2, 0px)}:host ::ng-deep fs-list .report-pin-last{box-shadow:inset -1px 0 #0000001f}:host ::ng-deep fs-list .fs-list-table thead th.report-pinned{z-index:3}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pinned{z-index:2}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pin-last{box-shadow:inset -1px 0 #0000001f,inset 0 1px #0000001f}:host ::ng-deep fs-list th.report-nowrap,:host ::ng-deep fs-list td.report-nowrap{white-space:nowrap}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.list-caption{flex:0 0 auto;padding-top:4px}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"] }]
350
350
  }], ctorParameters: () => [] });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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Q0FBQztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nLCBvciB0aGVcbiAgLy8gVVJMKS4gZnMtbGlzdCBoaWRlcyBhbmQgc2hvd3MgdGhlbSBpbiBwbGFjZSB0aHJvdWdoIFtzaG93XSwgc28gdGhlIHJvd3NcbiAgLy8gYWxyZWFkeSBmZXRjaGVkIHN0YW5kLlxuICBwdWJsaWMgcmVhZG9ubHkgaGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gbmV3IFNldCh0aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50KCkuaWQpKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsTGFiZWwgPSBMSVNUX1RPVEFMX0xBQkVMO1xuXG4gIC8vIFRoZSBjb2x1bW5zIHRoYXQgaG9sZCBhIGNvbXBhcmVkLCB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQsIGJ5XG4gIC8vIG5hbWU7IHRoZSByZXN0IGFyZSB3cml0dGVuIGFzIGJlZm9yZS5cbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dENvbHVtbnMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBMaXN0T3V0cHV0Q29sdW1uPj4oKCkgPT4gbGlzdE91dHB1dENvbHVtbnMoXG4gICAgdGhpcy5jb2x1bW5zKCksXG4gICAgdGhpcy5ub3RlRGF0YSgpLFxuICAgICgodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWcpLmNvbHVtbnMgPz8gW10sXG4gICkpO1xuXG4gIC8vIEVhY2ggY29sdW1uJ3MgaGVhZGVyIHRvb2x0aXA6IHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyAoJycgZm9yIGFueVxuICAvLyBvdGhlcikuXG4gIHB1YmxpYyByZWFkb25seSBjb2x1bW5Ob3RlcyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY29sdW1ucygpXG4gICAgICAubWFwKChjb2x1bW4pID0+IFtjb2x1bW4uY29sdW1uLCBvdXRwdXRDb2x1bW5Ob3RlKGNvbHVtbi5jb2x1bW4sIHRoaXMubm90ZURhdGEoKSwgbG9jYWxlKV0pKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbHVtbiB3aG9zZSBmb290ZXIgY2VsbCByZWFkcyAnVG90YWwnOiB0aGUgZmlyc3Qgb25lIHNob3duLCB1bmxlc3NcbiAgLy8gaXQgaG9sZHMgYSB0b3RhbCBpdHNlbGYuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNMYWJlbENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IGxpc3RUb3RhbHNMYWJlbENvbHVtbihcbiAgICB0aGlzLmNvbHVtbnMoKS5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMuaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pKSxcbiAgICB0aGlzLnRvdGFscygpLFxuICApKTtcblxuICAvLyBUaGUgbGluZSB1bmRlciB0aGUgbGlzdDogaXRzIHJvdyBjb3VudCwgdGhlbiB3aHkgaXQgaGFzIG5vIHRvdGFscyBhbmQgd2h5XG4gIC8vIGl0cyBzZWFyY2ggbmFycm93ZWQgbm90aGluZy4gVGhlIGRpZ2l0cyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gbG9jYWxlLCBuZXZlciB0aGUgYXBwJ3MuXG4gIHB1YmxpYyByZWFkb25seSBjYXB0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dDb3VudCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb3VudCkge1xuICAgICAgY29uc3QgdG90YWwgPSBmb3JtYXRQbGFpbk51bWJlcihjb3VudC50b3RhbCwgbG9jYWxlKTtcbiAgICAgIHBhcnRzLnB1c2goY291bnQuc2hvd24gPCBjb3VudC50b3RhbFxuICAgICAgICA/IGBTaG93aW5nICR7Zm9ybWF0UGxhaW5OdW1iZXIoY291bnQuc2hvd24sIGxvY2FsZSl9IG9mICR7dG90YWx9YFxuICAgICAgICA6IGAke3RvdGFsfSByb3cocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLnBhcnRzLCB0aGlzLnRvdGFsc05vdGUoKSwgdGhpcy5zZWFyY2hOb3RlKCldXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gISFwYXJ0KVxuICAgICAgLmpvaW4oJyDCtyAnKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBfcGluT2Zmc2V0c1JlZjogQWZ0ZXJSZW5kZXJSZWYgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBIaWRpbmcgb3Igc2hvd2luZyBhIGNvbHVtbiBtb3ZlcyB0aGUgcGlubmVkIGNvbHVtbnMgYWZ0ZXIgaXQuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZGVuKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuc2hvd1RvdGFscy5zZXQoY29uZmlnLnRvdGFscyA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5jb2x1bW5zLnNldCgoY29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSk7XG5cbiAgICB0aGlzLl9pbml0TGlzdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX29ic2VydmVQaW5PZmZzZXRzKCk7XG5cbiAgICAvLyBBIGNoYW5nZSB0byBhbnkgZ3JvdXAgdGhpcyBsaXN0J3MgZmlsdGVycyBiZWxvbmcgdG8gKGZyb20gdGhlIHJlcG9ydCBiYXJcbiAgICAvLyBvciB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcCkgcmUtcnVucyB0aGUgbGlzdC5cbiAgICAvLyBTbyBkb2VzIGEgY2hhbmdlIG9mIHRoZSB0ZXh0IGluIGl0cyBzZWFyY2ggYm94IChpbiB0aGUgY29tcG9uZW50IGhlYWRlcikuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcihjb21wb25lbnQpLCB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnQuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQoKT8ucmVsb2FkKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0TGlzdENvbmZpZyhjb25maWc6IExpc3RDb25maWcpOiB2b2lkIHtcbiAgICAvLyBUaGUgdmlld2VyJ3MgbGFzdCBzb3J0IHdpbnMgb3ZlciB0aGUgYXV0aG9yZWQgb25lLCBzbyBhIGxpc3QgcmVjcmVhdGVkXG4gICAgLy8gaW4gdGhlIHNhbWUgc2Vzc2lvbiAocGFnZSBzd2l0Y2gsIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBrZWVwcyBpdC5cbiAgICAvLyBmcy1saXN0IGhvbGRzIG9uZSBzb3J0aW5nIGNvbHVtbiwgc28gaXQgc2hvd3MgdGhlIGF1dGhvcmVkIHNvcnQncyBmaXJzdFxuICAgIC8vIHRlcm07IHRoZSByZXF1ZXN0IHNlbmRzIG9ubHkgdGhhdCB0ZXJtIGFuZCB0aGUgc2VydmVyIGFwcGVuZHMgdGhlIHJlc3QuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50KCkuaWQpXG4gICAgICA/PyBsaXN0U29ydFRlcm1zKGNvbmZpZylbMF07XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICAvLyBJbnNpZGUgYSByZXBvcnQgY29tcG9uZW50IHRoZSBsaXN0IGlzIGEgY2xlYW4gZGF0YSBwYW5lIOKAlCBubyBzdGF0dXNcbiAgICAgIC8vIGJhciwgbm8gcmVsb2FkIGJ1dHRvbiAoZmlsdGVyIGNoYW5nZXMgYWxyZWFkeSByZWZldGNoKS5cbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRnNMaXN0IG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBzb3J0L3BhZ2luZyBzdGF0ZS4gVGhlIHNvcnRcbiAgICAgIC8vIHJlYWNoZXMgdGhlIFVSTCB0aHJvdWdoIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSAoc2V0TGlzdFNvcnQpLCBhbmRcbiAgICAgIC8vIHBhZ2luZyBzdGF5cyBvdXQgb2YgaXQuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgc29ydDogc29ydFxuICAgICAgICA/IHsgdmFsdWU6IHNvcnQuY29sdW1uLCBkaXJlY3Rpb246IHNvcnQuZGlyZWN0aW9uID8/ICdhc2MnIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAvLyBMb2FkLW1vcmU6IHRoZSBsaXN0IGtlZXBzIGEgZml4ZWQsIHNjcm9sbGFibGUgaGVpZ2h0IGFuZCBhcHBlbmRzIHRoZVxuICAgICAgLy8gbmV4dCBwYWdlIGluIHBsYWNlIGluc3RlYWQgb2Ygc3dhcHBpbmcgcGFnZXMuIFRoZSBidXR0b24gaXMgcGlubmVkIHRvXG4gICAgICAvLyB0aGUgYm90dG9tIG9mIHRoZSBzY3JvbGwgcGFuZSAoc2VlIGNvbXBvbmVudCBTQ1NTKS5cbiAgICAgIC8vXG4gICAgICAvLyBVc2VzIHRoZSBPZmZzZXQgc3RyYXRlZ3kgKG9mZnNldCArIGxpbWl0KSByYXRoZXIgdGhhbiBNYW55OiBpblxuICAgICAgLy8gQGZpcmVzdGl0Y2gvbGlzdCB0aGUgcGFnaW5hdGlvbiB0ZW1wbGF0ZSByZXNvbHZlcyBgaGFzTWFueVN0cmF0ZWd5YFxuICAgICAgLy8gQkVGT1JFIGBsb2FkTW9yZUVuYWJsZWRgLCBhbmQgTWFueSByZW5kZXJzIGEgZm9yd2FyZC1vbmx5IHBhZ2UgcGFnZXIg4oCUXG4gICAgICAvLyBzbyBNYW55IHdvdWxkIHN1cHByZXNzIHRoZSBsb2FkLW1vcmUgYnV0dG9uIGVudGlyZWx5LiBPZmZzZXQgKyBsb2FkTW9yZVxuICAgICAgLy8gaXMgdGhlIGNvbWJpbmF0aW9uIHRoYXQgYWN0dWFsbHkgcmVuZGVycyBhbmQgYXBwZW5kcy4gYF9mZXRjaGAgYWxyZWFkeVxuICAgICAgLy8gZGVyaXZlcyBgcGFnZWAgZnJvbSBgb2Zmc2V0YCwgc28gdGhlIHNlcnZlci1zaWRlIHdyYXAgaXMgdW5hZmZlY3RlZC5cbiAgICAgIHBhZ2luZzoge1xuICAgICAgICBsaW1pdDogY29uZmlnLnBhZ2VTaXplID8/IDI1LFxuICAgICAgICBzdHJhdGVneTogUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldCxcbiAgICAgIH0sXG4gICAgICBsb2FkTW9yZToge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBsYWJlbDogJ0xvYWQgbW9yZScsXG4gICAgICAgIGJ1dHRvblR5cGU6ICdzdHJva2VkJyxcbiAgICAgIH0sXG4gICAgICBmZXRjaDogKHF1ZXJ5OiBhbnkpID0+IHRoaXMuX2ZldGNoKHF1ZXJ5KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmV0Y2gocXVlcnk6IGFueSk6IE9ic2VydmFibGU8eyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyBwYWdpbmc6IGFueSB9PiB7XG4gICAgLy8gTWFueS9sb2FkLW1vcmUgc2VuZHMgYG9mZnNldGAgKyBgbGltaXRgIChub3QgYHBhZ2VgKTsgZGVyaXZlIHRoZSBwYWdlIHNvXG4gICAgLy8gdGhlIHNlcnZlci1zaWRlIHdyYXAga2VlcHMgd29ya2luZyB1bmNoYW5nZWQuIFBhZ2Ugc3RyYXRlZ3kgc3RpbGwgc2VuZHNcbiAgICAvLyBgcGFnZWAgZGlyZWN0bHkuXG4gICAgY29uc3QgcGFnZVNpemUgPSBxdWVyeS5saW1pdCA/PyAyNTtcbiAgICBjb25zdCBwYWdlID0gcXVlcnkucGFnZVxuICAgICAgPz8gKHF1ZXJ5Lm9mZnNldCAhPSBudWxsID8gTWF0aC5mbG9vcihxdWVyeS5vZmZzZXQgLyBwYWdlU2l6ZSkgKyAxIDogMSk7XG5cbiAgICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge1xuICAgICAgcGFnZSxcbiAgICAgIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICBjb25zdCBvcmRlciA9IFN0cmluZyhxdWVyeS5vcmRlciA/PyAnJyk7XG4gICAgaWYgKG9yZGVyKSB7XG4gICAgICBjb25zdCBbY29sdW1uLCBkaXJlY3Rpb25dID0gb3JkZXIuc3BsaXQoJywnKTtcbiAgICAgIHN0YXRlLnNvcnQgPSB7IGNvbHVtbiwgZGlyZWN0aW9uOiBkaXJlY3Rpb24gPT09ICdkZXNjJyA/ICdkZXNjJyA6ICdhc2MnIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRMaXN0U29ydChjb21wb25lbnQsIHN0YXRlLnNvcnQgPz8gbnVsbCk7XG5cbiAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKGNvbXBvbmVudC5pZCk7XG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgc3RhdGUuc2VhcmNoID0gc2VhcmNoO1xuICAgIH1cblxuICAgIC8vIFRoZSBncm91cHMgdGhhdCBtYXRjaCAnYW55JywgYXMgZXZlcnkgb3RoZXIgcmVhZCBvZiB0aGlzIHRpbGUgc2VuZHNcbiAgICAvLyB0aGVtICh0aWxlRGF0YVN0YXRlKS4gVGhlIHNvcnQgYW5kIHBhZ2luZyBhYm92ZSBhcmUgRnNMaXN0J3Mgb3duLlxuICAgIGNvbnN0IHsgbWF0Y2hBbnlHcm91cElkcyB9ID0gdGhpcy5fZmlsdGVyU3RhdGUudGlsZVN0YXRlKGNvbXBvbmVudCk7XG4gICAgaWYgKG1hdGNoQW55R3JvdXBJZHMpIHtcbiAgICAgIHN0YXRlLm1hdGNoQW55R3JvdXBJZHMgPSBtYXRjaEFueUdyb3VwSWRzO1xuICAgIH1cblxuICAgIC8vIE9uZSBzb3VyY2UgZm9yIGZpbHRlciB2YWx1ZXMsIHRoZSBzYW1lIG9uZSBjaGFydHMsIEtQSXMgYW5kIHRoZSBleHBvcnRzXG4gICAgLy8gcmVhZCwgc28gdGhlIGxpc3QgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyBpdHMgaGVhZGVyIHN0cmlwIHNob3dzLlxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgLmNvbXBvbmVudERhdGEodGhpcy5yZXBvcnRJZCgpLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4ge1xuICAgICAgICAgIC8vIEEgY3Jvc3MtdGFiJ3MgaGVhZGVycyBjb21lIGJhY2sgd2l0aCB0aGUgcm93czogdGhlIHJvdy1rZXkgY29sdW1uXG4gICAgICAgICAgLy8gZmlyc3QsIHRoZW4gb25lIHBlciBwaXZvdCB2YWx1ZS4gUmUtcmVhZCB0aGVtIG9uIGV2ZXJ5IGZldGNoLCBzaW5jZVxuICAgICAgICAgIC8vIGEgZmlsdGVyIGNoYW5nZSBjYW4gYWRkIG9yIHJlbW92ZSBhIGNvbHVtbi5cbiAgICAgICAgICBpZiAodGhpcy5waXZvdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zZXQodGhpcy5fcGl2b3RDb2x1bW5zKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMudHJ1bmNhdGVkLnNldCghIWRhdGEudHJ1bmNhdGVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbmx5IHBhZ2UgMSBjYXJyaWVzIHRoZSBub3RlcyBhbmQgdGhlIHRvdGFsczsgYSBsb2FkLW1vcmUgcGFnZVxuICAgICAgICAgIC8vIGxlYXZlcyB0aGVtIGFzIHRoZXkgYXJlLlxuICAgICAgICAgIGlmIChzdGF0ZS5wYWdlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaE5vdGUuc2V0KGRhdGEuc2VhcmNoTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMudG90YWxzLnNldChkYXRhLnRvdGFscyA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMudG90YWxzTm90ZS5zZXQoZGF0YS50b3RhbHNOb3RlID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy5ub3RlRGF0YS5zZXQodGhpcy5fbm90ZURhdGEoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5fYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIncyBwYWdlIHNpemUgd2hlbiBpdCBzZW5kcyBvbmUgKGl0IGNsYW1wcyB0aGUgcmVxdWVzdCksXG4gICAgICAgICAgLy8gdGhlIHNpemUgdGhlIHBhZ2luZyBiZWxvdyBoYW5kcyBmcy1saXN0IHRvby5cbiAgICAgICAgICBjb25zdCBzaXplID0gZGF0YS5wYWdpbmc/LnBhZ2VTaXplID8/IHN0YXRlLnBhZ2VTaXplO1xuICAgICAgICAgIGNvbnN0IHNob3duID0gKHN0YXRlLnBhZ2UgLSAxKSAqIHNpemUgKyAoZGF0YS5yb3dzPy5sZW5ndGggPz8gMCk7XG4gICAgICAgICAgdGhpcy5yb3dDb3VudC5zZXQoeyBzaG93biwgdG90YWw6IGRhdGEucGFnaW5nPy50b3RhbCA/PyBzaG93biB9KTtcblxuICAgICAgICAgIC8vIE5ldyByb3dzIGNhbiB3aWRlbiBhIHBpbm5lZCBjb2x1bW4sIHdoaWNoIG1vdmVzIHRoZSBvbmVzIGFmdGVyIGl0LlxuICAgICAgICAgIHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEucm93cyA/PyBbXSxcbiAgICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgICBsaW1pdDogZGF0YS5wYWdpbmc/LnBhZ2VTaXplID8/IHN0YXRlLnBhZ2VTaXplLFxuICAgICAgICAgICAgICByZWNvcmRzOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gKGRhdGEucm93cz8ubGVuZ3RoID8/IDApLFxuICAgICAgICAgICAgICBwYWdlOiBkYXRhLnBhZ2luZz8ucGFnZSA/PyBzdGF0ZS5wYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIGNyb3NzLXRhYidzIGNvbHVtbnMsIGJ1aWx0IGZyb20gdGhlIHdpcmUgYnkgcGl2b3RDb2x1bW5TcGVjcygpOiB0aGUgc2FtZVxuICAvLyBoZWFkaW5ncyBhbmQgY2VsbCBmb3JtYXQgdGhlIFBERiBhbmQgUG93ZXJQb2ludCBleHBvcnRzIHVzZS4gQSBjZWxsIGNvbHVtblxuICAvLyB3aG9zZSBtZWFzdXJlIGlzIGEgcmFuayBvciBhIHNoYXJlIChjZWxsTWVhc3VyZXMgbmFtZXMgaXQpIGhvbGRzIG51bWJlcnNcbiAgLy8gd2hldGhlciBvciBub3QgdGhlIGdyaWQgbmFtZXMgYSBjZWxsIGZvcm1hdC5cbiAgcHJpdmF0ZSBfcGl2b3RDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiAoTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbiB9KVtdIHtcbiAgICBjb25zdCBjb25maWcgPSAodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgY29uc3Qgb3V0cHV0Q2VsbHMgPSBPYmplY3Qua2V5cyhsaXN0T3V0cHV0Q29sdW1ucyhcbiAgICAgIChkYXRhLmNvbHVtbnMgPz8gW10pLnNsaWNlKDEpLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4gfSkpLFxuICAgICAgZGF0YSxcbiAgICAgIFtdLFxuICAgICkpO1xuXG4gICAgcmV0dXJuIHBpdm90Q29sdW1uU3BlY3MoY29uZmlnLCBkYXRhLCB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGUpXG4gICAgICAubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogY29sdW1uLm51bWVyaWMgfHwgb3V0cHV0Q2VsbHMuaW5jbHVkZXMoY29sdW1uLmNvbHVtbikgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbm90ZURhdGEoZGF0YTogQ29tcG9uZW50RGF0YSk6IENvbXBvbmVudE5vdGVEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyaXNvbjogZGF0YS5jb21wYXJpc29uLFxuICAgICAgdGltZWZyYW1lOiBkYXRhLnRpbWVmcmFtZSxcbiAgICAgIG91dHB1dHM6IGRhdGEub3V0cHV0cyxcbiAgICAgIGNlbGxNZWFzdXJlczogZGF0YS5jZWxsTWVhc3VyZXMsXG4gICAgICB3aW5kb3dzOiBkYXRhLndpbmRvd3MsXG4gICAgICBncmFudWxhcml0eTogZGF0YS5ncmFudWxhcml0eSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYnVpbHQgYmVmb3JlIGFueSBkYXRhIGFycml2ZXMsIHNvIGFuIG91dHB1dFxuICAvLyBjb2x1bW4gdGhhdCBuYW1lcyBubyBmb3JtYXQgb2YgaXRzIG93biAoYSByYW5rLCBhIHNoYXJlLCBhIHByaW9yIHRoYXQgdGFrZXNcbiAgLy8gaXRzIG1lYXN1cmUncyBmb3JtYXQpIGxlYXJucyBpdCBob2xkcyBudW1iZXJzIGZyb20gcGFnZSAxLiBmcy1saXN0IHJlYWRzIGFcbiAgLy8gY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbiwgc28gYSBjb2x1bW4gd2hvc2VcbiAgLy8gYWxpZ25tZW50IGNoYW5nZXMgaXMgcmVidWlsdCAodGhlIHRlbXBsYXRlIHRyYWNrcyBjb2x1bW5zIGJ5IGJvdGgpLlxuICBwcml2YXRlIF9hbGlnbk91dHB1dENvbHVtbnMoZGF0YTogQ29tcG9uZW50RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpdm90ZWQoKSB8fCAhZGF0YS5vdXRwdXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucygpO1xuICAgIGNvbnN0IGFsaWduZWQgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoe1xuICAgICAgLi4uY29sdW1uLFxuICAgICAgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfHwgISFkYXRhLm91dHB1dHNbY29sdW1uLmNvbHVtbl0sXG4gICAgfSkpO1xuXG4gICAgaWYgKGFsaWduZWQuc29tZSgoY29sdW1uLCBpbmRleCkgPT4gY29sdW1uLm51bWVyaWMgIT09IGNvbHVtbnNbaW5kZXhdLm51bWVyaWMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuc2V0KGFsaWduZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdGlsZSByZXNpemUgcmVmbG93cyB0aGUgdGFibGUncyBhdXRvIGxheW91dCwgc28gdGhlIHBpbm5lZCBjb2x1bW5zJ1xuICAvLyB3aWR0aHMsIGFuZCB3aXRoIHRoZW0gdGhlaXIgb2Zmc2V0cywgY2hhbmdlLlxuICBwcml2YXRlIF9vYnNlcnZlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waW5uZWQoKSA8IDIgfHwgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5fZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcbiAgfVxuXG4gIC8vIE1lYXN1cmVzIHRoZSBwaW5uZWQgb2Zmc2V0cyBvbmNlIHRoZSBuZXh0IHJlbmRlciBoYXMgbGFpZCB0aGUgdGFibGUgb3V0LlxuICAvLyBPbmUgcGVuZGluZyBtZWFzdXJlbWVudCBjb3ZlcnMgZXZlcnkgcmVxdWVzdCBtYWRlIGJlZm9yZSBpdCBydW5zLiBPbmx5XG4gIC8vIGFmdGVyTmV4dFJlbmRlciBleGlzdHMgaW4gZXZlcnkgQW5ndWxhciB2ZXJzaW9uIHRoaXMgbGlicmFyeSBydW5zIG9uLlxuICBwcml2YXRlIF9zY2hlZHVsZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHRoaXMuX3Bpbk9mZnNldHNSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX3Bpbk9mZnNldHNSZWYgPSBudWxsO1xuICAgICAgdGhpcy5fdXBkYXRlUGluT2Zmc2V0cygpO1xuICAgIH0sIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICB9XG5cbiAgLy8gRWFjaCBwaW5uZWQgY29sdW1uIHN0aWNrcyBhdCB0aGUgc3VtbWVkIHdpZHRoIG9mIHRoZSB2aXNpYmxlIHBpbm5lZFxuICAvLyBjb2x1bW5zIGJlZm9yZSBpdC4gQSBoaWRkZW4gY29sdW1uIHJlbmRlcnMgbm8gaGVhZGVyLCBzbyB0aGUgbmV4dCBwaW5uZWRcbiAgLy8gb25lIHRha2VzIGl0cyBwbGFjZS4gQSB2YXJpYWJsZSBpcyB3cml0dGVuIG9ubHkgd2hlbiBpdHMgdmFsdWUgY2hhbmdlZCxcbiAgLy8gd2hpY2gga2VlcHMgYSByZXNpemUgZnJvbSByZXN0eWxpbmcgdGhlIHRhYmxlIGZvciBub3RoaW5nLlxuICBwcml2YXRlIF91cGRhdGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgbGV0IGxlZnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucGlubmVkKCk7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGhvc3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYHRoZWFkIHRoLnJlcG9ydC1waW4tJHtpbmRleH1gKTtcblxuICAgICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBgLS1yZXBvcnQtcGluLWxlZnQtJHtpbmRleH1gO1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtNYXRoLnJvdW5kKGxlZnQgKiAxMDApIC8gMTAwfXB4YDtcblxuICAgICAgaWYgKGhvc3Quc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGxlZnQgKz0gaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmICh0cnVuY2F0ZWQoKSkge1xuICA8ZGl2IGNsYXNzPVwicGl2b3QtdHJ1bmNhdGVkXCI+XG4gICAgVGhpcyBncmlkIHdhcyBidWlsdCBmcm9tIGEgcGFydGlhbCByZXN1bHQsIHNvIHNvbWUgY29sdW1ucyBvciB2YWx1ZXMgbWF5IGJlIG1pc3NpbmcuIE5hcnJvdyBpdCB3aXRoIGEgZmlsdGVyLlxuICA8L2Rpdj5cbn1cblxuPCEtLSBUaGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGFuZCB3aHkgaXQgcmVhZHMgYXMgaXQgZG9lcy4gQVxuICAgICB3aW5kb3dlZCBjb2x1bW4ncyBvd24gbm90ZXMgYXJlIGluIGl0cyBoZWFkZXIncyB0b29sdGlwLiAtLT5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlXG4gIFtkYXRhXT1cIm5vdGVEYXRhKClcIlxuICBbd2luZG93Tm90ZXNdPVwiZmFsc2VcIj5cbjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cblxuPCEtLSBmcy1saXN0IHJlYWRzIGEgY29sdW1uJ3MgZm9vdGVyIHRlbXBsYXRlIG9uY2UsIGFzIGEgZGlyZWN0IGNoaWxkIG9mXG4gICAgIGZzLWxpc3QtY29sdW1uLCBzbyBhIGxpc3Qgd2l0aCB0b3RhbHMgcmVuZGVycyBpdHMgY29sdW1ucyBpbiBhIGJyYW5jaCBvZlxuICAgICB0aGVpciBvd24gcmF0aGVyIHRoYW4gd3JhcHBpbmcgdGhlIGZvb3RlciBpbiBhbiBAaWYuIEl0cyBoZWFkZXIgdGVtcGxhdGUgdG9vLFxuICAgICB3aGljaCBldmVyeSBjb2x1bW4gY2FycmllczogYW4gb3V0cHV0IGNvbHVtbidzIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLlxuICAgICBDb2x1bW5zIGFyZSB0cmFja2VkIGJ5IGFsaWdubWVudCBhcyB3ZWxsIGFzIG5hbWUsIHNpbmNlIGZzLWxpc3QgcmVhZHMgYVxuICAgICBjb2x1bW4ncyBhbGlnbm1lbnQgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGUgY29sdW1uLiAtLT5cbjxmcy1saXN0XG4gIFtjb25maWddPVwibGlzdENvbmZpZ1wiXG4gIFtjbGFzcy5yZXBvcnQtdG90YWxzLWVtcHR5XT1cIiF0b3RhbHMoKVwiPlxuICBAaWYgKHNob3dUb3RhbHMoKSkge1xuICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zKCk7IHRyYWNrIGNvbHVtbi5jb2x1bW4gKyAnOicgKyBjb2x1bW4ubnVtZXJpYykge1xuICAgICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICAgIFtuYW1lXT1cImNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbc2hvd109XCIhaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pXCJcbiAgICAgICAgW3NvcnRhYmxlXT1cIiFwaXZvdGVkKCkgfHwgJGZpcnN0XCJcbiAgICAgICAgW2FsaWduXT1cImNvbHVtbi5udW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzc109XCJjb2x1bW5DbGFzc2VzKGNvbHVtbiwgJGluZGV4LCBwaW5uZWQoKSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlclRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93W2NvbHVtbi5jb2x1bW5dLCByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1mb290ZXI+XG4gICAgICAgICAgQGlmICh0b3RhbHMoKT8uW2NvbHVtbi5jb2x1bW5dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogdG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSwgcm93OiB0b3RhbHMoKSwgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoY29sdW1uLmNvbHVtbiA9PT0gdG90YWxzTGFiZWxDb2x1bW4oKSkge1xuICAgICAgICAgICAge3sgdG90YWxMYWJlbCB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgfVxuICB9XG48L2ZzLWxpc3Q+XG5cbkBpZiAoY2FwdGlvbigpKSB7XG4gIDxkaXYgY2xhc3M9XCJsaXN0LWNhcHRpb24gc21hbGxcIj5cbiAgICB7eyBjYXB0aW9uKCkgfX1cbiAgPC9kaXY+XG59XG5cbjwhLS0gQSBjb2x1bW4ncyBoZWFkaW5nLCB3aXRoIHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyBhcyBpdHMgdG9vbHRpcCAoYW5cbiAgICAgZW1wdHkgb25lIG5ldmVyIHNob3dzKS4gLS0+XG48bmctdGVtcGxhdGVcbiAgI2hlYWRlclRwbFxuICBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxzcGFuIFttYXRUb29sdGlwXT1cImNvbHVtbk5vdGVzKClbY29sdW1uLmNvbHVtbl0gPz8gJydcIj57eyBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbiB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gT25lIGNlbGwsIGluIHRoZSBib2R5IGFuZCB0aGUgdG90YWxzIHJvdyBhbGlrZTogYW4gb3V0cHV0IGNvbHVtbiBieSB3aGF0XG4gICAgIGl0IGhvbGRzIChpdHMgcm93IGdpdmVzIGEgY2hhbmdlIGl0cyBwcmlvciksIGEgZGF0ZSBjb2x1bW4gYXMgYSBkYXkgaW4gdGhlXG4gICAgIHJlcG9ydCdzIHpvbmUgYW5kIGxvY2FsZSwgYW55IG90aGVyIHRocm91Z2ggaXRzIG51bWJlciBmb3JtYXQuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNjZWxsVHBsXG4gIGxldC12YWx1ZVxuICBsZXQtcm93PVwicm93XCJcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICBAaWYgKG91dHB1dENvbHVtbnMoKVtjb2x1bW4uY29sdW1uXTsgYXMgb3V0cHV0KSB7XG4gICAgQGlmIChyb3cgfCBmc1JlcG9ydE91dHB1dDogY29sdW1uIDogb3V0cHV0IDogZm9ybWF0Q29udGV4dCgpOyBhcyBjZWxsKSB7XG4gICAgICA8c3BhbiBbYXR0ci50aXRsZV09XCJjZWxsLnRpdGxlXCI+e3sgY2VsbC50ZXh0IH19PC9zcGFuPlxuICAgIH1cbiAgfSBAZWxzZSBpZiAoY29sdW1uLmZvcm1hdCA9PT0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdC5EYXRlKSB7XG4gICAge3sgdmFsdWUgfCBmc1JlcG9ydERhdGU6IHRpbWV6b25lKCkgOiBmb3JtYXRDb250ZXh0KCkubG9jYWxlIH19XG4gIH0gQGVsc2Uge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnROdW1iZXI6IGNvbHVtbiA6IGZvcm1hdENvbnRleHQoKSB9fVxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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QztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nLCBvciBhXG4gIC8vIHNhdmVkIHZpZXcpLiBmcy1saXN0IGhpZGVzIGFuZCBzaG93cyB0aGVtIGluIHBsYWNlIHRocm91Z2ggW3Nob3ddLCBzbyB0aGUgcm93c1xuICAvLyBhbHJlYWR5IGZldGNoZWQgc3RhbmQuXG4gIHB1YmxpYyByZWFkb25seSBoaWRkZW4gPSBjb21wdXRlZCgoKSA9PiBuZXcgU2V0KHRoaXMuX2ZpbHRlclN0YXRlLmhpZGRlbkNvbHVtbnModGhpcy5jb21wb25lbnQoKS5pZCkpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxMYWJlbCA9IExJU1RfVE9UQUxfTEFCRUw7XG5cbiAgLy8gVGhlIGNvbHVtbnMgdGhhdCBob2xkIGEgY29tcGFyZWQsIHdpbmRvd2VkLCByYW5rZWQgb3Igc2hhcmVkIG91dHB1dCwgYnlcbiAgLy8gbmFtZTsgdGhlIHJlc3QgYXJlIHdyaXR0ZW4gYXMgYmVmb3JlLlxuICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0Q29sdW1ucyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIExpc3RPdXRwdXRDb2x1bW4+PigoKSA9PiBsaXN0T3V0cHV0Q29sdW1ucyhcbiAgICB0aGlzLmNvbHVtbnMoKSxcbiAgICB0aGlzLm5vdGVEYXRhKCksXG4gICAgKCh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZykuY29sdW1ucyA/PyBbXSxcbiAgKSk7XG5cbiAgLy8gRWFjaCBjb2x1bW4ncyBoZWFkZXIgdG9vbHRpcDogd2hhdCBhbiBvdXRwdXQgY29sdW1uIGhvbGRzICgnJyBmb3IgYW55XG4gIC8vIG90aGVyKS5cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbk5vdGVzID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jb2x1bW5zKClcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gW2NvbHVtbi5jb2x1bW4sIG91dHB1dENvbHVtbk5vdGUoY29sdW1uLmNvbHVtbiwgdGhpcy5ub3RlRGF0YSgpLCBsb2NhbGUpXSkpO1xuICB9KTtcblxuICAvLyBUaGUgY29sdW1uIHdob3NlIGZvb3RlciBjZWxsIHJlYWRzICdUb3RhbCc6IHRoZSBmaXJzdCBvbmUgc2hvd24sIHVubGVzc1xuICAvLyBpdCBob2xkcyBhIHRvdGFsIGl0c2VsZi5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsc0xhYmVsQ29sdW1uID0gY29tcHV0ZWQoKCkgPT4gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKFxuICAgIHRoaXMuY29sdW1ucygpLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5oaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbikpLFxuICAgIHRoaXMudG90YWxzKCksXG4gICkpO1xuXG4gIC8vIFRoZSBsaW5lIHVuZGVyIHRoZSBsaXN0OiBpdHMgcm93IGNvdW50LCB0aGVuIHdoeSBpdCBoYXMgbm8gdG90YWxzIGFuZCB3aHlcbiAgLy8gaXRzIHNlYXJjaCBuYXJyb3dlZCBub3RoaW5nLiBUaGUgZGlnaXRzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQnc1xuICAvLyBsb2NhbGUsIG5ldmVyIHRoZSBhcHAncy5cbiAgcHVibGljIHJlYWRvbmx5IGNhcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLnJvd0NvdW50KCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBjb25zdCB0b3RhbCA9IGZvcm1hdFBsYWluTnVtYmVyKGNvdW50LnRvdGFsLCBsb2NhbGUpO1xuICAgICAgcGFydHMucHVzaChjb3VudC5zaG93biA8IGNvdW50LnRvdGFsXG4gICAgICAgID8gYFNob3dpbmcgJHtmb3JtYXRQbGFpbk51bWJlcihjb3VudC5zaG93biwgbG9jYWxlKX0gb2YgJHt0b3RhbH1gXG4gICAgICAgIDogYCR7dG90YWx9IHJvdyhzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ucGFydHMsIHRoaXMudG90YWxzTm90ZSgpLCB0aGlzLnNlYXJjaE5vdGUoKV1cbiAgICAgIC5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiAhIXBhcnQpXG4gICAgICAuam9pbignIMK3ICcpO1xuICB9KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIF9waW5PZmZzZXRzUmVmOiBBZnRlclJlbmRlclJlZiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEhpZGluZyBvciBzaG93aW5nIGEgY29sdW1uIG1vdmVzIHRoZSBwaW5uZWQgY29sdW1ucyBhZnRlciBpdC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRkZW4oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICB0aGlzLnBpdm90ZWQuc2V0KCEhY29uZmlnLnBpdm90Qnk/LmNvbHVtbik7XG4gICAgdGhpcy5zaG93VG90YWxzLnNldChjb25maWcudG90YWxzID09PSB0cnVlKTtcbiAgICB0aGlzLmNvbHVtbnMuc2V0KChjb25maWcuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpKTtcblxuICAgIHRoaXMuX2luaXRMaXN0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fb2JzZXJ2ZVBpbk9mZnNldHMoKTtcblxuICAgIC8vIEEgY2hhbmdlIHRvIGFueSBncm91cCB0aGlzIGxpc3QncyBmaWx0ZXJzIGJlbG9uZyB0byAoZnJvbSB0aGUgcmVwb3J0IGJhclxuICAgIC8vIG9yIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwKSByZS1ydW5zIHRoZSBsaXN0LlxuICAgIC8vIFNvIGRvZXMgYSBjaGFuZ2Ugb2YgdGhlIHRleHQgaW4gaXRzIHNlYXJjaCBib3ggKGluIHRoZSBjb21wb25lbnQgaGVhZGVyKS5cbiAgICBtZXJnZSh0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKGNvbXBvbmVudCksIHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudC5pZCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMubGlzdENvbXBvbmVudCgpPy5yZWxvYWQoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0Q29uZmlnKGNvbmZpZzogTGlzdENvbmZpZyk6IHZvaWQge1xuICAgIC8vIFRoZSB2aWV3ZXIncyBsYXN0IHNvcnQgd2lucyBvdmVyIHRoZSBhdXRob3JlZCBvbmUsIHNvIGEgbGlzdCByZWNyZWF0ZWRcbiAgICAvLyBpbiB0aGUgc2FtZSBzZXNzaW9uIChwYWdlIHN3aXRjaCwgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGtlZXBzIGl0LlxuICAgIC8vIGZzLWxpc3QgaG9sZHMgb25lIHNvcnRpbmcgY29sdW1uLCBzbyBpdCBzaG93cyB0aGUgYXV0aG9yZWQgc29ydCdzIGZpcnN0XG4gICAgLy8gdGVybTsgdGhlIHJlcXVlc3Qgc2VuZHMgb25seSB0aGF0IHRlcm0gYW5kIHRoZSBzZXJ2ZXIgYXBwZW5kcyB0aGUgcmVzdC5cbiAgICBjb25zdCBzb3J0OiBSZXBvcnRTb3J0IHwgdW5kZWZpbmVkID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQodGhpcy5jb21wb25lbnQoKS5pZClcbiAgICAgID8/IGxpc3RTb3J0VGVybXMoY29uZmlnKVswXTtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBGc0xpc3QgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIHNvcnQvcGFnaW5nIHN0YXRlLiBUaGUgc29ydFxuICAgICAgLy8gaXMga2VwdCBpbiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgKHNldExpc3RTb3J0KSwgYW5kIHBhZ2luZyBzdGF5c1xuICAgICAgLy8gb3V0IG9mIGl0LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICAgICAgPyB7IHZhbHVlOiBzb3J0LmNvbHVtbiwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPHsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgcGFnaW5nOiBhbnkgfT4ge1xuICAgIC8vIE1hbnkvbG9hZC1tb3JlIHNlbmRzIGBvZmZzZXRgICsgYGxpbWl0YCAobm90IGBwYWdlYCk7IGRlcml2ZSB0aGUgcGFnZSBzb1xuICAgIC8vIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkLiBQYWdlIHN0cmF0ZWd5IHN0aWxsIHNlbmRzXG4gICAgLy8gYHBhZ2VgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHBhZ2VTaXplID0gcXVlcnkubGltaXQgPz8gMjU7XG4gICAgY29uc3QgcGFnZSA9IHF1ZXJ5LnBhZ2VcbiAgICAgID8/IChxdWVyeS5vZmZzZXQgIT0gbnVsbCA/IE1hdGguZmxvb3IocXVlcnkub2Zmc2V0IC8gcGFnZVNpemUpICsgMSA6IDEpO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHtcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JkZXIgPSBTdHJpbmcocXVlcnkub3JkZXIgPz8gJycpO1xuICAgIGlmIChvcmRlcikge1xuICAgICAgY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSA9IG9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICBzdGF0ZS5zb3J0ID0geyBjb2x1bW4sIGRpcmVjdGlvbjogZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNvcnQoY29tcG9uZW50LCBzdGF0ZS5zb3J0ID8/IG51bGwpO1xuXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaChjb21wb25lbnQuaWQpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXBzIHRoYXQgbWF0Y2ggJ2FueScsIGFzIGV2ZXJ5IG90aGVyIHJlYWQgb2YgdGhpcyB0aWxlIHNlbmRzXG4gICAgLy8gdGhlbSAodGlsZURhdGFTdGF0ZSkuIFRoZSBzb3J0IGFuZCBwYWdpbmcgYWJvdmUgYXJlIEZzTGlzdCdzIG93bi5cbiAgICBjb25zdCB7IG1hdGNoQW55R3JvdXBJZHMgfSA9IHRoaXMuX2ZpbHRlclN0YXRlLnRpbGVTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmIChtYXRjaEFueUdyb3VwSWRzKSB7XG4gICAgICBzdGF0ZS5tYXRjaEFueUdyb3VwSWRzID0gbWF0Y2hBbnlHcm91cElkcztcbiAgICB9XG5cbiAgICAvLyBPbmUgc291cmNlIGZvciBmaWx0ZXIgdmFsdWVzLCB0aGUgc2FtZSBvbmUgY2hhcnRzLCBLUElzIGFuZCB0aGUgZXhwb3J0c1xuICAgIC8vIHJlYWQsIHNvIHRoZSBsaXN0IGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgaXRzIGhlYWRlciBzdHJpcCBzaG93cy5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGFcbiAgICAgIC5jb21wb25lbnREYXRhKHRoaXMucmVwb3J0SWQoKSwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICAvLyBBIGNyb3NzLXRhYidzIGhlYWRlcnMgY29tZSBiYWNrIHdpdGggdGhlIHJvd3M6IHRoZSByb3cta2V5IGNvbHVtblxuICAgICAgICAgIC8vIGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUuIFJlLXJlYWQgdGhlbSBvbiBldmVyeSBmZXRjaCwgc2luY2VcbiAgICAgICAgICAvLyBhIGZpbHRlciBjaGFuZ2UgY2FuIGFkZCBvciByZW1vdmUgYSBjb2x1bW4uXG4gICAgICAgICAgaWYgKHRoaXMucGl2b3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc2V0KHRoaXMuX3Bpdm90Q29sdW1ucyhkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnRydW5jYXRlZC5zZXQoISFkYXRhLnRydW5jYXRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSBwYWdlIDEgY2FycmllcyB0aGUgbm90ZXMgYW5kIHRoZSB0b3RhbHM7IGEgbG9hZC1tb3JlIHBhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgdGhlbSBhcyB0aGV5IGFyZS5cbiAgICAgICAgICBpZiAoc3RhdGUucGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hOb3RlLnNldChkYXRhLnNlYXJjaE5vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFscy5zZXQoZGF0YS50b3RhbHMgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFsc05vdGUuc2V0KGRhdGEudG90YWxzTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMubm90ZURhdGEuc2V0KHRoaXMuX25vdGVEYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc2VydmVyJ3MgcGFnZSBzaXplIHdoZW4gaXQgc2VuZHMgb25lIChpdCBjbGFtcHMgdGhlIHJlcXVlc3QpLFxuICAgICAgICAgIC8vIHRoZSBzaXplIHRoZSBwYWdpbmcgYmVsb3cgaGFuZHMgZnMtbGlzdCB0b28uXG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZTtcbiAgICAgICAgICBjb25zdCBzaG93biA9IChzdGF0ZS5wYWdlIC0gMSkgKiBzaXplICsgKGRhdGEucm93cz8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgIHRoaXMucm93Q291bnQuc2V0KHsgc2hvd24sIHRvdGFsOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gc2hvd24gfSk7XG5cbiAgICAgICAgICAvLyBOZXcgcm93cyBjYW4gd2lkZW4gYSBwaW5uZWQgY29sdW1uLCB3aGljaCBtb3ZlcyB0aGUgb25lcyBhZnRlciBpdC5cbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlIGJ5IHBpdm90Q29sdW1uU3BlY3MoKTogdGhlIHNhbWVcbiAgLy8gaGVhZGluZ3MgYW5kIGNlbGwgZm9ybWF0IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgZXhwb3J0cyB1c2UuIEEgY2VsbCBjb2x1bW5cbiAgLy8gd2hvc2UgbWVhc3VyZSBpcyBhIHJhbmsgb3IgYSBzaGFyZSAoY2VsbE1lYXN1cmVzIG5hbWVzIGl0KSBob2xkcyBudW1iZXJzXG4gIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBncmlkIG5hbWVzIGEgY2VsbCBmb3JtYXQuXG4gIHByaXZhdGUgX3Bpdm90Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogKExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXSB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIGNvbnN0IG91dHB1dENlbGxzID0gT2JqZWN0LmtleXMobGlzdE91dHB1dENvbHVtbnMoXG4gICAgICAoZGF0YS5jb2x1bW5zID8/IFtdKS5zbGljZSgxKS5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBbXSxcbiAgICApKTtcblxuICAgIHJldHVybiBwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGNvbHVtbi5udW1lcmljIHx8IG91dHB1dENlbGxzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vdGVEYXRhKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb21wb25lbnROb3RlRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmlzb246IGRhdGEuY29tcGFyaXNvbixcbiAgICAgIHRpbWVmcmFtZTogZGF0YS50aW1lZnJhbWUsXG4gICAgICBvdXRwdXRzOiBkYXRhLm91dHB1dHMsXG4gICAgICBjZWxsTWVhc3VyZXM6IGRhdGEuY2VsbE1lYXN1cmVzLFxuICAgICAgd2luZG93czogZGF0YS53aW5kb3dzLFxuICAgICAgZ3JhbnVsYXJpdHk6IGRhdGEuZ3JhbnVsYXJpdHksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGJ1aWx0IGJlZm9yZSBhbnkgZGF0YSBhcnJpdmVzLCBzbyBhbiBvdXRwdXRcbiAgLy8gY29sdW1uIHRoYXQgbmFtZXMgbm8gZm9ybWF0IG9mIGl0cyBvd24gKGEgcmFuaywgYSBzaGFyZSwgYSBwcmlvciB0aGF0IHRha2VzXG4gIC8vIGl0cyBtZWFzdXJlJ3MgZm9ybWF0KSBsZWFybnMgaXQgaG9sZHMgbnVtYmVycyBmcm9tIHBhZ2UgMS4gZnMtbGlzdCByZWFkcyBhXG4gIC8vIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4sIHNvIGEgY29sdW1uIHdob3NlXG4gIC8vIGFsaWdubWVudCBjaGFuZ2VzIGlzIHJlYnVpbHQgKHRoZSB0ZW1wbGF0ZSB0cmFja3MgY29sdW1ucyBieSBib3RoKS5cbiAgcHJpdmF0ZSBfYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waXZvdGVkKCkgfHwgIWRhdGEub3V0cHV0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoKTtcbiAgICBjb25zdCBhbGlnbmVkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIHx8ICEhZGF0YS5vdXRwdXRzW2NvbHVtbi5jb2x1bW5dLFxuICAgIH0pKTtcblxuICAgIGlmIChhbGlnbmVkLnNvbWUoKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbi5udW1lcmljICE9PSBjb2x1bW5zW2luZGV4XS5udW1lcmljKSkge1xuICAgICAgdGhpcy5jb2x1bW5zLnNldChhbGlnbmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRpbGUgcmVzaXplIHJlZmxvd3MgdGhlIHRhYmxlJ3MgYXV0byBsYXlvdXQsIHNvIHRoZSBwaW5uZWQgY29sdW1ucydcbiAgLy8gd2lkdGhzLCBhbmQgd2l0aCB0aGVtIHRoZWlyIG9mZnNldHMsIGNoYW5nZS5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuX2Rlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICAvLyBNZWFzdXJlcyB0aGUgcGlubmVkIG9mZnNldHMgb25jZSB0aGUgbmV4dCByZW5kZXIgaGFzIGxhaWQgdGhlIHRhYmxlIG91dC5cbiAgLy8gT25lIHBlbmRpbmcgbWVhc3VyZW1lbnQgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgbWFkZSBiZWZvcmUgaXQgcnVucy4gT25seVxuICAvLyBhZnRlck5leHRSZW5kZXIgZXhpc3RzIGluIGV2ZXJ5IEFuZ3VsYXIgdmVyc2lvbiB0aGlzIGxpYnJhcnkgcnVucyBvbi5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0aGlzLl9waW5PZmZzZXRzUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVBpbk9mZnNldHMoKTtcbiAgICB9LCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgfVxuXG4gIC8vIEVhY2ggcGlubmVkIGNvbHVtbiBzdGlja3MgYXQgdGhlIHN1bW1lZCB3aWR0aCBvZiB0aGUgdmlzaWJsZSBwaW5uZWRcbiAgLy8gY29sdW1ucyBiZWZvcmUgaXQuIEEgaGlkZGVuIGNvbHVtbiByZW5kZXJzIG5vIGhlYWRlciwgc28gdGhlIG5leHQgcGlubmVkXG4gIC8vIG9uZSB0YWtlcyBpdHMgcGxhY2UuIEEgdmFyaWFibGUgaXMgd3JpdHRlbiBvbmx5IHdoZW4gaXRzIHZhbHVlIGNoYW5nZWQsXG4gIC8vIHdoaWNoIGtlZXBzIGEgcmVzaXplIGZyb20gcmVzdHlsaW5nIHRoZSB0YWJsZSBmb3Igbm90aGluZy5cbiAgcHJpdmF0ZSBfdXBkYXRlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBsZWZ0ID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBpbm5lZCgpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBob3N0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0aGVhZCB0aC5yZXBvcnQtcGluLSR7aW5kZXh9YCk7XG5cbiAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gYC0tcmVwb3J0LXBpbi1sZWZ0LSR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYCR7TWF0aC5yb3VuZChsZWZ0ICogMTAwKSAvIDEwMH1weGA7XG5cbiAgICAgIGlmIChob3N0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgIT09IHZhbHVlKSB7XG4gICAgICAgIGhvc3Quc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBsZWZ0ICs9IGhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjwhLS0gVGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBhbmQgd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuIEFcbiAgICAgd2luZG93ZWQgY29sdW1uJ3Mgb3duIG5vdGVzIGFyZSBpbiBpdHMgaGVhZGVyJ3MgdG9vbHRpcC4gLS0+XG48YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICBbZGF0YV09XCJub3RlRGF0YSgpXCJcbiAgW3dpbmRvd05vdGVzXT1cImZhbHNlXCI+XG48L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG5cbjwhLS0gZnMtbGlzdCByZWFkcyBhIGNvbHVtbidzIGZvb3RlciB0ZW1wbGF0ZSBvbmNlLCBhcyBhIGRpcmVjdCBjaGlsZCBvZlxuICAgICBmcy1saXN0LWNvbHVtbiwgc28gYSBsaXN0IHdpdGggdG90YWxzIHJlbmRlcnMgaXRzIGNvbHVtbnMgaW4gYSBicmFuY2ggb2ZcbiAgICAgdGhlaXIgb3duIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSBmb290ZXIgaW4gYW4gQGlmLiBJdHMgaGVhZGVyIHRlbXBsYXRlIHRvbyxcbiAgICAgd2hpY2ggZXZlcnkgY29sdW1uIGNhcnJpZXM6IGFuIG91dHB1dCBjb2x1bW4ncyB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcy5cbiAgICAgQ29sdW1ucyBhcmUgdHJhY2tlZCBieSBhbGlnbm1lbnQgYXMgd2VsbCBhcyBuYW1lLCBzaW5jZSBmcy1saXN0IHJlYWRzIGFcbiAgICAgY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbi4gLS0+XG48ZnMtbGlzdFxuICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICBbY2xhc3MucmVwb3J0LXRvdGFscy1lbXB0eV09XCIhdG90YWxzKClcIj5cbiAgQGlmIChzaG93VG90YWxzKCkpIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtZm9vdGVyPlxuICAgICAgICAgIEBpZiAodG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0sIHJvdzogdG90YWxzKCksIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jb2x1bW4gPT09IHRvdGFsc0xhYmVsQ29sdW1uKCkpIHtcbiAgICAgICAgICAgIHt7IHRvdGFsTGFiZWwgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfVxuPC9mcy1saXN0PlxuXG5AaWYgKGNhcHRpb24oKSkge1xuICA8ZGl2IGNsYXNzPVwibGlzdC1jYXB0aW9uIHNtYWxsXCI+XG4gICAge3sgY2FwdGlvbigpIH19XG4gIDwvZGl2PlxufVxuXG48IS0tIEEgY29sdW1uJ3MgaGVhZGluZywgd2l0aCB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgYXMgaXRzIHRvb2x0aXAgKGFuXG4gICAgIGVtcHR5IG9uZSBuZXZlciBzaG93cykuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNoZWFkZXJUcGxcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3BhbiBbbWF0VG9vbHRpcF09XCJjb2x1bW5Ob3RlcygpW2NvbHVtbi5jb2x1bW5dID8/ICcnXCI+e3sgY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIE9uZSBjZWxsLCBpbiB0aGUgYm9keSBhbmQgdGhlIHRvdGFscyByb3cgYWxpa2U6IGFuIG91dHB1dCBjb2x1bW4gYnkgd2hhdFxuICAgICBpdCBob2xkcyAoaXRzIHJvdyBnaXZlcyBhIGNoYW5nZSBpdHMgcHJpb3IpLCBhIGRhdGUgY29sdW1uIGFzIGEgZGF5IGluIHRoZVxuICAgICByZXBvcnQncyB6b25lIGFuZCBsb2NhbGUsIGFueSBvdGhlciB0aHJvdWdoIGl0cyBudW1iZXIgZm9ybWF0LiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjY2VsbFRwbFxuICBsZXQtdmFsdWVcbiAgbGV0LXJvdz1cInJvd1wiXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgQGlmIChvdXRwdXRDb2x1bW5zKClbY29sdW1uLmNvbHVtbl07IGFzIG91dHB1dCkge1xuICAgIEBpZiAocm93IHwgZnNSZXBvcnRPdXRwdXQ6IGNvbHVtbiA6IG91dHB1dCA6IGZvcm1hdENvbnRleHQoKTsgYXMgY2VsbCkge1xuICAgICAgPHNwYW4gW2F0dHIudGl0bGVdPVwiY2VsbC50aXRsZVwiPnt7IGNlbGwudGV4dCB9fTwvc3Bhbj5cbiAgICB9XG4gIH0gQGVsc2UgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnREYXRlOiB0aW1lem9uZSgpIDogZm9ybWF0Q29udGV4dCgpLmxvY2FsZSB9fVxuICB9IEBlbHNlIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0TnVtYmVyOiBjb2x1bW4gOiBmb3JtYXRDb250ZXh0KCkgfX1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==