bways-report 0.1.2 → 0.1.4

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 (107) hide show
  1. package/README.md +150 -51
  2. package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
  3. package/esm2022/lib/core/index.mjs +3 -1
  4. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  5. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  7. package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
  10. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
  11. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
  12. package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
  13. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
  14. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
  15. package/esm2022/lib/data-access/adapters/index.mjs +8 -3
  16. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
  17. package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
  18. package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
  19. package/esm2022/lib/data-access/contracts/index.mjs +2 -1
  20. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +24 -3
  21. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +572 -102
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +225 -25
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +568 -12
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +238 -11
  26. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +191 -25
  27. package/esm2022/lib/features/designer/designer.component.mjs +245 -27
  28. package/esm2022/lib/features/designer/index.mjs +4 -1
  29. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  30. package/esm2022/lib/features/designer/services/designer-state.service.mjs +18 -10
  31. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  32. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  33. package/esm2022/lib/features/export/index.mjs +2 -2
  34. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  35. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  36. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  37. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +239 -33
  38. package/esm2022/lib/features/runtime/index.mjs +2 -1
  39. package/esm2022/lib/features/runtime/report-execution.service.mjs +56 -0
  40. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +423 -30
  41. package/esm2022/lib/features/runtime/report-runtime.component.mjs +349 -7
  42. package/esm2022/lib/features/runtime/rpt-report.component.mjs +545 -0
  43. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
  44. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  45. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
  46. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
  47. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  48. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +728 -74
  49. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +30 -1
  50. package/esm2022/lib/primitives/components/index.mjs +2 -1
  51. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
  52. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
  53. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
  54. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  55. package/esm2022/lib/provide-reporting.mjs +145 -24
  56. package/fesm2022/bways-report.mjs +7797 -921
  57. package/fesm2022/bways-report.mjs.map +1 -1
  58. package/lib/core/index.d.ts +2 -0
  59. package/lib/core/models/report-datasource.model.d.ts +9 -0
  60. package/lib/core/models/report-definition.model.d.ts +2 -0
  61. package/lib/core/models/report-grid.model.d.ts +67 -1
  62. package/lib/core/services/report-session-context.service.d.ts +6 -1
  63. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  64. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  65. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  66. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  67. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  68. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  69. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -2
  71. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  72. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  73. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  74. package/lib/data-access/contracts/index.d.ts +1 -0
  75. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
  76. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
  77. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  78. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  79. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +13 -0
  80. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
  81. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +9 -1
  82. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +12 -1
  83. package/lib/features/designer/designer.component.d.ts +11 -0
  84. package/lib/features/designer/index.d.ts +4 -0
  85. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  86. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  87. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  88. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  89. package/lib/features/export/index.d.ts +2 -2
  90. package/lib/features/export/models/export.models.d.ts +23 -0
  91. package/lib/features/export/services/report-export.service.d.ts +31 -2
  92. package/lib/features/runtime/dynamic-renderer.component.d.ts +42 -2
  93. package/lib/features/runtime/index.d.ts +2 -0
  94. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  95. package/lib/features/runtime/report-grid-bridge.component.d.ts +171 -6
  96. package/lib/features/runtime/report-runtime.component.d.ts +86 -1
  97. package/lib/features/runtime/rpt-report.component.d.ts +69 -0
  98. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  99. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  100. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  101. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  102. package/lib/primitives/components/index.d.ts +2 -0
  103. package/lib/provide-reporting.d.ts +79 -26
  104. package/package.json +2 -1
  105. package/schematics/collection.json +10 -0
  106. package/schematics/ng-add/index.js +45 -0
  107. package/schematics/ng-add/schema.json +17 -0
