@firestitch/report 18.9.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 (186) hide show
  1. package/app/reports/anchor-at-point.d.ts +14 -0
  2. package/app/reports/canvas-landing-page.d.ts +2 -0
  3. package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
  4. package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -0
  6. package/app/reports/components/report-component/report-component.component.d.ts +35 -1
  7. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
  8. package/app/reports/data/report.data.d.ts +20 -7
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +45 -8
  11. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
  12. package/app/reports/drill-crumbs.d.ts +12 -0
  13. package/app/reports/export/report-export-collector.service.d.ts +13 -4
  14. package/app/reports/export/report-filter-lines.d.ts +18 -0
  15. package/app/reports/filter-settings-rules.d.ts +37 -0
  16. package/app/reports/format.d.ts +0 -1
  17. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
  18. package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
  19. package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
  20. package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
  21. package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
  22. package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
  23. package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
  24. package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
  25. package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
  26. package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
  27. package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
  28. package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
  29. package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
  30. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
  31. package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
  32. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
  33. package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
  34. package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
  35. package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
  36. package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
  37. package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
  38. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
  39. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
  40. package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
  41. package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
  42. package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
  43. package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
  44. package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
  45. package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
  46. package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
  47. package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
  48. package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
  49. package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
  50. package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
  51. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
  52. package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
  53. package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
  54. package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
  55. package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
  56. package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
  57. package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
  58. package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
  59. package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
  60. package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
  61. package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
  62. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
  63. package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
  64. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
  65. package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
  66. package/app/reports/interfaces/report-view.interface.d.ts +7 -0
  67. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
  68. package/app/reports/interfaces/report-views.interface.d.ts +7 -0
  69. package/app/reports/interfaces/report.interface.d.ts +27 -16
  70. package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
  71. package/app/reports/mark-click.d.ts +20 -0
  72. package/app/reports/option-builder.d.ts +12 -1
  73. package/app/reports/report-chat-viewer-state.d.ts +8 -0
  74. package/app/reports/report-date-presets.d.ts +2 -0
  75. package/app/reports/report-filter-items.d.ts +20 -21
  76. package/app/reports/report-tile.d.ts +2 -0
  77. package/app/reports/report-view-config.d.ts +34 -0
  78. package/app/reports/report-view-menu.d.ts +15 -0
  79. package/app/reports/report-viewer-features.d.ts +5 -0
  80. package/app/reports/services/report-filter-options.service.d.ts +26 -0
  81. package/app/reports/services/report-filter-state.service.d.ts +65 -11
  82. package/app/reports/services/report-view.service.d.ts +39 -0
  83. package/app/reports/tile-data-state.d.ts +7 -0
  84. package/app/reports/tile-loads.d.ts +4 -0
  85. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -8
  86. package/app/reports/views/report/report.component.d.ts +6 -0
  87. package/esm2022/app/reports/anchor-at-point.mjs +49 -0
  88. package/esm2022/app/reports/canvas-landing-page.mjs +26 -0
  89. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
  90. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
  91. package/esm2022/app/reports/components/component-list/component-list.component.mjs +11 -5
  92. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +56 -40
  93. package/esm2022/app/reports/components/report-component/report-component.component.mjs +261 -65
  94. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
  95. package/esm2022/app/reports/data/report.data.mjs +94 -14
  96. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
  97. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +248 -104
  98. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
  99. package/esm2022/app/reports/drill-crumbs.mjs +73 -0
  100. package/esm2022/app/reports/export/report-export-collector.service.mjs +187 -117
  101. package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
  102. package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
  103. package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
  104. package/esm2022/app/reports/filter-settings-rules.mjs +290 -0
  105. package/esm2022/app/reports/format.mjs +2 -22
  106. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
  107. package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
  108. package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
  109. package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
  110. package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
  111. package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
  112. package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
  113. package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
  114. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
  115. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
  116. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
  117. package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
  118. package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
  119. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  120. package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
  121. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  122. package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
  123. package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
  124. package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
  125. package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
  126. package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
  127. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
  128. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
  129. package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
  130. package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
  131. package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
  132. package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
  133. package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
  134. package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
  135. package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
  136. package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
  137. package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
  138. package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
  139. package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
  140. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
  141. package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
  142. package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
  143. package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
  144. package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
  145. package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
  146. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
  147. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
  148. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
  149. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
  150. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
  151. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
  152. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
  153. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
  154. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
  155. package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
  156. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
  157. package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
  158. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  159. package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
  160. package/esm2022/app/reports/mark-click.mjs +193 -0
  161. package/esm2022/app/reports/option-builder.mjs +159 -15
  162. package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
  163. package/esm2022/app/reports/report-date-presets.mjs +18 -0
  164. package/esm2022/app/reports/report-filter-items.mjs +263 -72
  165. package/esm2022/app/reports/report-tile.mjs +12 -0
  166. package/esm2022/app/reports/report-view-config.mjs +587 -0
  167. package/esm2022/app/reports/report-view-menu.mjs +119 -0
  168. package/esm2022/app/reports/report-viewer-features.mjs +42 -0
  169. package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
  170. package/esm2022/app/reports/services/report-filter-state.service.mjs +668 -210
  171. package/esm2022/app/reports/services/report-view.service.mjs +218 -0
  172. package/esm2022/app/reports/tile-data-state.mjs +127 -0
  173. package/esm2022/app/reports/tile-loads.mjs +38 -0
  174. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +194 -127
  175. package/esm2022/app/reports/views/report/report.component.mjs +112 -29
  176. package/esm2022/public_api.mjs +23 -1
  177. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
  178. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
  179. package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +8222 -4447
  180. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
  181. package/fesm2022/firestitch-report.mjs +1 -1
  182. package/package.json +1 -1
  183. package/public_api.d.ts +22 -0
  184. package/app/reports/report-url-state.d.ts +0 -19
  185. package/esm2022/app/reports/report-url-state.mjs +0 -189
  186. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.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
