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
@@ -1,15 +1,23 @@
1
- import { ChangeDetectionStrategy, Component, inject, output, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, inject, input, output, signal, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { DesignerStateService } from '../../services/designer-state.service';
4
4
  import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
5
+ import { ReportTemplateService } from '../../services/report-template.service';
5
6
  import * as i0 from "@angular/core";
6
7
  export class DesignerToolbarComponent {
7
8
  designerState = inject(DesignerStateService);
9
+ templateService = inject(ReportTemplateService);
8
10
  definition = this.designerState.definition;
9
11
  viewMode = this.designerState.viewMode;
10
12
  isDirty = this.designerState.isDirty;
11
13
  canUndo = this.designerState.canUndo;
12
14
  canRedo = this.designerState.canRedo;
15
+ isTemplatesModalOpen = signal(false);
16
+ availableBlueprints = this.templateService.getTemplates();
17
+ isLeftPanelCollapsed = input(false);
18
+ isRightPanelCollapsed = input(false);
19
+ toggleLeftPanel = output();
20
+ toggleRightPanel = output();
13
21
  saveRequested = output();
14
22
  setMode(mode) {
15
23
  this.designerState.setViewMode(mode);
@@ -23,6 +31,17 @@ export class DesignerToolbarComponent {
23
31
  saveReport() {
24
32
  this.saveRequested.emit();
25
33
  }
34
+ openTemplatesModal() {
35
+ this.isTemplatesModalOpen.set(true);
36
+ }
37
+ closeTemplatesModal() {
38
+ this.isTemplatesModalOpen.set(false);
39
+ }
40
+ applyBlueprint(blueprintId) {
41
+ const newDef = this.templateService.instantiateTemplate(blueprintId);
42
+ this.designerState.loadDefinition(newDef);
43
+ this.closeTemplatesModal();
44
+ }
26
45
  addResultGrid() {
27
46
  const existingDs = this.definition().dataSources[0];
28
47
  const defaultGrid = {
@@ -36,6 +55,9 @@ export class DesignerToolbarComponent {
36
55
  pageSize: 25,
37
56
  showRowNumbers: true,
38
57
  showFooter: true,
58
+ sideBar: true,
59
+ globalSearch: true,
60
+ statusBar: true,
39
61
  },
40
62
  };
41
63
  this.designerState.updateGridSettings(defaultGrid);
@@ -57,10 +79,22 @@ export class DesignerToolbarComponent {
57
79
  downloadAnchor.remove();
58
80
  }
59
81
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerToolbarComponent, isStandalone: true, selector: "rpt-designer-toolbar", outputs: { saveRequested: "saveRequested" }, ngImport: i0, template: `
82
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerToolbarComponent, isStandalone: true, selector: "rpt-designer-toolbar", inputs: { isLeftPanelCollapsed: { classPropertyName: "isLeftPanelCollapsed", publicName: "isLeftPanelCollapsed", isSignal: true, isRequired: false, transformFunction: null }, isRightPanelCollapsed: { classPropertyName: "isRightPanelCollapsed", publicName: "isRightPanelCollapsed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleLeftPanel: "toggleLeftPanel", toggleRightPanel: "toggleRightPanel", saveRequested: "saveRequested" }, ngImport: i0, template: `
61
83
  <div class="toolbar-root">
62
- <!-- Left: Title & Dirty indicator -->
84
+ <!-- Left: Panel toggle, Title & Dirty indicator -->
63
85
  <div class="toolbar-left">
86
+ @if (viewMode() === 'design') {
87
+ <button
88
+ type="button"
89
+ class="tool-btn btn-panel-toggle"
90
+ [class.active]="!isLeftPanelCollapsed()"
91
+ (click)="toggleLeftPanel.emit()"
92
+ [title]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
93
+ [attr.aria-label]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
94
+ >
95
+ <rpt-icon name="panel-left" [size]="14" />
96
+ </button>
97
+ }
64
98
  <div class="report-identity">
65
99
  <span class="report-name">{{ definition().name || 'Untitled Report' }}</span>
66
100
  @if (isDirty()) {
@@ -71,38 +105,41 @@ export class DesignerToolbarComponent {
71
105
 
72
106
  <!-- Center: Mode Switcher -->
73
107
  <div class="toolbar-center">
74
- <div class="mode-pill-group">
108
+ <div class="mode-pill-group" role="tablist" aria-label="Workbench View Mode">
75
109
  <button
76
110
  type="button"
77
111
  class="mode-btn"
78
112
  [class.active]="viewMode() === 'design'"
79
113
  (click)="setMode('design')"
114
+ title="Visual Design Canvas"
80
115
  >
81
116
  <rpt-icon name="edit" [size]="14" />
82
- <span>Design</span>
117
+ <span class="mode-label">Design</span>
83
118
  </button>
84
119
  <button
85
120
  type="button"
86
121
  class="mode-btn"
87
122
  [class.active]="viewMode() === 'preview'"
88
123
  (click)="setMode('preview')"
124
+ title="Live Runtime Preview"
89
125
  >
90
126
  <rpt-icon name="eye" [size]="14" />
91
- <span>Live Preview</span>
127
+ <span class="mode-label">Preview</span>
92
128
  </button>
93
129
  <button
94
130
  type="button"
95
131
  class="mode-btn"
96
132
  [class.active]="viewMode() === 'json'"
97
133
  (click)="setMode('json')"
134
+ title="JSON Report Schema"
98
135
  >
99
136
  <rpt-icon name="code" [size]="14" />
100
- <span>JSON Schema</span>
137
+ <span class="mode-label">JSON</span>
101
138
  </button>
102
139
  </div>
103
140
  </div>
104
141
 
105
- <!-- Right: Undo, Redo, Save, Export -->
142
+ <!-- Right: Undo, Redo, Blueprints, Grid, Export, Save -->
106
143
  <div class="toolbar-right">
107
144
  <div class="history-group">
108
145
  <button
@@ -125,8 +162,32 @@ export class DesignerToolbarComponent {
125
162
  </button>
126
163
  </div>
127
164
 
165
+ @if (viewMode() === 'design') {
166
+ <button
167
+ type="button"
168
+ class="tool-btn btn-panel-toggle"
169
+ [class.active]="!isRightPanelCollapsed()"
170
+ (click)="toggleRightPanel.emit()"
171
+ [title]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
172
+ [attr.aria-label]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
173
+ >
174
+ <rpt-icon name="panel-right" [size]="14" />
175
+ </button>
176
+ }
177
+
128
178
  <div class="actions-divider"></div>
129
179
 
180
+ <!-- 1-Click Blueprints Gallery Button -->
181
+ <button
182
+ type="button"
183
+ class="tool-btn btn-blueprints"
184
+ (click)="openTemplatesModal()"
185
+ title="Start from pre-configured enterprise blueprints"
186
+ >
187
+ <rpt-icon name="layers" [size]="14" />
188
+ <span class="btn-label">Blueprints</span>
189
+ </button>
190
+
130
191
  <!-- Add / Configure Grid Quick Button -->
131
192
  @if (!definition().grid) {
132
193
  <button
@@ -136,7 +197,7 @@ export class DesignerToolbarComponent {
136
197
  title="Attach a Result Data Grid (UltraGrid / Table) to this report"
137
198
  >
138
199
  <rpt-icon name="table" [size]="14" />
139
- <span>+ Add Grid</span>
200
+ <span class="btn-label">+ Add Grid</span>
140
201
  </button>
141
202
  } @else {
142
203
  <button
@@ -146,7 +207,7 @@ export class DesignerToolbarComponent {
146
207
  title="Configure Result Data Grid columns and pagination"
147
208
  >
148
209
  <rpt-icon name="table" [size]="14" />
149
- <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
210
+ <span class="btn-label">Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
150
211
  </button>
151
212
  }
152
213
 
@@ -159,7 +220,7 @@ export class DesignerToolbarComponent {
159
220
  title="Download JSON Definition"
160
221
  >
161
222
  <rpt-icon name="download" [size]="14" />
162
- <span>Export</span>
223
+ <span class="btn-label">Export</span>
163
224
  </button>
164
225
 
165
226
  <button
@@ -169,18 +230,63 @@ export class DesignerToolbarComponent {
169
230
  title="Save Report Definition"
170
231
  >
171
232
  <rpt-icon name="save" [size]="14" />
172
- <span>Save Changes</span>
233
+ <span class="btn-label">Save</span>
173
234
  </button>
174
235
  </div>
236
+
237
+ <!-- Blueprints Gallery Modal -->
238
+ @if (isTemplatesModalOpen()) {
239
+ <div class="blueprint-backdrop" (click)="closeTemplatesModal()" aria-hidden="true"></div>
240
+ <div class="blueprint-modal" role="dialog" aria-modal="true" aria-label="Starter Report Blueprints">
241
+ <div class="blueprint-modal-header">
242
+ <div>
243
+ <h3 class="blueprint-modal-title">Starter Report Blueprints</h3>
244
+ <p class="blueprint-modal-sub">Choose a pre-configured architecture pattern to jumpstart report creation.</p>
245
+ </div>
246
+ <button type="button" class="btn-close-modal" (click)="closeTemplatesModal()" aria-label="Close">✕</button>
247
+ </div>
248
+ <div class="blueprint-grid">
249
+ @for (bp of availableBlueprints; track bp.id) {
250
+ <div class="blueprint-card" (click)="applyBlueprint(bp.id)">
251
+ <div class="blueprint-card-top">
252
+ <span class="blueprint-cat-badge">{{ bp.category }}</span>
253
+ <div class="blueprint-card-icon">
254
+ <rpt-icon [name]="bp.icon || 'table'" [size]="20" />
255
+ </div>
256
+ </div>
257
+ <h4 class="blueprint-card-title">{{ bp.name }}</h4>
258
+ <p class="blueprint-card-desc">{{ bp.description }}</p>
259
+ <div class="blueprint-card-footer">
260
+ <button type="button" class="btn-apply-blueprint">
261
+ Use Blueprint →
262
+ </button>
263
+ </div>
264
+ </div>
265
+ }
266
+ </div>
267
+ </div>
268
+ }
175
269
  </div>
176
- `, isInline: true, styles: [":host{display:block;background:#0f172a;color:#fff;height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid #1e293b;box-sizing:border-box}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-size:.95rem;font-weight:700;color:#fff;letter-spacing:-.01em}.dirty-badge{font-size:.65rem;font-weight:600;color:#f59e0b;background:#f59e0b26;padding:2px 6px;border-radius:4px}.mode-pill-group{display:flex;background:#1e293b;padding:3px;border-radius:8px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:transparent;color:#94a3b8;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .15s ease}.mode-btn:hover{color:#fff}.mode-btn.active{background:#2563eb;color:#fff;box-shadow:0 1px 3px #0003}.history-group{display:flex;gap:4px}.tool-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;border:1px solid rgba(255,255,255,.15);background:#ffffff0d;color:#e2e8f0;transition:all .15s ease}.tool-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.tool-btn:disabled{opacity:.3;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:#ffffff26}.btn-save{background:#2563eb;border-color:#2563eb;color:#fff}.btn-save:hover:not(:disabled){background:#1d4ed8;border-color:#1d4ed8}.btn-export{background:transparent}.btn-grid-action{background:#10b98126;border-color:#10b98166;color:#34d399}.btn-grid-action:hover:not(:disabled){background:#10b98140;color:#6ee7b7;border-color:#10b981}.btn-grid-configured{background:#6366f126;border-color:#6366f159;color:#a5b4fc}.btn-grid-configured:hover:not(:disabled){background:#6366f140;color:#c7d2fe}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
270
+ `, isInline: true, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30;flex-shrink:0}.toolbar-root{display:flex;align-items:center;justify-content:flex-start;height:100%;padding:0 16px;gap:8px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch;box-sizing:border-box}.toolbar-root::-webkit-scrollbar{display:none}.toolbar-left{display:flex;align-items:center;gap:8px;min-width:0;flex-shrink:0}.toolbar-right{display:flex;align-items:center;gap:6px;min-width:0;flex-shrink:0;margin-left:auto;justify-content:flex-end}.toolbar-center{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 auto}.report-identity{display:flex;align-items:center;gap:8px;min-width:0}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap;flex-shrink:0}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px;flex-shrink:0}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px;flex-shrink:0}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap;flex-shrink:0}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.btn-panel-toggle{padding:6px 8px;color:var(--rpt-color-text-muted, #64748b)}.btn-panel-toggle:hover:not(:disabled){color:var(--rpt-color-text, #0f172a);background:var(--rpt-color-surface-hover, #f8fafc)}.btn-panel-toggle.active{background:#eff6ff;border-color:#bfdbfe;color:var(--rpt-color-primary, #2563eb)}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1);flex-shrink:0}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}@media (max-width: 1024px){.toolbar-root{padding:0 12px;gap:6px}.report-name{max-width:140px}.btn-blueprints .btn-label,.btn-export .btn-label{display:none}.tool-btn{padding:6px 9px}}@media (max-width: 900px){:host{height:48px}.toolbar-root{padding:0 8px;gap:4px}.btn-panel-toggle{display:none!important}.report-name{max-width:100px;font-size:.8125rem}.actions-divider{display:none}.tool-btn .btn-label{display:none!important}.tool-btn{padding:5px 7px;min-width:30px;height:30px;justify-content:center}.mode-pill-group{padding:2px;gap:1px}.mode-btn{padding:4px 8px;font-size:.725rem;gap:4px}}@media (max-width: 680px){:host{height:46px}.toolbar-root{padding:0 6px;gap:3px}.report-name{max-width:75px;font-size:.75rem}.dirty-badge{font-size:.6rem;padding:1px 4px}.mode-btn .mode-label{display:none}.mode-btn{padding:5px 8px}.tool-btn{min-width:28px;height:28px;padding:4px 6px}.toolbar-right{gap:3px}}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
177
271
  }
178
272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerToolbarComponent, decorators: [{
179
273
  type: Component,
180
274
  args: [{ selector: 'rpt-designer-toolbar', standalone: true, imports: [CommonModule, RptIconComponent], template: `
181
275
  <div class="toolbar-root">
182
- <!-- Left: Title & Dirty indicator -->
276
+ <!-- Left: Panel toggle, Title & Dirty indicator -->
183
277
  <div class="toolbar-left">
278
+ @if (viewMode() === 'design') {
279
+ <button
280
+ type="button"
281
+ class="tool-btn btn-panel-toggle"
282
+ [class.active]="!isLeftPanelCollapsed()"
283
+ (click)="toggleLeftPanel.emit()"
284
+ [title]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
285
+ [attr.aria-label]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
286
+ >
287
+ <rpt-icon name="panel-left" [size]="14" />
288
+ </button>
289
+ }
184
290
  <div class="report-identity">
185
291
  <span class="report-name">{{ definition().name || 'Untitled Report' }}</span>
186
292
  @if (isDirty()) {
@@ -191,38 +297,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
191
297
 
192
298
  <!-- Center: Mode Switcher -->
193
299
  <div class="toolbar-center">
194
- <div class="mode-pill-group">
300
+ <div class="mode-pill-group" role="tablist" aria-label="Workbench View Mode">
195
301
  <button
196
302
  type="button"
197
303
  class="mode-btn"
198
304
  [class.active]="viewMode() === 'design'"
199
305
  (click)="setMode('design')"
306
+ title="Visual Design Canvas"
200
307
  >
201
308
  <rpt-icon name="edit" [size]="14" />
202
- <span>Design</span>
309
+ <span class="mode-label">Design</span>
203
310
  </button>
204
311
  <button
205
312
  type="button"
206
313
  class="mode-btn"
207
314
  [class.active]="viewMode() === 'preview'"
208
315
  (click)="setMode('preview')"
316
+ title="Live Runtime Preview"
209
317
  >
210
318
  <rpt-icon name="eye" [size]="14" />
211
- <span>Live Preview</span>
319
+ <span class="mode-label">Preview</span>
212
320
  </button>
213
321
  <button
214
322
  type="button"
215
323
  class="mode-btn"
216
324
  [class.active]="viewMode() === 'json'"
217
325
  (click)="setMode('json')"
326
+ title="JSON Report Schema"
218
327
  >
219
328
  <rpt-icon name="code" [size]="14" />
220
- <span>JSON Schema</span>
329
+ <span class="mode-label">JSON</span>
221
330
  </button>
222
331
  </div>
223
332
  </div>
224
333
 
225
- <!-- Right: Undo, Redo, Save, Export -->
334
+ <!-- Right: Undo, Redo, Blueprints, Grid, Export, Save -->
226
335
  <div class="toolbar-right">
227
336
  <div class="history-group">
228
337
  <button
@@ -245,8 +354,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
245
354
  </button>
246
355
  </div>
247
356
 
357
+ @if (viewMode() === 'design') {
358
+ <button
359
+ type="button"
360
+ class="tool-btn btn-panel-toggle"
361
+ [class.active]="!isRightPanelCollapsed()"
362
+ (click)="toggleRightPanel.emit()"
363
+ [title]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
364
+ [attr.aria-label]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
365
+ >
366
+ <rpt-icon name="panel-right" [size]="14" />
367
+ </button>
368
+ }
369
+
248
370
  <div class="actions-divider"></div>
249
371
 
372
+ <!-- 1-Click Blueprints Gallery Button -->
373
+ <button
374
+ type="button"
375
+ class="tool-btn btn-blueprints"
376
+ (click)="openTemplatesModal()"
377
+ title="Start from pre-configured enterprise blueprints"
378
+ >
379
+ <rpt-icon name="layers" [size]="14" />
380
+ <span class="btn-label">Blueprints</span>
381
+ </button>
382
+
250
383
  <!-- Add / Configure Grid Quick Button -->
251
384
  @if (!definition().grid) {
252
385
  <button
@@ -256,7 +389,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
256
389
  title="Attach a Result Data Grid (UltraGrid / Table) to this report"
257
390
  >
258
391
  <rpt-icon name="table" [size]="14" />
259
- <span>+ Add Grid</span>
392
+ <span class="btn-label">+ Add Grid</span>
260
393
  </button>
261
394
  } @else {
262
395
  <button
@@ -266,7 +399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
266
399
  title="Configure Result Data Grid columns and pagination"
267
400
  >
268
401
  <rpt-icon name="table" [size]="14" />
269
- <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
402
+ <span class="btn-label">Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
270
403
  </button>
271
404
  }
272
405
 
@@ -279,7 +412,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
279
412
  title="Download JSON Definition"
280
413
  >
281
414
  <rpt-icon name="download" [size]="14" />
282
- <span>Export</span>
415
+ <span class="btn-label">Export</span>
283
416
  </button>
284
417
 
285
418
  <button
@@ -289,10 +422,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
289
422
  title="Save Report Definition"
290
423
  >
291
424
  <rpt-icon name="save" [size]="14" />
292
- <span>Save Changes</span>
425
+ <span class="btn-label">Save</span>
293
426
  </button>
294
427
  </div>
428
+
429
+ <!-- Blueprints Gallery Modal -->
430
+ @if (isTemplatesModalOpen()) {
431
+ <div class="blueprint-backdrop" (click)="closeTemplatesModal()" aria-hidden="true"></div>
432
+ <div class="blueprint-modal" role="dialog" aria-modal="true" aria-label="Starter Report Blueprints">
433
+ <div class="blueprint-modal-header">
434
+ <div>
435
+ <h3 class="blueprint-modal-title">Starter Report Blueprints</h3>
436
+ <p class="blueprint-modal-sub">Choose a pre-configured architecture pattern to jumpstart report creation.</p>
437
+ </div>
438
+ <button type="button" class="btn-close-modal" (click)="closeTemplatesModal()" aria-label="Close">✕</button>
439
+ </div>
440
+ <div class="blueprint-grid">
441
+ @for (bp of availableBlueprints; track bp.id) {
442
+ <div class="blueprint-card" (click)="applyBlueprint(bp.id)">
443
+ <div class="blueprint-card-top">
444
+ <span class="blueprint-cat-badge">{{ bp.category }}</span>
445
+ <div class="blueprint-card-icon">
446
+ <rpt-icon [name]="bp.icon || 'table'" [size]="20" />
447
+ </div>
448
+ </div>
449
+ <h4 class="blueprint-card-title">{{ bp.name }}</h4>
450
+ <p class="blueprint-card-desc">{{ bp.description }}</p>
451
+ <div class="blueprint-card-footer">
452
+ <button type="button" class="btn-apply-blueprint">
453
+ Use Blueprint →
454
+ </button>
455
+ </div>
456
+ </div>
457
+ }
458
+ </div>
459
+ </div>
460
+ }
295
461
  </div>
296
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:#0f172a;color:#fff;height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid #1e293b;box-sizing:border-box}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-size:.95rem;font-weight:700;color:#fff;letter-spacing:-.01em}.dirty-badge{font-size:.65rem;font-weight:600;color:#f59e0b;background:#f59e0b26;padding:2px 6px;border-radius:4px}.mode-pill-group{display:flex;background:#1e293b;padding:3px;border-radius:8px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:transparent;color:#94a3b8;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .15s ease}.mode-btn:hover{color:#fff}.mode-btn.active{background:#2563eb;color:#fff;box-shadow:0 1px 3px #0003}.history-group{display:flex;gap:4px}.tool-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;border:1px solid rgba(255,255,255,.15);background:#ffffff0d;color:#e2e8f0;transition:all .15s ease}.tool-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.tool-btn:disabled{opacity:.3;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:#ffffff26}.btn-save{background:#2563eb;border-color:#2563eb;color:#fff}.btn-save:hover:not(:disabled){background:#1d4ed8;border-color:#1d4ed8}.btn-export{background:transparent}.btn-grid-action{background:#10b98126;border-color:#10b98166;color:#34d399}.btn-grid-action:hover:not(:disabled){background:#10b98140;color:#6ee7b7;border-color:#10b981}.btn-grid-configured{background:#6366f126;border-color:#6366f159;color:#a5b4fc}.btn-grid-configured:hover:not(:disabled){background:#6366f140;color:#c7d2fe}\n"] }]
462
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30;flex-shrink:0}.toolbar-root{display:flex;align-items:center;justify-content:flex-start;height:100%;padding:0 16px;gap:8px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch;box-sizing:border-box}.toolbar-root::-webkit-scrollbar{display:none}.toolbar-left{display:flex;align-items:center;gap:8px;min-width:0;flex-shrink:0}.toolbar-right{display:flex;align-items:center;gap:6px;min-width:0;flex-shrink:0;margin-left:auto;justify-content:flex-end}.toolbar-center{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 auto}.report-identity{display:flex;align-items:center;gap:8px;min-width:0}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap;flex-shrink:0}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px;flex-shrink:0}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px;flex-shrink:0}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap;flex-shrink:0}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.btn-panel-toggle{padding:6px 8px;color:var(--rpt-color-text-muted, #64748b)}.btn-panel-toggle:hover:not(:disabled){color:var(--rpt-color-text, #0f172a);background:var(--rpt-color-surface-hover, #f8fafc)}.btn-panel-toggle.active{background:#eff6ff;border-color:#bfdbfe;color:var(--rpt-color-primary, #2563eb)}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1);flex-shrink:0}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}@media (max-width: 1024px){.toolbar-root{padding:0 12px;gap:6px}.report-name{max-width:140px}.btn-blueprints .btn-label,.btn-export .btn-label{display:none}.tool-btn{padding:6px 9px}}@media (max-width: 900px){:host{height:48px}.toolbar-root{padding:0 8px;gap:4px}.btn-panel-toggle{display:none!important}.report-name{max-width:100px;font-size:.8125rem}.actions-divider{display:none}.tool-btn .btn-label{display:none!important}.tool-btn{padding:5px 7px;min-width:30px;height:30px;justify-content:center}.mode-pill-group{padding:2px;gap:1px}.mode-btn{padding:4px 8px;font-size:.725rem;gap:4px}}@media (max-width: 680px){:host{height:46px}.toolbar-root{padding:0 6px;gap:3px}.report-name{max-width:75px;font-size:.75rem}.dirty-badge{font-size:.6rem;padding:1px 4px}.mode-btn .mode-label{display:none}.mode-btn{padding:5px 8px}.tool-btn{min-width:28px;height:28px;padding:4px 6px}.toolbar-right{gap:3px}}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"] }]
297
463
  }] });
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Rvb2xiYXIvZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLHVDQUF1QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOztBQStRN0YsTUFBTSxPQUFPLHdCQUF3QjtJQUNsQixhQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFckQsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQzNDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUVyQyxhQUFhLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFeEMsT0FBTyxDQUFDLElBQXNCO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLFdBQVcsR0FBeUI7WUFDeEMsWUFBWSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksU0FBUztZQUN6QyxPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQy9FLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2FBQ3BGO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixRQUFRLEVBQUUsRUFBRTtnQkFDWixjQUFjLEVBQUUsSUFBSTtnQkFDcEIsVUFBVSxFQUFFLElBQUk7YUFDakI7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxPQUFPLEdBQ1gsK0JBQStCO1lBQy9CLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsY0FBYyxDQUFDLFlBQVksQ0FDekIsVUFBVSxFQUNWLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxtQkFBbUIsT0FBTyxDQUN0RCxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO3dHQWpFVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qiw2SEF4UXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9IVCxvbUVBckhTLFlBQVksK0JBQUUsZ0JBQWdCOzs0RkF5UTdCLHdCQUF3QjtrQkE1UXBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxZQUMvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvSFQsbUJBa0pnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBvdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlc2lnbmVyU3RhdGVTZXJ2aWNlLCBEZXNpZ25lclZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydEdyaWREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtZGVzaWduZXItdG9vbGJhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJwdEljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvb3RcIj5cbiAgICAgIDwhLS0gTGVmdDogVGl0bGUgJiBEaXJ0eSBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtaWRlbnRpdHlcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcG9ydC1uYW1lXCI+e3sgZGVmaW5pdGlvbigpLm5hbWUgfHwgJ1VudGl0bGVkIFJlcG9ydCcgfX08L3NwYW4+XG4gICAgICAgICAgQGlmIChpc0RpcnR5KCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHktYmFkZ2VcIiB0aXRsZT1cIlVuc2F2ZWQgY2hhbmdlc1wiPuKXjyBVbnNhdmVkPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDZW50ZXI6IE1vZGUgU3dpdGNoZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGUtcGlsbC1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInZpZXdNb2RlKCkgPT09ICdkZXNpZ24nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdkZXNpZ24nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+RGVzaWduPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInZpZXdNb2RlKCkgPT09ICdwcmV2aWV3J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgncHJldmlldycpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImV5ZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkxpdmUgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJ2aWV3TW9kZSgpID09PSAnanNvbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2pzb24nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+SlNPTiBTY2hlbWE8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmlnaHQ6IFVuZG8sIFJlZG8sIFNhdmUsIEV4cG9ydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaXN0b3J5LWdyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuVW5kbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1bmRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJVbmRvIChDdHJsK1opXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVuZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVkbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZWRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJSZWRvIChDdHJsK1kpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIEFkZCAvIENvbmZpZ3VyZSBHcmlkIFF1aWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgQGlmICghZGVmaW5pdGlvbigpLmdyaWQpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWdyaWQtYWN0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRSZXN1bHRHcmlkKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJBdHRhY2ggYSBSZXN1bHQgRGF0YSBHcmlkIChVbHRyYUdyaWQgLyBUYWJsZSkgdG8gdGhpcyByZXBvcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidGFibGVcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj4rIEFkZCBHcmlkPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWdyaWQtY29uZmlndXJlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0R3JpZFNldHRpbmdzKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb25maWd1cmUgUmVzdWx0IERhdGEgR3JpZCBjb2x1bW5zIGFuZCBwYWdpbmF0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+R3JpZCAoe3sgZGVmaW5pdGlvbigpLmdyaWQ/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwIH19KTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tZXhwb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0SnNvbigpXCJcbiAgICAgICAgICB0aXRsZT1cIkRvd25sb2FkIEpTT04gRGVmaW5pdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRvd25sb2FkXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLXNhdmVcIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlUmVwb3J0KClcIlxuICAgICAgICAgIHRpdGxlPVwiU2F2ZSBSZXBvcnQgRGVmaW5pdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNhdmVcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGhlaWdodDogNTZweDtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxZTI5M2I7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAudG9vbGJhci1yb290IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgcGFkZGluZzogMCAyMHB4O1xuICAgIH1cbiAgICAudG9vbGJhci1sZWZ0LCAudG9vbGJhci1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIG1pbi13aWR0aDogMjQwcHg7XG4gICAgfVxuICAgIC50b29sYmFyLXJpZ2h0IHtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgfVxuICAgIC50b29sYmFyLWNlbnRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAucmVwb3J0LWlkZW50aXR5IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuICAgIC5yZXBvcnQtbmFtZSB7XG4gICAgICBmb250LXNpemU6IDAuOTVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTtcbiAgICB9XG4gICAgLmRpcnR5LWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogI2Y1OWUwYjtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjE1KTtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuICAgIC5tb2RlLXBpbGwtZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBnYXA6IDJweDtcbiAgICB9XG4gICAgLm1vZGUtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDE0cHg7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBlYXNlO1xuICAgIH1cbiAgICAubW9kZS1idG46aG92ZXIge1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5tb2RlLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogIzI1NjNlYjtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICB9XG4gICAgLmhpc3RvcnktZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAudG9vbC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIHBhZGRpbmc6IDAgMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTtcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC50b29sLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC50b29sLWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgICAuYWN0aW9ucy1kaXZpZGVyIHtcbiAgICAgIHdpZHRoOiAxcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpO1xuICAgIH1cbiAgICAuYnRuLXNhdmUge1xuICAgICAgYmFja2dyb3VuZDogIzI1NjNlYjtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuYnRuLXNhdmU6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogIzFkNGVkODtcbiAgICAgIGJvcmRlci1jb2xvcjogIzFkNGVkODtcbiAgICB9XG4gICAgLmJ0bi1leHBvcnQge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIC5idG4tZ3JpZC1hY3Rpb24ge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNiwgMTg1LCAxMjksIDAuMTUpO1xuICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE2LCAxODUsIDEyOSwgMC40KTtcbiAgICAgIGNvbG9yOiAjMzRkMzk5O1xuICAgIH1cbiAgICAuYnRuLWdyaWQtYWN0aW9uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTYsIDE4NSwgMTI5LCAwLjI1KTtcbiAgICAgIGNvbG9yOiAjNmVlN2I3O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMTBiOTgxO1xuICAgIH1cbiAgICAuYnRuLWdyaWQtY29uZmlndXJlZCB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxMDIsIDI0MSwgMC4xNSk7XG4gICAgICBib3JkZXItY29sb3I6IHJnYmEoOTksIDEwMiwgMjQxLCAwLjM1KTtcbiAgICAgIGNvbG9yOiAjYTViNGZjO1xuICAgIH1cbiAgICAuYnRuLWdyaWQtY29uZmlndXJlZDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxMDIsIDI0MSwgMC4yNSk7XG4gICAgICBjb2xvcjogI2M3ZDJmZTtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJUb29sYmFyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gdGhpcy5kZXNpZ25lclN0YXRlLmRlZmluaXRpb247XG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gdGhpcy5kZXNpZ25lclN0YXRlLnZpZXdNb2RlO1xuICByZWFkb25seSBpc0RpcnR5ID0gdGhpcy5kZXNpZ25lclN0YXRlLmlzRGlydHk7XG4gIHJlYWRvbmx5IGNhblVuZG8gPSB0aGlzLmRlc2lnbmVyU3RhdGUuY2FuVW5kbztcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IHRoaXMuZGVzaWduZXJTdGF0ZS5jYW5SZWRvO1xuXG4gIHJlYWRvbmx5IHNhdmVSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBzZXRNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0Vmlld01vZGUobW9kZSk7XG4gIH1cblxuICB1bmRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51bmRvKCk7XG4gIH1cblxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5yZWRvKCk7XG4gIH1cblxuICBzYXZlUmVwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZVJlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICBhZGRSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlc1swXTtcbiAgICBjb25zdCBkZWZhdWx0R3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICBkYXRhU291cmNlSWQ6IGV4aXN0aW5nRHM/LmlkID8/ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ2lkJywgbGFiZWw6ICdJRCcsIGRhdGFUeXBlOiAnbnVtYmVyJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBkYXRhVHlwZTogJ3N0cmluZycsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3MoZGVmYXVsdEdyaWQpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYignZ3JpZCcpO1xuICB9XG5cbiAgc2VsZWN0R3JpZFNldHRpbmdzKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYignZ3JpZCcpO1xuICB9XG5cbiAgZXhwb3J0SnNvbigpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhU3RyID1cbiAgICAgICdkYXRhOnRleHQvanNvbjtjaGFyc2V0PXV0Zi04LCcgK1xuICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHRoaXMuZGVmaW5pdGlvbigpLCBudWxsLCAyKSk7XG4gICAgY29uc3QgZG93bmxvYWRBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZG93bmxvYWRBbmNob3Iuc2V0QXR0cmlidXRlKCdocmVmJywgZGF0YVN0cik7XG4gICAgZG93bmxvYWRBbmNob3Iuc2V0QXR0cmlidXRlKFxuICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgIGAke3RoaXMuZGVmaW5pdGlvbigpLmlkIHx8ICdyZXBvcnQtZGVmaW5pdGlvbid9Lmpzb25gXG4gICAgKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkQW5jaG9yKTtcbiAgICBkb3dubG9hZEFuY2hvci5jbGljaygpO1xuICAgIGRvd25sb2FkQW5jaG9yLnJlbW92ZSgpO1xuICB9XG59XG4iXX0=
464
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Rvb2xiYXIvZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFFN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFtQixNQUFNLHdDQUF3QyxDQUFDOztBQXluQmhHLE1BQU0sT0FBTyx3QkFBd0I7SUFDbEIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzdDLGVBQWUsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUV4RCxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDM0MsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNyQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBRXJDLG9CQUFvQixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUM5QyxtQkFBbUIsR0FB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Q0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlc2lnbmVyU3RhdGVTZXJ2aWNlLCBEZXNpZ25lclZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydEdyaWREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0VGVtcGxhdGVTZXJ2aWNlLCBSZXBvcnRCbHVlcHJpbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtdGVtcGxhdGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1kZXNpZ25lci10b29sYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcm9vdFwiPlxuICAgICAgPCEtLSBMZWZ0OiBQYW5lbCB0b2dnbGUsIFRpdGxlICYgRGlydHkgaW5kaWNhdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItbGVmdFwiPlxuICAgICAgICBAaWYgKHZpZXdNb2RlKCkgPT09ICdkZXNpZ24nKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuIGJ0bi1wYW5lbC10b2dnbGVcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCIhaXNMZWZ0UGFuZWxDb2xsYXBzZWQoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGVmdFBhbmVsLmVtaXQoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiaXNMZWZ0UGFuZWxDb2xsYXBzZWQoKSA/ICdTaG93IENvbXBvbmVudCBQYWxldHRlIChDdHJsK0IpJyA6ICdIaWRlIENvbXBvbmVudCBQYWxldHRlIChDdHJsK0IpJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzTGVmdFBhbmVsQ29sbGFwc2VkKCkgPyAnU2hvdyBDb21wb25lbnQgUGFsZXR0ZSAoQ3RybCtCKScgOiAnSGlkZSBDb21wb25lbnQgUGFsZXR0ZSAoQ3RybCtCKSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGFuZWwtbGVmdFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LWlkZW50aXR5XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXBvcnQtbmFtZVwiPnt7IGRlZmluaXRpb24oKS5uYW1lIHx8ICdVbnRpdGxlZCBSZXBvcnQnIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoaXNEaXJ0eSgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5LWJhZGdlXCIgdGl0bGU9XCJVbnNhdmVkIGNoYW5nZXNcIj7il48gVW5zYXZlZDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2VudGVyOiBNb2RlIFN3aXRjaGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlLXBpbGwtZ3JvdXBcIiByb2xlPVwidGFibGlzdFwiIGFyaWEtbGFiZWw9XCJXb3JrYmVuY2ggVmlldyBNb2RlXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwidmlld01vZGUoKSA9PT0gJ2Rlc2lnbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2Rlc2lnbicpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVmlzdWFsIERlc2lnbiBDYW52YXNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZWRpdFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9kZS1sYWJlbFwiPkRlc2lnbjwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJ2aWV3TW9kZSgpID09PSAncHJldmlldydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ3ByZXZpZXcnKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkxpdmUgUnVudGltZSBQcmV2aWV3XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImV5ZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9kZS1sYWJlbFwiPlByZXZpZXc8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwidmlld01vZGUoKSA9PT0gJ2pzb24nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdqc29uJylcIlxuICAgICAgICAgICAgdGl0bGU9XCJKU09OIFJlcG9ydCBTY2hlbWFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9kZS1sYWJlbFwiPkpTT048L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmlnaHQ6IFVuZG8sIFJlZG8sIEJsdWVwcmludHMsIEdyaWQsIEV4cG9ydCwgU2F2ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaXN0b3J5LWdyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuVW5kbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1bmRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJVbmRvIChDdHJsK1opXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVuZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVkbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZWRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJSZWRvIChDdHJsK1kpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAodmlld01vZGUoKSA9PT0gJ2Rlc2lnbicpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLXBhbmVsLXRvZ2dsZVwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIiFpc1JpZ2h0UGFuZWxDb2xsYXBzZWQoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmlnaHRQYW5lbC5lbWl0KClcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImlzUmlnaHRQYW5lbENvbGxhcHNlZCgpID8gJ1Nob3cgUHJvcGVydHkgRWRpdG9yIChDdHJsK0FsdCtCKScgOiAnSGlkZSBQcm9wZXJ0eSBFZGl0b3IgKEN0cmwrQWx0K0IpJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzUmlnaHRQYW5lbENvbGxhcHNlZCgpID8gJ1Nob3cgUHJvcGVydHkgRWRpdG9yIChDdHJsK0FsdCtCKScgOiAnSGlkZSBQcm9wZXJ0eSBFZGl0b3IgKEN0cmwrQWx0K0IpJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwYW5lbC1yaWdodFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIDEtQ2xpY2sgQmx1ZXByaW50cyBHYWxsZXJ5IEJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWJsdWVwcmludHNcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuVGVtcGxhdGVzTW9kYWwoKVwiXG4gICAgICAgICAgdGl0bGU9XCJTdGFydCBmcm9tIHByZS1jb25maWd1cmVkIGVudGVycHJpc2UgYmx1ZXByaW50c1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImxheWVyc1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1sYWJlbFwiPkJsdWVwcmludHM8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gQWRkIC8gQ29uZmlndXJlIEdyaWQgUXVpY2sgQnV0dG9uIC0tPlxuICAgICAgICBAaWYgKCFkZWZpbml0aW9uKCkuZ3JpZCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tZ3JpZC1hY3Rpb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkF0dGFjaCBhIFJlc3VsdCBEYXRhIEdyaWQgKFVsdHJhR3JpZCAvIFRhYmxlKSB0byB0aGlzIHJlcG9ydFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWxhYmVsXCI+KyBBZGQgR3JpZDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuIGJ0bi1ncmlkLWNvbmZpZ3VyZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEdyaWRTZXR0aW5ncygpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ29uZmlndXJlIFJlc3VsdCBEYXRhIEdyaWQgY29sdW1ucyBhbmQgcGFnaW5hdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWxhYmVsXCI+R3JpZCAoe3sgZGVmaW5pdGlvbigpLmdyaWQ/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwIH19KTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tZXhwb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0SnNvbigpXCJcbiAgICAgICAgICB0aXRsZT1cIkRvd25sb2FkIEpTT04gRGVmaW5pdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRvd25sb2FkXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWxhYmVsXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tc2F2ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNhdmVSZXBvcnQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJTYXZlIFJlcG9ydCBEZWZpbml0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2F2ZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1sYWJlbFwiPlNhdmU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQmx1ZXByaW50cyBHYWxsZXJ5IE1vZGFsIC0tPlxuICAgICAgQGlmIChpc1RlbXBsYXRlc01vZGFsT3BlbigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtYmFja2Ryb3BcIiAoY2xpY2spPVwiY2xvc2VUZW1wbGF0ZXNNb2RhbCgpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsPVwiU3RhcnRlciBSZXBvcnQgQmx1ZXByaW50c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtbW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJibHVlcHJpbnQtbW9kYWwtdGl0bGVcIj5TdGFydGVyIFJlcG9ydCBCbHVlcHJpbnRzPC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJibHVlcHJpbnQtbW9kYWwtc3ViXCI+Q2hvb3NlIGEgcHJlLWNvbmZpZ3VyZWQgYXJjaGl0ZWN0dXJlIHBhdHRlcm4gdG8ganVtcHN0YXJ0IHJlcG9ydCBjcmVhdGlvbi48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlLW1vZGFsXCIgKGNsaWNrKT1cImNsb3NlVGVtcGxhdGVzTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtZ3JpZFwiPlxuICAgICAgICAgICAgQGZvciAoYnAgb2YgYXZhaWxhYmxlQmx1ZXByaW50czsgdHJhY2sgYnAuaWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsdWVwcmludC1jYXJkXCIgKGNsaWNrKT1cImFwcGx5Qmx1ZXByaW50KGJwLmlkKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtY2FyZC10b3BcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmx1ZXByaW50LWNhdC1iYWRnZVwiPnt7IGJwLmNhdGVnb3J5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsdWVwcmludC1jYXJkLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImJwLmljb24gfHwgJ3RhYmxlJ1wiIFtzaXplXT1cIjIwXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cImJsdWVwcmludC1jYXJkLXRpdGxlXCI+e3sgYnAubmFtZSB9fTwvaDQ+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJibHVlcHJpbnQtY2FyZC1kZXNjXCI+e3sgYnAuZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsdWVwcmludC1jYXJkLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tYXBwbHktYmx1ZXByaW50XCI+XG4gICAgICAgICAgICAgICAgICAgIFVzZSBCbHVlcHJpbnQg4oaSXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLCAjZmZmZmZmKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBoZWlnaHQ6IDU2cHg7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBpbmhlcml0KTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcbiAgICAgIHotaW5kZXg6IDMwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC50b29sYmFyLXJvb3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBwYWRkaW5nOiAwIDE2cHg7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7XG4gICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAudG9vbGJhci1yb290Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAudG9vbGJhci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnRvb2xiYXItcmlnaHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIH1cbiAgICAudG9vbGJhci1jZW50ZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgfVxuICAgIC5yZXBvcnQtaWRlbnRpdHkge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG4gICAgLnJlcG9ydC1uYW1lIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBtYXgtd2lkdGg6IDIyMHB4O1xuICAgIH1cbiAgICAuZGlydHktYmFkZ2Uge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjYjQ1MzA5O1xuICAgICAgYmFja2dyb3VuZDogI2ZlZjNjNztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZGU2OGE7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAubW9kZS1waWxsLWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGdhcDogMnB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5tb2RlLWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAubW9kZS1idG46aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5tb2RlLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgfVxuICAgIC5oaXN0b3J5LWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDJweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAudG9vbC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LXNlY29uZGFyeSwgIzMzNDE1NSk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC50b29sLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZS1ob3ZlciwgI2Y4ZmFmYyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLWhvdmVyLCAjOTRhM2I4KTtcbiAgICB9XG4gICAgLnRvb2wtYnRuOmRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuNDU7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgICAuYnRuLXBhbmVsLXRvZ2dsZSB7XG4gICAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG4gICAgLmJ0bi1wYW5lbC10b2dnbGU6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLWhvdmVyLCAjZjhmYWZjKTtcbiAgICB9XG4gICAgLmJ0bi1wYW5lbC10b2dnbGUuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXItY29sb3I6ICNiZmRiZmU7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAuYWN0aW9ucy1kaXZpZGVyIHtcbiAgICAgIHdpZHRoOiAxcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuYnRuLWJsdWVwcmludHMge1xuICAgICAgYmFja2dyb3VuZDogI2ZhZjVmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2U5ZDVmZjtcbiAgICAgIGNvbG9yOiAjN2MzYWVkO1xuICAgIH1cbiAgICAuYnRuLWJsdWVwcmludHM6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2YzZThmZjtcbiAgICAgIGNvbG9yOiAjNmQyOGQ5O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYzA4NGZjO1xuICAgIH1cbiAgICAuYnRuLXNhdmUge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuICAgIC5idG4tc2F2ZTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWhvdmVyLCAjMWQ0ZWQ4KTtcbiAgICB9XG4gICAgLmJ0bi1leHBvcnQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1zZWNvbmRhcnksICMzMzQxNTUpO1xuICAgIH1cbiAgICAuYnRuLWdyaWQtYWN0aW9uIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGZkZjQ7XG4gICAgICBib3JkZXItY29sb3I6ICNiYmY3ZDA7XG4gICAgICBjb2xvcjogIzE2YTM0YTtcbiAgICB9XG4gICAgLmJ0bi1ncmlkLWFjdGlvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBib3JkZXItY29sb3I6ICM4NmVmYWM7XG4gICAgfVxuICAgIC5idG4tZ3JpZC1jb25maWd1cmVkIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXItY29sb3I6ICNiZmRiZmU7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICB9XG4gICAgLmJ0bi1ncmlkLWNvbmZpZ3VyZWQ6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTtcbiAgICAgIGNvbG9yOiAjMWQ0ZWQ4O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHtcbiAgICAgIC50b29sYmFyLXJvb3Qge1xuICAgICAgICBwYWRkaW5nOiAwIDEycHg7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgfVxuICAgICAgLnJlcG9ydC1uYW1lIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDtcbiAgICAgIH1cbiAgICAgIC5idG4tYmx1ZXByaW50cyAuYnRuLWxhYmVsLFxuICAgICAgLmJ0bi1leHBvcnQgLmJ0bi1sYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAudG9vbC1idG4ge1xuICAgICAgICBwYWRkaW5nOiA2cHggOXB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkge1xuICAgICAgOmhvc3Qge1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICB9XG4gICAgICAudG9vbGJhci1yb290IHtcbiAgICAgICAgcGFkZGluZzogMCA4cHg7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgfVxuICAgICAgLmJ0bi1wYW5lbC10b2dnbGUge1xuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAucmVwb3J0LW5hbWUge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMHB4O1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIH1cbiAgICAgIC5hY3Rpb25zLWRpdmlkZXIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgICAgLnRvb2wtYnRuIC5idG4tbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAudG9vbC1idG4ge1xuICAgICAgICBwYWRkaW5nOiA1cHggN3B4O1xuICAgICAgICBtaW4td2lkdGg6IDMwcHg7XG4gICAgICAgIGhlaWdodDogMzBweDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAubW9kZS1waWxsLWdyb3VwIHtcbiAgICAgICAgcGFkZGluZzogMnB4O1xuICAgICAgICBnYXA6IDFweDtcbiAgICAgIH1cbiAgICAgIC5tb2RlLWJ0biB7XG4gICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2ODBweCkge1xuICAgICAgOmhvc3Qge1xuICAgICAgICBoZWlnaHQ6IDQ2cHg7XG4gICAgICB9XG4gICAgICAudG9vbGJhci1yb290IHtcbiAgICAgICAgcGFkZGluZzogMCA2cHg7XG4gICAgICAgIGdhcDogM3B4O1xuICAgICAgfVxuICAgICAgLnJlcG9ydC1uYW1lIHtcbiAgICAgICAgbWF4LXdpZHRoOiA3NXB4O1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICB9XG4gICAgICAuZGlydHktYmFkZ2Uge1xuICAgICAgICBmb250LXNpemU6IDAuNnJlbTtcbiAgICAgICAgcGFkZGluZzogMXB4IDRweDtcbiAgICAgIH1cbiAgICAgIC5tb2RlLWJ0biAubW9kZS1sYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgICAubW9kZS1idG4ge1xuICAgICAgICBwYWRkaW5nOiA1cHggOHB4O1xuICAgICAgfVxuICAgICAgLnRvb2wtYnRuIHtcbiAgICAgICAgbWluLXdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCA2cHg7XG4gICAgICB9XG4gICAgICAudG9vbGJhci1yaWdodCB7XG4gICAgICAgIGdhcDogM3B4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEJsdWVwcmludHMgTW9kYWwgKi9cbiAgICAuYmx1ZXByaW50LWJhY2tkcm9wIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjQ1KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgei1pbmRleDogMjAwMDtcbiAgICAgIGFuaW1hdGlvbjogcnB0LWZhZGUtaW4gMTUwbXMgZWFzZS1vdXQ7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtbW9kYWwge1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgdG9wOiA1MCU7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgIHdpZHRoOiBtaW4oODQwcHgsIDkydncpO1xuICAgICAgbWF4LWhlaWdodDogODV2aDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLXhsLCAxMnB4KTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LXhsLCAwIDIwcHggMjVweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSkpO1xuICAgICAgei1pbmRleDogMjAwMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGFuaW1hdGlvbjogcnB0LW1vZGFsLWluIDE4MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHJwdC1mYWRlLWluIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtbW9kYWwtaW4ge1xuICAgICAgZnJvbSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC00NiUpIHNjYWxlKDAuOTYpOyBvcGFjaXR5OiAwOyB9XG4gICAgICB0byB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOyBvcGFjaXR5OiAxOyB9XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtbW9kYWwtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDIwcHggMjRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLCAjZjhmYWZjKTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1tb2RhbC10aXRsZSB7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtbGcsIDEuMTI1cmVtKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgbWFyZ2luOiAwIDAgNHB4IDA7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtbW9kYWwtc3ViIHtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgICAuYnRuLWNsb3NlLW1vZGFsIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tY2xvc2UtbW9kYWw6aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtZ3JpZCB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNDBweCwgMWZyKSk7XG4gICAgICBnYXA6IDE2cHg7XG4gICAgICBwYWRkaW5nOiAyMHB4IDI0cHg7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIH1cbiAgICAuYmx1ZXByaW50LWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkOmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xuICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjEyKTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkLXRvcCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2F0LWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzdjM2FlZDtcbiAgICAgIGJhY2tncm91bmQ6ICNmNWYzZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkNmZlO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkLWljb24ge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkLXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1iYXNlLCAwLjg3NXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIG1hcmdpbjogMCAwIDZweCAwO1xuICAgIH1cbiAgICAuYmx1ZXByaW50LWNhcmQtZGVzYyB7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICBtYXJnaW46IDAgMCAxNnB4IDA7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAuYmx1ZXByaW50LWNhcmQtZm9vdGVyIHtcbiAgICAgIG1hcmdpbi10b3A6IGF1dG87XG4gICAgfVxuICAgIC5idG4tYXBwbHktYmx1ZXByaW50IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkOmhvdmVyIC5idG4tYXBwbHktYmx1ZXByaW50IHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWhvdmVyLCAjMWQ0ZWQ4KTtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJUb29sYmFyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVNlcnZpY2UgPSBpbmplY3QoUmVwb3J0VGVtcGxhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gdGhpcy5kZXNpZ25lclN0YXRlLmRlZmluaXRpb247XG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gdGhpcy5kZXNpZ25lclN0YXRlLnZpZXdNb2RlO1xuICByZWFkb25seSBpc0RpcnR5ID0gdGhpcy5kZXNpZ25lclN0YXRlLmlzRGlydHk7XG4gIHJlYWRvbmx5IGNhblVuZG8gPSB0aGlzLmRlc2lnbmVyU3RhdGUuY2FuVW5kbztcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IHRoaXMuZGVzaWduZXJTdGF0ZS5jYW5SZWRvO1xuXG4gIHJlYWRvbmx5IGlzVGVtcGxhdGVzTW9kYWxPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlQmx1ZXByaW50czogUmVwb3J0Qmx1ZXByaW50W10gPSB0aGlzLnRlbXBsYXRlU2VydmljZS5nZXRUZW1wbGF0ZXMoKTtcblxuICByZWFkb25seSBpc0xlZnRQYW5lbENvbGxhcHNlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNSaWdodFBhbmVsQ29sbGFwc2VkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB0b2dnbGVMZWZ0UGFuZWwgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgdG9nZ2xlUmlnaHRQYW5lbCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHNhdmVSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBzZXRNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0Vmlld01vZGUobW9kZSk7XG4gIH1cblxuICB1bmRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51bmRvKCk7XG4gIH1cblxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5yZWRvKCk7XG4gIH1cblxuICBzYXZlUmVwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZVJlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICBvcGVuVGVtcGxhdGVzTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1RlbXBsYXRlc01vZGFsT3Blbi5zZXQodHJ1ZSk7XG4gIH1cblxuICBjbG9zZVRlbXBsYXRlc01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNUZW1wbGF0ZXNNb2RhbE9wZW4uc2V0KGZhbHNlKTtcbiAgfVxuXG4gIGFwcGx5Qmx1ZXByaW50KGJsdWVwcmludElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdEZWYgPSB0aGlzLnRlbXBsYXRlU2VydmljZS5pbnN0YW50aWF0ZVRlbXBsYXRlKGJsdWVwcmludElkKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUubG9hZERlZmluaXRpb24obmV3RGVmKTtcbiAgICB0aGlzLmNsb3NlVGVtcGxhdGVzTW9kYWwoKTtcbiAgfVxuXG4gIGFkZFJlc3VsdEdyaWQoKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdEcyA9IHRoaXMuZGVmaW5pdGlvbigpLmRhdGFTb3VyY2VzWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRHcmlkOiBSZXBvcnRHcmlkRGVmaW5pdGlvbiA9IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogZXhpc3RpbmdEcz8uaWQgPz8gJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGZpZWxkOiAnaWQnLCBsYWJlbDogJ0lEJywgZGF0YVR5cGU6ICdudW1iZXInLCB2aXNpYmxlOiB0cnVlLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IGZpZWxkOiAnbmFtZScsIGxhYmVsOiAnTmFtZScsIGRhdGFUeXBlOiAnc3RyaW5nJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIF0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZ2luYXRpb246IHRydWUsXG4gICAgICAgIHBhZ2VTaXplOiAyNSxcbiAgICAgICAgc2hvd1Jvd051bWJlcnM6IHRydWUsXG4gICAgICAgIHNob3dGb290ZXI6IHRydWUsXG4gICAgICAgIHNpZGVCYXI6IHRydWUsXG4gICAgICAgIGdsb2JhbFNlYXJjaDogdHJ1ZSxcbiAgICAgICAgc3RhdHVzQmFyOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3MoZGVmYXVsdEdyaWQpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYignZ3JpZCcpO1xuICB9XG5cbiAgc2VsZWN0R3JpZFNldHRpbmdzKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYignZ3JpZCcpO1xuICB9XG5cbiAgZXhwb3J0SnNvbigpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhU3RyID1cbiAgICAgICdkYXRhOnRleHQvanNvbjtjaGFyc2V0PXV0Zi04LCcgK1xuICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHRoaXMuZGVmaW5pdGlvbigpLCBudWxsLCAyKSk7XG4gICAgY29uc3QgZG93bmxvYWRBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZG93bmxvYWRBbmNob3Iuc2V0QXR0cmlidXRlKCdocmVmJywgZGF0YVN0cik7XG4gICAgZG93bmxvYWRBbmNob3Iuc2V0QXR0cmlidXRlKFxuICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgIGAke3RoaXMuZGVmaW5pdGlvbigpLmlkIHx8ICdyZXBvcnQtZGVmaW5pdGlvbid9Lmpzb25gXG4gICAgKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkQW5jaG9yKTtcbiAgICBkb3dubG9hZEFuY2hvci5jbGljaygpO1xuICAgIGRvd25sb2FkQW5jaG9yLnJlbW92ZSgpO1xuICB9XG59XG4iXX0=