@@ -0,0 +1,545 @@
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal, viewChild, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ReportExportService } from '../export/services/report-export.service';
5
+ import { ReportRuntimeComponent } from './report-runtime.component';
6
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
7
+ import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ export class RptReportComponent {
11
+ exportService = inject(ReportExportService);
12
+ persistence = inject(ReportPersistenceAdapter, { optional: true });
13
+ id = input(undefined);
14
+ report = input(null);
15
+ parameters = input({});
16
+ showExport = input(true);
17
+ enablePresets = input(true);
18
+ autoExecute = input(true);
19
+ rowClick = output();
20
+ dataLoaded = output();
21
+ gridStateChange = output();
22
+ selectionChange = output();
23
+ selectionChanged = output();
24
+ presetSaved = output();
25
+ presetChange = output();
26
+ exportRequested = output();
27
+ printRequested = output();
28
+ runtimeComponent = viewChild(ReportRuntimeComponent);
29
+ // Preset states
30
+ activePresetId = signal('default');
31
+ isSavePresetModalOpen = signal(false);
32
+ newPresetName = signal('');
33
+ latestGridState = signal(null);
34
+ customPresets = signal([]);
35
+ currentDefinition = computed(() => {
36
+ return this.report();
37
+ });
38
+ activeDefinition = computed(() => {
39
+ return this.report() ?? this.runtimeComponent()?.currentDefinition() ?? null;
40
+ });
41
+ recordCount = computed(() => {
42
+ return this.runtimeComponent()?.resultData()?.length ?? 0;
43
+ });
44
+ showToolbar = computed(() => {
45
+ return this.showExport() || this.enablePresets();
46
+ });
47
+ savedPresets = computed(() => {
48
+ const def = this.activeDefinition();
49
+ const initialPresets = def?.grid?.options?.presets ?? [];
50
+ const map = new Map();
51
+ for (const p of initialPresets) {
52
+ if (p && p.id)
53
+ map.set(p.id, p);
54
+ }
55
+ for (const p of this.customPresets()) {
56
+ if (p && p.id)
57
+ map.set(p.id, p);
58
+ }
59
+ return Array.from(map.values());
60
+ });
61
+ onRowActionTriggered(event) {
62
+ this.rowClick.emit({
63
+ row: event.row,
64
+ parameters: event.parameters,
65
+ action: event.action,
66
+ });
67
+ }
68
+ onGridStateChanged(state) {
69
+ this.latestGridState.set(state);
70
+ this.gridStateChange.emit(state);
71
+ }
72
+ onSelectionChange(rows) {
73
+ this.selectionChange.emit(rows);
74
+ this.selectionChanged.emit(rows);
75
+ }
76
+ onSelectPreset(presetId) {
77
+ this.activePresetId.set(presetId);
78
+ if (presetId === 'default') {
79
+ this.presetChange.emit(null);
80
+ return;
81
+ }
82
+ const preset = this.savedPresets().find((p) => p.id === presetId);
83
+ if (preset) {
84
+ if (preset.gridState) {
85
+ this.latestGridState.set(preset.gridState);
86
+ this.gridStateChange.emit(preset.gridState);
87
+ }
88
+ this.presetChange.emit(preset);
89
+ }
90
+ }
91
+ confirmSavePreset() {
92
+ this.saveCurrentPreset();
93
+ }
94
+ exportExcel() {
95
+ this.onExportExcel();
96
+ }
97
+ exportCsv() {
98
+ this.onExportCsv();
99
+ }
100
+ print() {
101
+ this.onPrintReport();
102
+ }
103
+ openSavePresetModal() {
104
+ this.newPresetName.set('');
105
+ this.isSavePresetModalOpen.set(true);
106
+ }
107
+ closeSavePresetModal() {
108
+ this.isSavePresetModalOpen.set(false);
109
+ }
110
+ saveCurrentPreset() {
111
+ const name = this.newPresetName().trim();
112
+ if (!name)
113
+ return;
114
+ const presetId = `preset_${Date.now()}`;
115
+ const newPreset = {
116
+ id: presetId,
117
+ name,
118
+ gridState: this.latestGridState() ?? {},
119
+ createdAt: new Date().toISOString(),
120
+ };
121
+ const def = this.activeDefinition();
122
+ if (def && def.grid) {
123
+ if (!def.grid.options)
124
+ def.grid.options = {};
125
+ const currentPresets = def.grid.options.presets ?? [];
126
+ def.grid.options.presets = [...currentPresets, newPreset];
127
+ if (this.persistence && def.id) {
128
+ this.persistence.save(def).subscribe({
129
+ next: () => { },
130
+ error: () => { },
131
+ });
132
+ }
133
+ }
134
+ this.customPresets.update((prev) => [...prev, newPreset]);
135
+ this.activePresetId.set(presetId);
136
+ this.presetSaved.emit({ name, preset: newPreset });
137
+ this.closeSavePresetModal();
138
+ }
139
+ deletePreset(presetId) {
140
+ if (presetId === 'default')
141
+ return;
142
+ this.customPresets.update((prev) => prev.filter((p) => p.id !== presetId));
143
+ const def = this.activeDefinition();
144
+ if (def && def.grid && def.grid.options) {
145
+ const current = def.grid.options.presets ?? [];
146
+ def.grid.options.presets = current.filter((p) => p.id !== presetId);
147
+ if (this.persistence && def.id) {
148
+ this.persistence.save(def).subscribe({
149
+ next: () => { },
150
+ error: () => { },
151
+ });
152
+ }
153
+ }
154
+ if (this.activePresetId() === presetId) {
155
+ this.onSelectPreset('default');
156
+ }
157
+ }
158
+ onExportExcel() {
159
+ const data = this.runtimeComponent()?.resultData();
160
+ if (!data || !Array.isArray(data) || data.length === 0)
161
+ return;
162
+ const def = this.activeDefinition();
163
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
164
+ this.exportService.exportExcel(data, {
165
+ fileName: def?.name ? `${def.name}.xls` : 'report.xls',
166
+ columns: cols,
167
+ brandedHeader: { reportTitle: def?.name },
168
+ });
169
+ }
170
+ onExportCsv() {
171
+ const data = this.runtimeComponent()?.resultData();
172
+ if (!data || !Array.isArray(data) || data.length === 0)
173
+ return;
174
+ const def = this.activeDefinition();
175
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
176
+ this.exportService.exportCsv(data, {
177
+ fileName: def?.name ? `${def.name}.csv` : 'report.csv',
178
+ columns: cols,
179
+ brandedHeader: { reportTitle: def?.name },
180
+ });
181
+ }
182
+ onPrintReport() {
183
+ const data = this.runtimeComponent()?.resultData();
184
+ if (!data || !Array.isArray(data) || data.length === 0)
185
+ return;
186
+ const def = this.activeDefinition();
187
+ const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
188
+ this.exportService.printReport(data, {
189
+ title: def?.name || 'Report Print Preview',
190
+ columns: cols,
191
+ brandedHeader: { reportTitle: def?.name },
192
+ });
193
+ }
194
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
195
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", selectionChange: "selectionChange", selectionChanged: "selectionChanged", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
196
+ <div class="rpt-facade-container">
197
+ <!-- Top Action & Preset Bar -->
198
+ @if (showToolbar()) {
199
+ <div class="rpt-facade-toolbar">
200
+ <div class="rpt-toolbar-left">
201
+ @if (activeDefinition()?.name) {
202
+ <div class="rpt-report-title-badge">
203
+ <span class="rpt-title-dot"></span>
204
+ <span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
205
+ </div>
206
+ }
207
+
208
+ @if (recordCount() > 0) {
209
+ <span class="rpt-record-count-chip" title="Current dataset size">
210
+ <span class="rpt-chip-dot"></span>
211
+ <span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
212
+ </span>
213
+ }
214
+
215
+ <!-- Saved Views / Preset Switcher -->
216
+ @if (enablePresets()) {
217
+ <div class="rpt-preset-control">
218
+ <label class="rpt-preset-label">
219
+ <rpt-icon name="bookmark" [size]="12" />
220
+ <span>View:</span>
221
+ </label>
222
+ <select
223
+ class="rpt-preset-select"
224
+ [ngModel]="activePresetId()"
225
+ (ngModelChange)="onSelectPreset($event)"
226
+ aria-label="Select report view preset"
227
+ >
228
+ <option value="default">Default View</option>
229
+ @for (preset of savedPresets(); track preset.id) {
230
+ <option [value]="preset.id">{{ preset.name }}</option>
231
+ }
232
+ </select>
233
+ <button
234
+ type="button"
235
+ class="rpt-btn-save-view"
236
+ (click)="openSavePresetModal()"
237
+ title="Save current grid view or manage presets"
238
+ >
239
+ <rpt-icon name="plus" [size]="11" />
240
+ <span>Save View</span>
241
+ </button>
242
+ </div>
243
+ }
244
+ </div>
245
+
246
+ <!-- Export Actions -->
247
+ @if (showExport()) {
248
+ <div class="rpt-toolbar-right">
249
+ <button
250
+ type="button"
251
+ class="rpt-export-btn rpt-export-excel"
252
+ (click)="onExportExcel()"
253
+ [disabled]="!recordCount()"
254
+ title="Export result table to Excel spreadsheet (.xls)"
255
+ >
256
+ <rpt-icon name="file-text" [size]="13" />
257
+ <span>Excel</span>
258
+ </button>
259
+ <button
260
+ type="button"
261
+ class="rpt-export-btn rpt-export-csv"
262
+ (click)="onExportCsv()"
263
+ [disabled]="!recordCount()"
264
+ title="Export result table to CSV file"
265
+ >
266
+ <rpt-icon name="download" [size]="13" />
267
+ <span>CSV</span>
268
+ </button>
269
+ <button
270
+ type="button"
271
+ class="rpt-export-btn rpt-export-print"
272
+ (click)="onPrintReport()"
273
+ [disabled]="!recordCount()"
274
+ title="Print report with branded layout"
275
+ >
276
+ <rpt-icon name="printer" [size]="13" />
277
+ <span>Print</span>
278
+ </button>
279
+ </div>
280
+ }
281
+ </div>
282
+ }
283
+
284
+ <!-- Core Runtime Engine -->
285
+ <rpt-report-runtime
286
+ #runtimeRef
287
+ [reportId]="id()"
288
+ [report]="currentDefinition()"
289
+ (rowActionTriggered)="onRowActionTriggered($event)"
290
+ (gridStateChange)="onGridStateChanged($event)"
291
+ (selectionChange)="onSelectionChange($event)"
292
+ (exportRequested)="exportRequested.emit($event)"
293
+ (printRequested)="printRequested.emit($event)"
294
+ />
295
+
296
+ <!-- Save View Preset Modal -->
297
+ @if (isSavePresetModalOpen()) {
298
+ <div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
299
+ <div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
300
+ <div class="rpt-modal-header">
301
+ <div class="rpt-modal-header-title">
302
+ <rpt-icon name="bookmark" [size]="16" />
303
+ <h4 class="rpt-modal-title">Custom View Presets</h4>
304
+ </div>
305
+ <button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
306
+ </div>
307
+ <div class="rpt-modal-body">
308
+ <p class="rpt-modal-hint">
309
+ Save your active column ordering, widths, sortings, and filters into a reusable view preset.
310
+ </p>
311
+
312
+ <div class="rpt-input-group">
313
+ <label class="rpt-field-label">New View Name</label>
314
+ <input
315
+ type="text"
316
+ class="rpt-modal-input"
317
+ placeholder="e.g. High Value Transactions - Q3"
318
+ [ngModel]="newPresetName()"
319
+ (ngModelChange)="newPresetName.set($event)"
320
+ (keydown.enter)="saveCurrentPreset()"
321
+ autofocus
322
+ />
323
+ </div>
324
+
325
+ <!-- Existing Presets Management List -->
326
+ @if (savedPresets().length > 0) {
327
+ <div class="rpt-existing-presets">
328
+ <span class="rpt-existing-label">Saved Views in this report:</span>
329
+ <div class="rpt-presets-list">
330
+ @for (preset of savedPresets(); track preset.id) {
331
+ <div class="rpt-preset-row">
332
+ <div class="rpt-preset-info">
333
+ <span class="rpt-preset-row-name">{{ preset.name }}</span>
334
+ @if (preset.id === activePresetId()) {
335
+ <span class="rpt-preset-active-tag">Active</span>
336
+ }
337
+ </div>
338
+ <button
339
+ type="button"
340
+ class="rpt-btn-del-preset"
341
+ (click)="deletePreset(preset.id)"
342
+ title="Delete view preset"
343
+ aria-label="Delete view preset"
344
+ >
345
+ <rpt-icon name="trash" [size]="12" />
346
+ </button>
347
+ </div>
348
+ }
349
+ </div>
350
+ </div>
351
+ }
352
+ </div>
353
+ <div class="rpt-modal-footer">
354
+ <button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
355
+ <button
356
+ type="button"
357
+ class="rpt-btn-confirm"
358
+ [disabled]="!newPresetName().trim()"
359
+ (click)="saveCurrentPreset()"
360
+ >
361
+ Save View
362
+ </button>
363
+ </div>
364
+ </div>
365
+ }
366
+ </div>
367
+ `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
368
+ }
369
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, decorators: [{
370
+ type: Component,
371
+ args: [{ selector: 'rpt-report, rpt-view', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], template: `
372
+ <div class="rpt-facade-container">
373
+ <!-- Top Action & Preset Bar -->
374
+ @if (showToolbar()) {
375
+ <div class="rpt-facade-toolbar">
376
+ <div class="rpt-toolbar-left">
377
+ @if (activeDefinition()?.name) {
378
+ <div class="rpt-report-title-badge">
379
+ <span class="rpt-title-dot"></span>
380
+ <span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
381
+ </div>
382
+ }
383
+
384
+ @if (recordCount() > 0) {
385
+ <span class="rpt-record-count-chip" title="Current dataset size">
386
+ <span class="rpt-chip-dot"></span>
387
+ <span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
388
+ </span>
389
+ }
390
+
391
+ <!-- Saved Views / Preset Switcher -->
392
+ @if (enablePresets()) {
393
+ <div class="rpt-preset-control">
394
+ <label class="rpt-preset-label">
395
+ <rpt-icon name="bookmark" [size]="12" />
396
+ <span>View:</span>
397
+ </label>
398
+ <select
399
+ class="rpt-preset-select"
400
+ [ngModel]="activePresetId()"
401
+ (ngModelChange)="onSelectPreset($event)"
402
+ aria-label="Select report view preset"
403
+ >
404
+ <option value="default">Default View</option>
405
+ @for (preset of savedPresets(); track preset.id) {
406
+ <option [value]="preset.id">{{ preset.name }}</option>
407
+ }
408
+ </select>
409
+ <button
410
+ type="button"
411
+ class="rpt-btn-save-view"
412
+ (click)="openSavePresetModal()"
413
+ title="Save current grid view or manage presets"
414
+ >
415
+ <rpt-icon name="plus" [size]="11" />
416
+ <span>Save View</span>
417
+ </button>
418
+ </div>
419
+ }
420
+ </div>
421
+
422
+ <!-- Export Actions -->
423
+ @if (showExport()) {
424
+ <div class="rpt-toolbar-right">
425
+ <button
426
+ type="button"
427
+ class="rpt-export-btn rpt-export-excel"
428
+ (click)="onExportExcel()"
429
+ [disabled]="!recordCount()"
430
+ title="Export result table to Excel spreadsheet (.xls)"
431
+ >
432
+ <rpt-icon name="file-text" [size]="13" />
433
+ <span>Excel</span>
434
+ </button>
435
+ <button
436
+ type="button"
437
+ class="rpt-export-btn rpt-export-csv"
438
+ (click)="onExportCsv()"
439
+ [disabled]="!recordCount()"
440
+ title="Export result table to CSV file"
441
+ >
442
+ <rpt-icon name="download" [size]="13" />
443
+ <span>CSV</span>
444
+ </button>
445
+ <button
446
+ type="button"
447
+ class="rpt-export-btn rpt-export-print"
448
+ (click)="onPrintReport()"
449
+ [disabled]="!recordCount()"
450
+ title="Print report with branded layout"
451
+ >
452
+ <rpt-icon name="printer" [size]="13" />
453
+ <span>Print</span>
454
+ </button>
455
+ </div>
456
+ }
457
+ </div>
458
+ }
459
+
460
+ <!-- Core Runtime Engine -->
461
+ <rpt-report-runtime
462
+ #runtimeRef
463
+ [reportId]="id()"
464
+ [report]="currentDefinition()"
465
+ (rowActionTriggered)="onRowActionTriggered($event)"
466
+ (gridStateChange)="onGridStateChanged($event)"
467
+ (selectionChange)="onSelectionChange($event)"
468
+ (exportRequested)="exportRequested.emit($event)"
469
+ (printRequested)="printRequested.emit($event)"
470
+ />
471
+
472
+ <!-- Save View Preset Modal -->
473
+ @if (isSavePresetModalOpen()) {
474
+ <div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
475
+ <div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
476
+ <div class="rpt-modal-header">
477
+ <div class="rpt-modal-header-title">
478
+ <rpt-icon name="bookmark" [size]="16" />
479
+ <h4 class="rpt-modal-title">Custom View Presets</h4>
480
+ </div>
481
+ <button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
482
+ </div>
483
+ <div class="rpt-modal-body">
484
+ <p class="rpt-modal-hint">
485
+ Save your active column ordering, widths, sortings, and filters into a reusable view preset.
486
+ </p>
487
+
488
+ <div class="rpt-input-group">
489
+ <label class="rpt-field-label">New View Name</label>
490
+ <input
491
+ type="text"
492
+ class="rpt-modal-input"
493
+ placeholder="e.g. High Value Transactions - Q3"
494
+ [ngModel]="newPresetName()"
495
+ (ngModelChange)="newPresetName.set($event)"
496
+ (keydown.enter)="saveCurrentPreset()"
497
+ autofocus
498
+ />
499
+ </div>
500
+
501
+ <!-- Existing Presets Management List -->
502
+ @if (savedPresets().length > 0) {
503
+ <div class="rpt-existing-presets">
504
+ <span class="rpt-existing-label">Saved Views in this report:</span>
505
+ <div class="rpt-presets-list">
506
+ @for (preset of savedPresets(); track preset.id) {
507
+ <div class="rpt-preset-row">
508
+ <div class="rpt-preset-info">
509
+ <span class="rpt-preset-row-name">{{ preset.name }}</span>
510
+ @if (preset.id === activePresetId()) {
511
+ <span class="rpt-preset-active-tag">Active</span>
512
+ }
513
+ </div>
514
+ <button
515
+ type="button"
516
+ class="rpt-btn-del-preset"
517
+ (click)="deletePreset(preset.id)"
518
+ title="Delete view preset"
519
+ aria-label="Delete view preset"
520
+ >
521
+ <rpt-icon name="trash" [size]="12" />
522
+ </button>
523
+ </div>
524
+ }
525
+ </div>
526
+ </div>
527
+ }
528
+ </div>
529
+ <div class="rpt-modal-footer">
530
+ <button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
531
+ <button
532
+ type="button"
533
+ class="rpt-btn-confirm"
534
+ [disabled]="!newPresetName().trim()"
535
+ (click)="saveCurrentPreset()"
536
+ >
537
+ Save View
538
+ </button>
539
+ </div>
540
+ </div>
541
+ }
542
+ </div>
543
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
544
+ }] });
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9ydW50aW1lL3JwdC1yZXBvcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7OztBQXdpQm5HLE1BQU0sT0FBTyxrQkFBa0I7SUFDWixhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLEVBQUUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxLQUFLLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzlDLFVBQVUsR0FBRyxLQUFLLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEMsYUFBYSxHQUFHLEtBQUssQ0FB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QUFFLFdBQVcsMGdDQUFFLHNCQUFzQixpVUFBRSxnQkFBZ0I7OzRGQTJoQmxFLGtCQUFrQjtrQkE5aEI5QixTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDLFlBQ3BFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEtULG1CQTRXZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkUm93Q2xpY2tBY3Rpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vZXhwb3J0L3NlcnZpY2VzL3JlcG9ydC1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRWaWV3UHJlc2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBncmlkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmb3JtVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydCwgcnB0LXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVwb3J0UnVudGltZUNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1mYWNhZGUtY29udGFpbmVyXCI+XG4gICAgICA8IS0tIFRvcCBBY3Rpb24gJiBQcmVzZXQgQmFyIC0tPlxuICAgICAgQGlmIChzaG93VG9vbGJhcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZmFjYWRlLXRvb2xiYXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgICAgQGlmIChhY3RpdmVEZWZpbml0aW9uKCk/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1yZXBvcnQtdGl0bGUtYmFkZ2VcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC10aXRsZS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGl0bGUtdGV4dFwiPnt7IGFjdGl2ZURlZmluaXRpb24oKT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocmVjb3JkQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVjb3JkLWNvdW50LWNoaXBcIiB0aXRsZT1cIkN1cnJlbnQgZGF0YXNldCBzaXplXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY2hpcC1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGFidWxhci1udW1zXCI+e3sgcmVjb3JkQ291bnQoKSB9fSByb3dzPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gU2F2ZWQgVmlld3MgLyBQcmVzZXQgU3dpdGNoZXIgLS0+XG4gICAgICAgICAgICBAaWYgKGVuYWJsZVByZXNldHMoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LXByZXNldC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJib29rbWFya1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlZpZXc6PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtcHJlc2V0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVQcmVzZXRJZCgpXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0UHJlc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCByZXBvcnQgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkZWZhdWx0XCI+RGVmYXVsdCBWaWV3PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICBAZm9yIChwcmVzZXQgb2Ygc2F2ZWRQcmVzZXRzKCk7IHRyYWNrIHByZXNldC5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJwcmVzZXQuaWRcIj57eyBwcmVzZXQubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLXNhdmUtdmlld1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNhdmVQcmVzZXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiU2F2ZSBjdXJyZW50IGdyaWQgdmlldyBvciBtYW5hZ2UgcHJlc2V0c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2F2ZSBWaWV3PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRXhwb3J0IEFjdGlvbnMgLS0+XG4gICAgICAgICAgQGlmIChzaG93RXhwb3J0KCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdG9vbGJhci1yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtZXhwb3J0LWJ0biBycHQtZXhwb3J0LWV4Y2VsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FeHBvcnRFeGNlbCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJlY29yZENvdW50KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHJlc3VsdCB0YWJsZSB0byBFeGNlbCBzcHJlYWRzaGVldCAoLnhscylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJmaWxlLXRleHRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+RXhjZWw8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtZXhwb3J0LWJ0biBycHQtZXhwb3J0LWNzdlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0Q3N2KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcmVjb3JkQ291bnQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgcmVzdWx0IHRhYmxlIHRvIENTViBmaWxlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZG93bmxvYWRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+Q1NWPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1wcmludFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJpbnRSZXBvcnQoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyZWNvcmRDb3VudCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlByaW50IHJlcG9ydCB3aXRoIGJyYW5kZWQgbGF5b3V0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicHJpbnRlclwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QcmludDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIENvcmUgUnVudGltZSBFbmdpbmUgLS0+XG4gICAgICA8cnB0LXJlcG9ydC1ydW50aW1lXG4gICAgICAgICNydW50aW1lUmVmXG4gICAgICAgIFtyZXBvcnRJZF09XCJpZCgpXCJcbiAgICAgICAgW3JlcG9ydF09XCJjdXJyZW50RGVmaW5pdGlvbigpXCJcbiAgICAgICAgKHJvd0FjdGlvblRyaWdnZXJlZCk9XCJvblJvd0FjdGlvblRyaWdnZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgKGdyaWRTdGF0ZUNoYW5nZSk9XCJvbkdyaWRTdGF0ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChleHBvcnRSZXF1ZXN0ZWQpPVwiZXhwb3J0UmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChwcmludFJlcXVlc3RlZCk9XCJwcmludFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgLz5cblxuICAgICAgPCEtLSBTYXZlIFZpZXcgUHJlc2V0IE1vZGFsIC0tPlxuICAgICAgQGlmIChpc1NhdmVQcmVzZXRNb2RhbE9wZW4oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1kaWFsb2dcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsPVwiU2F2ZSBWaWV3IFByZXNldFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWhlYWRlci10aXRsZVwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImJvb2ttYXJrXCIgW3NpemVdPVwiMTZcIiAvPlxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJycHQtbW9kYWwtdGl0bGVcIj5DdXN0b20gVmlldyBQcmVzZXRzPC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtbW9kYWwtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VTYXZlUHJlc2V0TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtbW9kYWwtaGludFwiPlxuICAgICAgICAgICAgICBTYXZlIHlvdXIgYWN0aXZlIGNvbHVtbiBvcmRlcmluZywgd2lkdGhzLCBzb3J0aW5ncywgYW5kIGZpbHRlcnMgaW50byBhIHJldXNhYmxlIHZpZXcgcHJlc2V0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1maWVsZC1sYWJlbFwiPk5ldyBWaWV3IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtbW9kYWwtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBIaWdoIFZhbHVlIFRyYW5zYWN0aW9ucyAtIFEzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJuZXdQcmVzZXROYW1lKClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm5ld1ByZXNldE5hbWUuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVDdXJyZW50UHJlc2V0KClcIlxuICAgICAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRXhpc3RpbmcgUHJlc2V0cyBNYW5hZ2VtZW50IExpc3QgLS0+XG4gICAgICAgICAgICBAaWYgKHNhdmVkUHJlc2V0cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1leGlzdGluZy1wcmVzZXRzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZXhpc3RpbmctbGFiZWxcIj5TYXZlZCBWaWV3cyBpbiB0aGlzIHJlcG9ydDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmVzZXRzLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHByZXNldCBvZiBzYXZlZFByZXNldHMoKTsgdHJhY2sgcHJlc2V0LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0LWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXByZXNldC1yb3ctbmFtZVwiPnt7IHByZXNldC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcmVzZXQuaWQgPT09IGFjdGl2ZVByZXNldElkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHJlc2V0LWFjdGl2ZS10YWdcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tZGVsLXByZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUHJlc2V0KHByZXNldC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSB2aWV3IHByZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1idG4tY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1jb25maXJtXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFuZXdQcmVzZXROYW1lKCkudHJpbSgpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVDdXJyZW50UHJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTYXZlIFZpZXdcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtZmFjYWRlLWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgLnJwdC1mYWNhZGUtdG9vbGJhciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLXN1YnRsZSwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LXhzLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA0KSk7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNHB4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cbiAgICAucnB0LXRvb2xiYXItbGVmdCwgLnJwdC10b29sYmFyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cbiAgICAucnB0LXJlcG9ydC10aXRsZS1iYWRnZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgfVxuICAgIC5ycHQtdGl0bGUtZG90IHtcbiAgICAgIHdpZHRoOiA4cHg7XG4gICAgICBoZWlnaHQ6IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICB9XG4gICAgLnJwdC1yZWNvcmQtY291bnQtY2hpcCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWZ1bGwsIDk5OTlweCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgIH1cbiAgICAucnB0LWNoaXAtZG90IHtcbiAgICAgIHdpZHRoOiA2cHg7XG4gICAgICBoZWlnaHQ6IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICMxMGI5ODE7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWNvbnRyb2wge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBwYWRkaW5nOiAzcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXNlbGVjdCB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtc20sIDRweCk7XG4gICAgICBwYWRkaW5nOiAzcHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1zZWxlY3Q6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktZm9jdXMsIHJnYmEoMzcsIDk5LCAyMzUsIDAuMjUpKTtcbiAgICB9XG4gICAgLnJwdC1idG4tc2F2ZS12aWV3IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktbGlnaHQsICNlZmY2ZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDNweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1zbSwgNHB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNhdmUtdmlldzpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHBhZGRpbmc6IDVweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjQ1O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtZXhjZWwge1xuICAgICAgYmFja2dyb3VuZDogI2YwZmRmNDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBjb2xvcjogIzE1ODAzZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtZXhjZWw6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIGJvcmRlci1jb2xvcjogIzg2ZWZhYztcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtY3N2IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWNzdjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTRhM2I4O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LXByaW50IHtcbiAgICAgIGJhY2tncm91bmQ6ICNlZWYyZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzdkMmZlO1xuICAgICAgY29sb3I6ICM0MzM4Y2E7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LXByaW50OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlMGU3ZmY7XG4gICAgICBib3JkZXItY29sb3I6ICNhNWI0ZmM7XG4gICAgfVxuICAgIC8qIE1vZGFsICovXG4gICAgLnJwdC1tb2RhbC1iYWNrZHJvcCB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC40NSk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTtcbiAgICAgIHotaW5kZXg6IDExMDA7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtZGlhbG9nIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB3aWR0aDogbWluKDQ2MHB4LCA5MnZ3KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBib3gtc2hhZG93OiAwIDIwcHggMjVweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSksIDAgOHB4IDEwcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB6LWluZGV4OiAxMTAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYW5pbWF0aW9uOiBycHQtbW9kYWwtcG9wIDE2MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHJwdC1tb2RhbC1wb3Age1xuICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC00NiUpIHNjYWxlKDAuOTcpOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOyB9XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogMTRweCAxOHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWhlYWRlci10aXRsZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjk1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBmb250LXNpemU6IDEuMXJlbTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWNsb3NlOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1ib2R5IHtcbiAgICAgIHBhZGRpbmc6IDE4cHg7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaGludCB7XG4gICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgfVxuICAgIC5ycHQtaW5wdXQtZ3JvdXAge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgICB9XG4gICAgLnJwdC1maWVsZC1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDZweDtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWlucHV0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWZvY3VzLCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KSk7XG4gICAgfVxuICAgIC5ycHQtZXhpc3RpbmctcHJlc2V0cyB7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgIH1cbiAgICAucnB0LWV4aXN0aW5nLWxhYmVsIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0cy1saXN0IHtcbiAgICAgIG1heC1oZWlnaHQ6IDE0MHB4O1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWluZm8ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXJvdy1uYW1lIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTI5M2I7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWFjdGl2ZS10YWcge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgfVxuICAgIC5ycHQtYnRuLWRlbC1wcmVzZXQge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBjb2xvcjogIzk0YTNiODtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tZGVsLXByZXNldDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgY29sb3I6ICNkYzI2MjY7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIHBhZGRpbmc6IDEycHggMThweDtcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICB9XG4gICAgLnJwdC1idG4tY2FuY2VsIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA2cHggMTRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tY2FuY2VsOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LWJ0bi1jb25maXJtOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWhvdmVyLCAjMWQ0ZWQ4KTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybTpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBScHRSZXBvcnRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2UgPSBpbmplY3QoUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSByZXBvcnQgPSBpbnB1dDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHBhcmFtZXRlcnMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xuICByZWFkb25seSBzaG93RXhwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGVuYWJsZVByZXNldHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgYXV0b0V4ZWN1dGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICByZWFkb25seSByb3dDbGljayA9IG91dHB1dDx7XG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBhY3Rpb24/OiBHcmlkUm93Q2xpY2tBY3Rpb247XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGRhdGFMb2FkZWQgPSBvdXRwdXQ8dW5rbm93bltdPigpO1xuICByZWFkb25seSBncmlkU3RhdGVDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZWQgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHByZXNldFNhdmVkID0gb3V0cHV0PHsgbmFtZTogc3RyaW5nOyBwcmVzZXQ6IFJlcG9ydFZpZXdQcmVzZXQgfT4oKTtcbiAgcmVhZG9ubHkgcHJlc2V0Q2hhbmdlID0gb3V0cHV0PFJlcG9ydFZpZXdQcmVzZXQgfCBudWxsPigpO1xuICByZWFkb25seSBleHBvcnRSZXF1ZXN0ZWQgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBwcmludFJlcXVlc3RlZCA9IG91dHB1dDxhbnk+KCk7XG5cbiAgcmVhZG9ubHkgcnVudGltZUNvbXBvbmVudCA9IHZpZXdDaGlsZChSZXBvcnRSdW50aW1lQ29tcG9uZW50KTtcblxuICAvLyBQcmVzZXQgc3RhdGVzXG4gIHJlYWRvbmx5IGFjdGl2ZVByZXNldElkID0gc2lnbmFsPHN0cmluZz4oJ2RlZmF1bHQnKTtcbiAgcmVhZG9ubHkgaXNTYXZlUHJlc2V0TW9kYWxPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbmV3UHJlc2V0TmFtZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbGF0ZXN0R3JpZFN0YXRlID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGN1c3RvbVByZXNldHMgPSBzaWduYWw8UmVwb3J0Vmlld1ByZXNldFtdPihbXSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERlZmluaXRpb24gPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydCgpO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVEZWZpbml0aW9uID0gY29tcHV0ZWQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQoKSA/PyB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8uY3VycmVudERlZmluaXRpb24oKSA/PyBudWxsO1xuICB9KTtcblxuICByZWFkb25seSByZWNvcmRDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpPy5sZW5ndGggPz8gMDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc2hvd1Rvb2xiYXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0V4cG9ydCgpIHx8IHRoaXMuZW5hYmxlUHJlc2V0cygpO1xuICB9KTtcblxuICByZWFkb25seSBzYXZlZFByZXNldHMgPSBjb21wdXRlZDxSZXBvcnRWaWV3UHJlc2V0W10+KCgpID0+IHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBpbml0aWFsUHJlc2V0cyA9ICgoZGVmPy5ncmlkPy5vcHRpb25zIGFzIGFueSk/LnByZXNldHMgYXMgUmVwb3J0Vmlld1ByZXNldFtdKSA/PyBbXTtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUmVwb3J0Vmlld1ByZXNldD4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgaW5pdGlhbFByZXNldHMpIHtcbiAgICAgIGlmIChwICYmIHAuaWQpIG1hcC5zZXQocC5pZCwgcCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLmN1c3RvbVByZXNldHMoKSkge1xuICAgICAgaWYgKHAgJiYgcC5pZCkgbWFwLnNldChwLmlkLCBwKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20obWFwLnZhbHVlcygpKTtcbiAgfSk7XG5cbiAgb25Sb3dBY3Rpb25UcmlnZ2VyZWQoZXZlbnQ6IHtcbiAgICBhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbjtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHtcbiAgICAgIHJvdzogZXZlbnQucm93LFxuICAgICAgcGFyYW1ldGVyczogZXZlbnQucGFyYW1ldGVycyxcbiAgICAgIGFjdGlvbjogZXZlbnQuYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgb25HcmlkU3RhdGVDaGFuZ2VkKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxhdGVzdEdyaWRTdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuZ3JpZFN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uocm93czogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHJvd3MpO1xuICB9XG5cbiAgb25TZWxlY3RQcmVzZXQocHJlc2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUHJlc2V0SWQuc2V0KHByZXNldElkKTtcbiAgICBpZiAocHJlc2V0SWQgPT09ICdkZWZhdWx0Jykge1xuICAgICAgdGhpcy5wcmVzZXRDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLnNhdmVkUHJlc2V0cygpLmZpbmQoKHApID0+IHAuaWQgPT09IHByZXNldElkKTtcbiAgICBpZiAocHJlc2V0KSB7XG4gICAgICBpZiAocHJlc2V0LmdyaWRTdGF0ZSkge1xuICAgICAgICB0aGlzLmxhdGVzdEdyaWRTdGF0ZS5zZXQocHJlc2V0LmdyaWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuZ3JpZFN0YXRlQ2hhbmdlLmVtaXQocHJlc2V0LmdyaWRTdGF0ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnByZXNldENoYW5nZS5lbWl0KHByZXNldCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybVNhdmVQcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlQ3VycmVudFByZXNldCgpO1xuICB9XG5cbiAgZXhwb3J0RXhjZWwoKTogdm9pZCB7XG4gICAgdGhpcy5vbkV4cG9ydEV4Y2VsKCk7XG4gIH1cblxuICBleHBvcnRDc3YoKTogdm9pZCB7XG4gICAgdGhpcy5vbkV4cG9ydENzdigpO1xuICB9XG5cbiAgcHJpbnQoKTogdm9pZCB7XG4gICAgdGhpcy5vblByaW50UmVwb3J0KCk7XG4gIH1cblxuICBvcGVuU2F2ZVByZXNldE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubmV3UHJlc2V0TmFtZS5zZXQoJycpO1xuICAgIHRoaXMuaXNTYXZlUHJlc2V0TW9kYWxPcGVuLnNldCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlU2F2ZVByZXNldE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZlUHJlc2V0TW9kYWxPcGVuLnNldChmYWxzZSk7XG4gIH1cblxuICBzYXZlQ3VycmVudFByZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uZXdQcmVzZXROYW1lKCkudHJpbSgpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJlc2V0SWQgPSBgcHJlc2V0XyR7RGF0ZS5ub3coKX1gO1xuICAgIGNvbnN0IG5ld1ByZXNldDogUmVwb3J0Vmlld1ByZXNldCA9IHtcbiAgICAgIGlkOiBwcmVzZXRJZCxcbiAgICAgIG5hbWUsXG4gICAgICBncmlkU3RhdGU6IHRoaXMubGF0ZXN0R3JpZFN0YXRlKCkgPz8ge30sXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGVmID0gdGhpcy5hY3RpdmVEZWZpbml0aW9uKCk7XG4gICAgaWYgKGRlZiAmJiBkZWYuZ3JpZCkge1xuICAgICAgaWYgKCFkZWYuZ3JpZC5vcHRpb25zKSBkZWYuZ3JpZC5vcHRpb25zID0ge307XG4gICAgICBjb25zdCBjdXJyZW50UHJlc2V0czogUmVwb3J0Vmlld1ByZXNldFtdID0gKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzID8/IFtdO1xuICAgICAgKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzID0gWy4uLmN1cnJlbnRQcmVzZXRzLCBuZXdQcmVzZXRdO1xuXG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSAmJiBkZWYuaWQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5zYXZlKGRlZikuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VzdG9tUHJlc2V0cy51cGRhdGUoKHByZXYpID0+IFsuLi5wcmV2LCBuZXdQcmVzZXRdKTtcbiAgICB0aGlzLmFjdGl2ZVByZXNldElkLnNldChwcmVzZXRJZCk7XG4gICAgdGhpcy5wcmVzZXRTYXZlZC5lbWl0KHsgbmFtZSwgcHJlc2V0OiBuZXdQcmVzZXQgfSk7XG4gICAgdGhpcy5jbG9zZVNhdmVQcmVzZXRNb2RhbCgpO1xuICB9XG5cbiAgZGVsZXRlUHJlc2V0KHByZXNldElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocHJlc2V0SWQgPT09ICdkZWZhdWx0JykgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXN0b21QcmVzZXRzLnVwZGF0ZSgocHJldikgPT4gcHJldi5maWx0ZXIoKHApID0+IHAuaWQgIT09IHByZXNldElkKSk7XG5cbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBpZiAoZGVmICYmIGRlZi5ncmlkICYmIGRlZi5ncmlkLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAoKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzIGFzIFJlcG9ydFZpZXdQcmVzZXRbXSkgPz8gW107XG4gICAgICAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPSBjdXJyZW50LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gcHJlc2V0SWQpO1xuXG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSAmJiBkZWYuaWQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5zYXZlKGRlZikuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldElkKCkgPT09IHByZXNldElkKSB7XG4gICAgICB0aGlzLm9uU2VsZWN0UHJlc2V0KCdkZWZhdWx0Jyk7XG4gICAgfVxuICB9XG5cbiAgb25FeHBvcnRFeGNlbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydEV4Y2VsKGRhdGEgYXMgYW55LCB7XG4gICAgICBmaWxlTmFtZTogZGVmPy5uYW1lID8gYCR7ZGVmLm5hbWV9Lnhsc2AgOiAncmVwb3J0LnhscycsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cblxuICBvbkV4cG9ydENzdigpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydENzdihkYXRhIGFzIGFueSwge1xuICAgICAgZmlsZU5hbWU6IGRlZj8ubmFtZSA/IGAke2RlZi5uYW1lfS5jc3ZgIDogJ3JlcG9ydC5jc3YnLFxuICAgICAgY29sdW1uczogY29scyxcbiAgICAgIGJyYW5kZWRIZWFkZXI6IHsgcmVwb3J0VGl0bGU6IGRlZj8ubmFtZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25QcmludFJlcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLnByaW50UmVwb3J0KGRhdGEgYXMgYW55LCB7XG4gICAgICB0aXRsZTogZGVmPy5uYW1lIHx8ICdSZXBvcnQgUHJpbnQgUHJldmlldycsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==