@@ -208,6 +208,12 @@ export class ComponentListComponent {
208
208
  if (search) {
209
209
  state.search = search;
210
210
  }
211
+ // The groups that match 'any', as every other read of this tile sends
212
+ // them (tileDataState). The sort and paging above are FsList's own.
213
+ const { matchAnyGroupIds } = this._filterState.tileState(component);
214
+ if (matchAnyGroupIds) {
215
+ state.matchAnyGroupIds = matchAnyGroupIds;
216
+ }
211
217
  // One source for filter values, the same one charts, KPIs and the exports
212
218
  // read, so the list is filtered exactly as its header strip shows.
213
219
  const filters = this._filterState.resolveForComponent(component);
@@ -342,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
342
348
  ReportOutputPipe,
343
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"] }]
344
350
  }], ctorParameters: () => [] });
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLHFCQUFxQixHQUN0QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBcUIsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQUdwRiw4RUFBOEU7QUFDOUUsc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsdUVBQXVFO0FBQ3ZFLCtEQUErRDtBQUMvRCxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0Usa0RBQWtEO0FBaUJsRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpCLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDcEMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFFOUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVwRCxVQUFVLENBQWU7SUFFaEMsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxvQ0FBb0M7SUFDN0IsT0FBTyxHQUFHLE1BQU0sQ0FBd0MsRUFBRSxDQUFDLENBQUM7SUFFbkUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSwrQ0FBK0M7SUFDeEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQiw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLGdCQUFnQjtJQUNULFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFakMsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxRQUFRO0lBQ1EsVUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFekQsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUN4RCxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNDLDRFQUE0RTtJQUM1RSxxRUFBcUU7SUFDckQsTUFBTSxHQUFHLE1BQU0sQ0FBaUMsSUFBSSxDQUFDLENBQUM7SUFFdEQsVUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFekQsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckQsUUFBUSxHQUFHLE1BQU0sQ0FBMkIsSUFBSSxDQUFDLENBQUM7SUFFbEUsdUVBQXVFO0lBQ3ZFLDhDQUE4QztJQUM5QixRQUFRLEdBQUcsTUFBTSxDQUEwQyxJQUFJLENBQUMsQ0FBQztJQUVqRiwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLGtEQUFrRDtJQUNsQyxRQUFRLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsUUFBUSxDQUFDO0lBRXJFLG1FQUFtRTtJQUNuRSwwRUFBMEU7SUFDMUUsZ0RBQWdEO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFFL0Qsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7SUFFaEUseUVBQXlFO0lBQ3pELE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFcEUsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUU5Qyw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLHlCQUF5QjtJQUNULE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2RixVQUFVLEdBQUcsZ0JBQWdCLENBQUM7SUFFOUMsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUN4QixhQUFhLEdBQUcsUUFBUSxDQUFtQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FDaEcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZCxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFnQixDQUFDLE9BQU8sSUFBSSxFQUFFLENBQzlELENBQUMsQ0FBQztJQUVILHdFQUF3RTtJQUN4RSxVQUFVO0lBQ00sV0FBVyxHQUFHLFFBQVEsQ0FBeUIsR0FBRyxFQUFFO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFM0MsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7YUFDckMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQyxDQUFDLENBQUM7SUFFSCwwRUFBMEU7SUFDMUUsMkJBQTJCO0lBQ1gsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUN0RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3BFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDZCxDQUFDLENBQUM7SUFFSCw0RUFBNEU7SUFDNUUsc0VBQXNFO0lBQ3RFLDJCQUEyQjtJQUNYLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUUzQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xDLENBQUMsQ0FBQyxXQUFXLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNqRSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNwRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztJQUVLLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hELFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsV0FBVyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7SUFDMUQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixjQUFjLEdBQTBCLElBQUksQ0FBQztJQUVyRDtRQUNFLGdFQUFnRTtRQUNoRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sUUFBUTtRQUNiLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFlLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsMkVBQTJFO1FBQzNFLG1EQUFtRDtRQUNuRCw0RUFBNEU7UUFDNUUsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzlGLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQ3pDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQWtCO1FBQ3hDLHlFQUF5RTtRQUN6RSxvRUFBb0U7UUFDcEUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSxNQUFNLElBQUksR0FBMkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztlQUMvRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixzRUFBc0U7WUFDdEUsMERBQTBEO1lBQzFELE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLEtBQUs7WUFDYix1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLDBCQUEwQjtZQUMxQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxJQUFJO2dCQUNSLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssRUFBRTtnQkFDNUQsQ0FBQyxDQUFDLFNBQVM7WUFDYix1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLHNEQUFzRDtZQUN0RCxFQUFFO1lBQ0YsaUVBQWlFO1lBQ2pFLHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSx1RUFBdUU7WUFDdkUsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUU7Z0JBQzVCLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO2FBQ3BDO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxXQUFXO2dCQUNsQixVQUFVLEVBQUUsU0FBUzthQUN0QjtZQUNELEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBVTtRQUN2QiwyRUFBMkU7UUFDM0UsMEVBQTBFO1FBQzFFLG1CQUFtQjtRQUNuQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSTtlQUNsQixDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSxNQUFNLEtBQUssR0FBdUI7WUFDaEMsSUFBSTtZQUNKLFFBQVE7U0FDVCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVFLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7UUFFN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN4QixDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLG1FQUFtRTtRQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sSUFBSSxDQUFDLFdBQVc7YUFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7YUFDNUQsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUMxQixvRUFBb0U7WUFDcEUsc0VBQXNFO1lBQ3RFLDhDQUE4QztZQUM5QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUVELGlFQUFpRTtZQUNqRSwyQkFBMkI7WUFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLCtDQUErQztZQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ3JELE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztZQUVqRSxxRUFBcUU7WUFDckUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFM0IsT0FBTztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUNyQixNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRO29CQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7b0JBQ3ZELElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSTtpQkFDdEM7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSwrQ0FBK0M7SUFDdkMsYUFBYSxDQUFDLElBQW1CO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQWUsQ0FBQztRQUM3RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUMvQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFDM0QsSUFBSSxFQUNKLEVBQUUsQ0FDSCxDQUFDLENBQUM7UUFFSCxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUMvRCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQW1CO1FBQ25DLE9BQU87WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDOUQsbUJBQW1CLENBQUMsSUFBbUI7UUFDN0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2QyxHQUFHLE1BQU07WUFDVCxPQUFPLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLCtDQUErQztJQUN2QyxrQkFBa0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9ELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUN0RSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ2hFLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsNkRBQTZEO0lBQ3JELGlCQUFpQjtRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFFYixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBYyx1QkFBdUIsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUUvRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxxQkFBcUIsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUVsRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBRUQsSUFBSSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQzt3R0F0WFUsc0JBQXNCOzRGQUF0QixzQkFBc0IsbVpBS1MsZUFBZSxnRUN0RjNELCs1SUFxSEEsc2dFRDdDSSxzQkFBc0IsdUlBQ3RCLFlBQVksK3lCQUNaLFVBQVUsaVJBQ1YsZ0JBQWdCLCtJQUNoQixjQUFjLGdEQUNkLGdCQUFnQixrREFDaEIsZ0JBQWdCOzs0RkFHUCxzQkFBc0I7a0JBaEJsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1Asc0JBQXNCO3dCQUN0QixZQUFZO3dCQUNaLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3FCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJSZW5kZXJSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBPbkluaXQsXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnLCBGc0xpc3RNb2R1bGUsIFBhZ2luYXRpb25TdHJhdGVneSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xpc3QnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIG1lcmdlLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC1saXN0LWNvbHVtbi1mb3JtYXQuZW51bSc7XG5pbXBvcnQgeyBmb3JtYXRQbGFpbk51bWJlciwgaGFzTnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRTb3J0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgTElTVF9UT1RBTF9MQUJFTCxcbiAgTGlzdE91dHB1dENvbHVtbixcbiAgY29sdW1uQ2xhc3NlcyxcbiAgbGlzdE91dHB1dENvbHVtbnMsXG4gIGxpc3RQaW5uZWRDb2x1bW5zLFxuICBsaXN0U29ydFRlcm1zLFxuICBsaXN0VG90YWxzTGFiZWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IHBpdm90Q29sdW1uU3BlY3MgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlRGF0YSwgb3V0cHV0Q29sdW1uTm90ZSB9IGZyb20gJy4uLy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBSZXBvcnREYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1kYXRlLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0TnVtYmVyUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1udW1iZXIucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnRPdXRwdXRQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW91dHB1dC5waXBlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuXG4vLyBBIGxpc3QgY29tcG9uZW50OiBhbiBGc0xpc3QgcmVuZGVyZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY29uZmlnLiBJdCBoYXMgbm9cbi8vIGZpbHRlciBiYXIgb2YgaXRzIG93bjogaXRzIGZpbHRlcnMgYXJlIGdyb3VwLWtleWVkIGxpa2UgZXZlcnkgb3RoZXJcbi8vIGNvbXBvbmVudCdzLCBzbyBjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcFxuLy8gKFJlcG9ydENvbXBvbmVudENvbXBvbmVudCkgYW5kIHJlcG9ydC1sZXZlbCBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIsIGFuZFxuLy8gZXZlcnkgcmVxdWVzdCB0YWtlcyBpdHMgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBmaWx0ZXItc3RhdGUgc2VydmljZS5cbi8vIFBhZ2luZyBhbmQgc29ydGluZyBhcmUgcHVzaGVkIGludG8gdGhlIFNRTCB3cmFwIHNlcnZlci1zaWRlLlxuLy9cbi8vIEEgbGlzdCB3aG9zZSBxdWVyeSBjb21wYXJlcywgd2luZG93cywgcmFua3Mgb3Igc2hhcmVzIHNheXMgc286IHRoZSBzaGFyZWRcbi8vIG5vdGUgYWJvdmUgaXQgbmFtZXMgdGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBlYWNoIHN1Y2ggY29sdW1uJ3Ncbi8vIGhlYWRlciB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcywgYW5kIGl0cyBjZWxscyAodG90YWxzIGluY2x1ZGVkLCB3aGljaCB0aGVcbi8vIHNlcnZlciBjb21wdXRlcykgYXJlIHdyaXR0ZW4gYnkgd2hhdCB0aGV5IGhvbGQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIEZzTGlzdE1vZHVsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgUmVwb3J0RGF0ZVBpcGUsXG4gICAgUmVwb3J0TnVtYmVyUGlwZSxcbiAgICBSZXBvcnRPdXRwdXRQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RDb21wb25lbnQgPSB2aWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KTtcblxuICBwdWJsaWMgbGlzdENvbmZpZzogRnNMaXN0Q29uZmlnO1xuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGF1dGhvcmVkIGFuZCBmaXhlZCBhdCBpbml0LiBBIGNyb3NzLXRhYidzIGFyZVxuICAvLyB0aGUgcGl2b3QgZGltZW5zaW9uJ3MgVkFMVUVTLCBzbyB0aGV5IGFycml2ZSB3aXRoIHRoZSByb3dzIGFuZCBjaGFuZ2VcbiAgLy8gd2hlbmV2ZXIgdGhlIGZpbHRlcnMgZG8g4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIGEgc2lnbmFsIHJhdGhlciB0aGFuIHRoZVxuICAvLyBvbmUtc2hvdCByZWFkIGl0IHVzZWQgdG8gYmUuIGBudW1lcmljYCBtYXJrcyBhIGNvbHVtbiB3aG9zZSBjZWxscyBhcmVcbiAgLy8gZm9ybWF0dGVkIG51bWJlcnMsIGRlY2lkZWQgb25jZSBoZXJlIHJhdGhlciB0aGFuIHBlciBjZWxsLCBzbyB0aGUgY29sdW1uXG4gIC8vIGFuZCBpdHMgaGVhZGVyIGFyZSByaWdodC1hbGlnbmVkLlxuICBwdWJsaWMgY29sdW1ucyA9IHNpZ25hbDwoTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbiB9KVtdPihbXSk7XG5cbiAgLy8gQSBjcm9zcy10YWIgc29ydHMgb25seSBieSBpdHMgcm93LWtleSBjb2x1bW46IGV2ZXJ5IG90aGVyIGhlYWRlciBpcyBhXG4gIC8vIHBpdm90IHZhbHVlLCBhbmQgdGhlIHNlcnZlciBvcmRlcnMgdGhlIGxvbmcgcm93cyBiZWZvcmUgcGl2b3RpbmcsIHNvIGFcbiAgLy8gY2xpY2sgb24gXCJNYXIgMjAyNlwiIGhhcyBub3RoaW5nIHRvIG9yZGVyIGJ5LlxuICBwdWJsaWMgcGl2b3RlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gQSBjdXQgcmVzdWx0IGlzIHdvcnNlIGZvciBhIGdyaWQgdGhhbiBmb3IgYSBsaXN0OiB0aGUgY3V0IGxhbmRzIG9uIHRoZSBMT05HXG4gIC8vIHJvd3MgYmVmb3JlIHRoZSByZXNoYXBlLCBzbyBhIHBpdm90IHZhbHVlIGxpdmluZyBvbmx5IGluIHRoZSB0YWlsIHZhbmlzaGVzXG4gIC8vIGFzIGEgd2hvbGUgQ09MVU1OIGFuZCBzdHJhZGRsZWQgY2VsbHMgY29tZSBiYWNrIGJsYW5rLCBpbmRpc3Rpbmd1aXNoYWJsZVxuICAvLyBmcm9tIGEgcmVhbCB6ZXJvLiBUaGUgcGFyZW50J3MgdHJ1bmNhdGlvbiBiYW5uZXIgbmV2ZXIgZmlyZXMgZm9yIGEgbGlzdFxuICAvLyAoaXQgb25seSByZW5kZXJzIHdoYXQgX2xvYWQoKSBmZXRjaGVkLCB3aGljaCBsaXN0cyBza2lwKSwgc28gdGhlIHdhcm5pbmdcbiAgLy8gYmVsb25ncyBoZXJlLlxuICBwdWJsaWMgdHJ1bmNhdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBXaHkgdGhlIHNlYXJjaCBib3ggZGlkIG5vdCBuYXJyb3cgdGhlIHJvd3MgKHRoZSBsaXN0IGhhcyBubyB0ZXh0IGNvbHVtbiB0b1xuICAvLyBzZWFyY2gpLCBmcm9tIHRoZSBsYXRlc3QgcGFnZSAxOyBudWxsIHdoZW4gdGhlIHNlYXJjaCBhcHBsaWVkIG9yIG5vbmUgd2FzXG4gIC8vIG1hZGUuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIGNvbmZpZy50b3RhbHMsIHJlYWQgb25jZSBhdCBpbml0OiBhIGxpc3Qgd2l0aCB0b3RhbHMgcmVuZGVycyBpdHMgY29sdW1uc1xuICAvLyB3aXRoIGEgZm9vdGVyIHRlbXBsYXRlLCB3aGljaCBmcy1saXN0IHJlYWRzIG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlbS5cbiAgcHVibGljIHJlYWRvbmx5IHNob3dUb3RhbHMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSB0b3RhbHMgcm93IGZyb20gdGhlIGxhdGVzdCBwYWdlIDEsIHJhdyB2YWx1ZXMga2V5ZWQgbGlrZSB0aGUgY29sdW1ucztcbiAgLy8gbnVsbCB3aGVuIHRoZSBsaXN0IGhhcyBub25lLCBvciB0aGUgc2VydmVyIHNheXMgd2h5IGluIHRvdGFsc05vdGUuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxzTm90ZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgbGF0ZXN0IHBhZ2UgMSdzIGNvbXBhcmlzb24gd2luZG93cywgdGltZWZyYW1lIGFuZCBvdXRwdXQgbWV0YWRhdGEsIGZvclxuICAvLyB0aGUgbm90ZSBhYm92ZSB0aGUgbGlzdCwgdGhlIGhlYWRlciB0b29sdGlwcyBhbmQgdGhlIG91dHB1dCBjZWxsczsgbnVsbFxuICAvLyB1bnRpbCBpdCBhcnJpdmVzLCBhbmQgZW1wdHkgb2YgZXZlcnkga2V5IGZvciBhIGxpc3QgdGhhdCBoYXMgbm9uZS5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGVEYXRhID0gc2lnbmFsPENvbXBvbmVudE5vdGVEYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gSG93IG1hbnkgcm93cyB0aGUgbGlzdCBzaG93cyAobG9hZCBtb3JlIGFwcGVuZHMpIG91dCBvZiBob3cgbWFueSBpdHNcbiAgLy8gZmlsdGVycyBrZWVwLiBBIGNyb3NzLXRhYiBjb3VudHMgZ3JpZCByb3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgcm93Q291bnQgPSBzaWduYWw8eyBzaG93bjogbnVtYmVyOyB0b3RhbDogbnVtYmVyIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUsIHdoaWNoIGRhdGUgY2VsbHMgcmVuZGVyIGluLiBJbmplY3RlZCByaWdodFxuICAvLyBoZXJlIHJhdGhlciB0aGFuIHJlYWQgb2ZmIF9maWx0ZXJTdGF0ZSwgd2hpY2ggaXMgZGVjbGFyZWQgZnVydGhlciBkb3duIGFuZFxuICAvLyBpcyBzdGlsbCB1bmRlZmluZWQgd2hpbGUgdGhpcyBpbml0aWFsaXplciBydW5zLlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKS50aW1lem9uZTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBmb3JtYXQgY29udGV4dDogZGF0ZSBjZWxscywgbnVtYmVyIGNlbGxzIGFuZCBhXG4gIC8vIGNyb3NzLXRhYidzIHBlcmlvZCBoZWFkaW5ncyBhcmUgd3JpdHRlbiBpbiBpdHMgbG9jYWxlIChhbmQgbW9uZXkgaW4gaXRzXG4gIC8vIGN1cnJlbmN5KS4gSW5qZWN0ZWQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Q29udGV4dCA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLmZvcm1hdENvbnRleHQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgPSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0O1xuXG4gIC8vIEhvdyBtYW55IGxlYWRpbmcgY29sdW1ucyBzdGF5IGluIHZpZXcgd2hpbGUgdGhlIGxpc3Qgc2Nyb2xscyBzaWRld2F5cy5cbiAgcHVibGljIHJlYWRvbmx5IHBpbm5lZCA9IGNvbXB1dGVkKCgpID0+IGxpc3RQaW5uZWRDb2x1bW5zKHRoaXMuY29tcG9uZW50KCkuY29uZmlnKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbkNsYXNzZXMgPSBjb2x1bW5DbGFzc2VzO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyB0aGUgdmlld2VyIGhpZCBvbiB0aGlzIGxpc3QgKHRoZSBDb2x1bW5zIGRpYWxvZywgb3IgdGhlXG4gIC8vIFVSTCkuIGZzLWxpc3QgaGlkZXMgYW5kIHNob3dzIHRoZW0gaW4gcGxhY2UgdGhyb3VnaCBbc2hvd10sIHNvIHRoZSByb3dzXG4gIC8vIGFscmVhZHkgZmV0Y2hlZCBzdGFuZC5cbiAgcHVibGljIHJlYWRvbmx5IGhpZGRlbiA9IGNvbXB1dGVkKCgpID0+IG5ldyBTZXQodGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyh0aGlzLmNvbXBvbmVudCgpLmlkKSkpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbExhYmVsID0gTElTVF9UT1RBTF9MQUJFTDtcblxuICAvLyBUaGUgY29sdW1ucyB0aGF0IGhvbGQgYSBjb21wYXJlZCwgd2luZG93ZWQsIHJhbmtlZCBvciBzaGFyZWQgb3V0cHV0LCBieVxuICAvLyBuYW1lOyB0aGUgcmVzdCBhcmUgd3JpdHRlbiBhcyBiZWZvcmUuXG4gIHB1YmxpYyByZWFkb25seSBvdXRwdXRDb2x1bW5zID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgTGlzdE91dHB1dENvbHVtbj4+KCgpID0+IGxpc3RPdXRwdXRDb2x1bW5zKFxuICAgIHRoaXMuY29sdW1ucygpLFxuICAgIHRoaXMubm90ZURhdGEoKSxcbiAgICAoKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnKS5jb2x1bW5zID8/IFtdLFxuICApKTtcblxuICAvLyBFYWNoIGNvbHVtbidzIGhlYWRlciB0b29sdGlwOiB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgKCcnIGZvciBhbnlcbiAgLy8gb3RoZXIpLlxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uTm90ZXMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmNvbHVtbnMoKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBbY29sdW1uLmNvbHVtbiwgb3V0cHV0Q29sdW1uTm90ZShjb2x1bW4uY29sdW1uLCB0aGlzLm5vdGVEYXRhKCksIGxvY2FsZSldKSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBjb2x1bW4gd2hvc2UgZm9vdGVyIGNlbGwgcmVhZHMgJ1RvdGFsJzogdGhlIGZpcnN0IG9uZSBzaG93biwgdW5sZXNzXG4gIC8vIGl0IGhvbGRzIGEgdG90YWwgaXRzZWxmLlxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxzTGFiZWxDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiBsaXN0VG90YWxzTGFiZWxDb2x1bW4oXG4gICAgdGhpcy5jb2x1bW5zKCkuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKSksXG4gICAgdGhpcy50b3RhbHMoKSxcbiAgKSk7XG5cbiAgLy8gVGhlIGxpbmUgdW5kZXIgdGhlIGxpc3Q6IGl0cyByb3cgY291bnQsIHRoZW4gd2h5IGl0IGhhcyBubyB0b3RhbHMgYW5kIHdoeVxuICAvLyBpdHMgc2VhcmNoIG5hcnJvd2VkIG5vdGhpbmcuIFRoZSBkaWdpdHMgYXJlIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzXG4gIC8vIGxvY2FsZSwgbmV2ZXIgdGhlIGFwcCdzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2FwdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucm93Q291bnQoKTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gZm9ybWF0UGxhaW5OdW1iZXIoY291bnQudG90YWwsIGxvY2FsZSk7XG4gICAgICBwYXJ0cy5wdXNoKGNvdW50LnNob3duIDwgY291bnQudG90YWxcbiAgICAgICAgPyBgU2hvd2luZyAke2Zvcm1hdFBsYWluTnVtYmVyKGNvdW50LnNob3duLCBsb2NhbGUpfSBvZiAke3RvdGFsfWBcbiAgICAgICAgOiBgJHt0b3RhbH0gcm93KHMpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5wYXJ0cywgdGhpcy50b3RhbHNOb3RlKCksIHRoaXMuc2VhcmNoTm90ZSgpXVxuICAgICAgLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+ICEhcGFydClcbiAgICAgIC5qb2luKCcgwrcgJyk7XG4gIH0pO1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgX3Bpbk9mZnNldHNSZWY6IEFmdGVyUmVuZGVyUmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSGlkaW5nIG9yIHNob3dpbmcgYSBjb2x1bW4gbW92ZXMgdGhlIHBpbm5lZCBjb2x1bW5zIGFmdGVyIGl0LlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGRlbigpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IChjb21wb25lbnQuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIHRoaXMucGl2b3RlZC5zZXQoISFjb25maWcucGl2b3RCeT8uY29sdW1uKTtcbiAgICB0aGlzLnNob3dUb3RhbHMuc2V0KGNvbmZpZy50b3RhbHMgPT09IHRydWUpO1xuICAgIHRoaXMuY29sdW1ucy5zZXQoKGNvbmZpZy5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB9KSkpO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9vYnNlcnZlUGluT2Zmc2V0cygpO1xuXG4gICAgLy8gQSBjaGFuZ2UgdG8gYW55IGdyb3VwIHRoaXMgbGlzdCdzIGZpbHRlcnMgYmVsb25nIHRvIChmcm9tIHRoZSByZXBvcnQgYmFyXG4gICAgLy8gb3IgdGhlIGNvbXBvbmVudCBoZWFkZXIgc3RyaXApIHJlLXJ1bnMgdGhlIGxpc3QuXG4gICAgLy8gU28gZG9lcyBhIGNoYW5nZSBvZiB0aGUgdGV4dCBpbiBpdHMgc2VhcmNoIGJveCAoaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIpLlxuICAgIG1lcmdlKHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IoY29tcG9uZW50KSwgdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50LmlkKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5saXN0Q29tcG9uZW50KCk/LnJlbG9hZCgpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdExpc3RDb25maWcoY29uZmlnOiBMaXN0Q29uZmlnKTogdm9pZCB7XG4gICAgLy8gVGhlIHZpZXdlcidzIGxhc3Qgc29ydCB3aW5zIG92ZXIgdGhlIGF1dGhvcmVkIG9uZSwgc28gYSBsaXN0IHJlY3JlYXRlZFxuICAgIC8vIGluIHRoZSBzYW1lIHNlc3Npb24gKHBhZ2Ugc3dpdGNoLCByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkga2VlcHMgaXQuXG4gICAgLy8gZnMtbGlzdCBob2xkcyBvbmUgc29ydGluZyBjb2x1bW4sIHNvIGl0IHNob3dzIHRoZSBhdXRob3JlZCBzb3J0J3MgZmlyc3RcbiAgICAvLyB0ZXJtOyB0aGUgcmVxdWVzdCBzZW5kcyBvbmx5IHRoYXQgdGVybSBhbmQgdGhlIHNlcnZlciBhcHBlbmRzIHRoZSByZXN0LlxuICAgIGNvbnN0IHNvcnQ6IFJlcG9ydFNvcnQgfCB1bmRlZmluZWQgPSB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydCh0aGlzLmNvbXBvbmVudCgpLmlkKVxuICAgICAgPz8gbGlzdFNvcnRUZXJtcyhjb25maWcpWzBdO1xuXG4gICAgdGhpcy5saXN0Q29uZmlnID0ge1xuICAgICAgLy8gSW5zaWRlIGEgcmVwb3J0IGNvbXBvbmVudCB0aGUgbGlzdCBpcyBhIGNsZWFuIGRhdGEgcGFuZSDigJQgbm8gc3RhdHVzXG4gICAgICAvLyBiYXIsIG5vIHJlbG9hZCBidXR0b24gKGZpbHRlciBjaGFuZ2VzIGFscmVhZHkgcmVmZXRjaCkuXG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcmVsb2FkOiBmYWxzZSxcbiAgICAgIC8vIEZzTGlzdCBuZXZlciB0b3VjaGVzIHRoZSBVUkwgb3IgcGVyc2lzdHMgc29ydC9wYWdpbmcgc3RhdGUuIFRoZSBzb3J0XG4gICAgICAvLyByZWFjaGVzIHRoZSBVUkwgdGhyb3VnaCBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgKHNldExpc3RTb3J0KSwgYW5kXG4gICAgICAvLyBwYWdpbmcgc3RheXMgb3V0IG9mIGl0LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICAgICAgPyB7IHZhbHVlOiBzb3J0LmNvbHVtbiwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPHsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgcGFnaW5nOiBhbnkgfT4ge1xuICAgIC8vIE1hbnkvbG9hZC1tb3JlIHNlbmRzIGBvZmZzZXRgICsgYGxpbWl0YCAobm90IGBwYWdlYCk7IGRlcml2ZSB0aGUgcGFnZSBzb1xuICAgIC8vIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkLiBQYWdlIHN0cmF0ZWd5IHN0aWxsIHNlbmRzXG4gICAgLy8gYHBhZ2VgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHBhZ2VTaXplID0gcXVlcnkubGltaXQgPz8gMjU7XG4gICAgY29uc3QgcGFnZSA9IHF1ZXJ5LnBhZ2VcbiAgICAgID8/IChxdWVyeS5vZmZzZXQgIT0gbnVsbCA/IE1hdGguZmxvb3IocXVlcnkub2Zmc2V0IC8gcGFnZVNpemUpICsgMSA6IDEpO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHtcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JkZXIgPSBTdHJpbmcocXVlcnkub3JkZXIgPz8gJycpO1xuICAgIGlmIChvcmRlcikge1xuICAgICAgY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSA9IG9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICBzdGF0ZS5zb3J0ID0geyBjb2x1bW4sIGRpcmVjdGlvbjogZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNvcnQoY29tcG9uZW50LCBzdGF0ZS5zb3J0ID8/IG51bGwpO1xuXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaChjb21wb25lbnQuaWQpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBPbmUgc291cmNlIGZvciBmaWx0ZXIgdmFsdWVzLCB0aGUgc2FtZSBvbmUgY2hhcnRzLCBLUElzIGFuZCB0aGUgZXhwb3J0c1xuICAgIC8vIHJlYWQsIHNvIHRoZSBsaXN0IGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgaXRzIGhlYWRlciBzdHJpcCBzaG93cy5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGFcbiAgICAgIC5jb21wb25lbnREYXRhKHRoaXMucmVwb3J0SWQoKSwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+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==
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==