bways-report 0.1.4 → 0.1.6
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.
- package/README.md +75 -35
- package/esm2022/lib/core/services/index.mjs +3 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +135 -0
- package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
- package/esm2022/lib/core/tokens/index.mjs +2 -1
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
- package/esm2022/lib/core/utils/identifier-humanizer.mjs +15 -4
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +17 -8
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +3 -371
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +69 -1023
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +345 -213
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +39 -32
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +35 -679
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +97 -949
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +112 -585
- package/esm2022/lib/features/designer/designer.component.mjs +3 -3
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +62 -2
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +115 -19
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +31 -423
- package/esm2022/lib/provide-reporting.mjs +20 -5
- package/fesm2022/bways-report.mjs +2263 -5342
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/services/index.d.ts +2 -0
- package/lib/core/services/report-data-discovery.service.d.ts +38 -0
- package/lib/core/services/report-storage.service.d.ts +26 -0
- package/lib/core/tokens/index.d.ts +2 -0
- package/lib/core/tokens/reporting-config.token.d.ts +2 -0
- package/lib/core/tokens/storage.token.d.ts +48 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +2 -1
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +5 -1
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +5 -0
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +3 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +31 -1
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +19 -0
- package/lib/features/designer/services/designer-state.service.d.ts +12 -1
- package/lib/features/runtime/report-grid-bridge.component.d.ts +8 -58
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +3 -0
- package/lib/provide-reporting.d.ts +6 -0
- package/package.json +9 -1
|
@@ -32,6 +32,54 @@ export class ParameterBindingEditorComponent {
|
|
|
32
32
|
return 'Text';
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
|
+
isCurrentValue = (val) => {
|
|
36
|
+
return String(this.currentValue()) === String(val);
|
|
37
|
+
};
|
|
38
|
+
paramQuickSuggestions = computed(() => {
|
|
39
|
+
const name = this.param().name.toLowerCase().replace(/^@/, '');
|
|
40
|
+
if (name === 'inttranorduedate') {
|
|
41
|
+
return [
|
|
42
|
+
{ label: '0: Transaction Date', value: 0 },
|
|
43
|
+
{ label: '1: Due Date', value: 1 },
|
|
44
|
+
{ label: '2: GIR Date', value: 2 },
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
if (name === 'intonlydue') {
|
|
48
|
+
return [
|
|
49
|
+
{ label: '0: All Bills', value: 0 },
|
|
50
|
+
{ label: '1: Only Due Bills', value: 1 },
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
if (name === 'intvalue') {
|
|
54
|
+
return [
|
|
55
|
+
{ label: '11: Customer Ledger', value: 11 },
|
|
56
|
+
{ label: '12: Supplier Ledger', value: 12 },
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
if (name === 'chrcompanyid') {
|
|
60
|
+
return [
|
|
61
|
+
{ label: '101: Default Co', value: '101' },
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
if (name === 'chrcompunitid') {
|
|
65
|
+
return [
|
|
66
|
+
{ label: '101: Unit 101', value: '101' },
|
|
67
|
+
{ label: '101,102,103: All Units', value: '101,102,103' },
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
if (name === 'chrsubacnolist') {
|
|
71
|
+
return [
|
|
72
|
+
{ label: '0: All Accounts', value: '0' },
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
if (name === 'intwithcity') {
|
|
76
|
+
return [
|
|
77
|
+
{ label: '0: No', value: 0 },
|
|
78
|
+
{ label: '1: Yes', value: 1 },
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
});
|
|
35
83
|
compatibleControls = computed(() => {
|
|
36
84
|
return this.allComponents().filter((c) => c.id !== this.currentComponentId());
|
|
37
85
|
});
|
|
@@ -48,9 +96,6 @@ export class ParameterBindingEditorComponent {
|
|
|
48
96
|
if (this.sessionMatch() !== null && (!val || val.startsWith('{{session.'))) {
|
|
49
97
|
return 'session';
|
|
50
98
|
}
|
|
51
|
-
if (!val) {
|
|
52
|
-
return this.compatibleControls().length > 0 ? 'control' : 'fixed';
|
|
53
|
-
}
|
|
54
99
|
if (val.startsWith('{{context.')) {
|
|
55
100
|
return 'context';
|
|
56
101
|
}
|
|
@@ -69,6 +114,19 @@ export class ParameterBindingEditorComponent {
|
|
|
69
114
|
if (plainMatch) {
|
|
70
115
|
return 'control';
|
|
71
116
|
}
|
|
117
|
+
if (!val) {
|
|
118
|
+
// Smart default: numeric or flag parameters default to 'fixed' (Enter Value)
|
|
119
|
+
const name = this.param().name.toLowerCase();
|
|
120
|
+
if (this.param().dataType === 'number' ||
|
|
121
|
+
name.startsWith('int') ||
|
|
122
|
+
name.includes('flag') ||
|
|
123
|
+
name.includes('type') ||
|
|
124
|
+
name.includes('only')) {
|
|
125
|
+
return 'fixed';
|
|
126
|
+
}
|
|
127
|
+
// If there are compatible form fields on canvas, default to control, otherwise fixed
|
|
128
|
+
return this.compatibleControls().length > 0 ? 'control' : 'fixed';
|
|
129
|
+
}
|
|
72
130
|
return 'fixed';
|
|
73
131
|
});
|
|
74
132
|
isAutoSessionDerived = computed(() => {
|
|
@@ -107,10 +165,18 @@ export class ParameterBindingEditorComponent {
|
|
|
107
165
|
return;
|
|
108
166
|
}
|
|
109
167
|
if (mode === 'fixed') {
|
|
110
|
-
|
|
168
|
+
const current = this.currentValue();
|
|
169
|
+
if (current !== undefined && current !== null && current !== '' && !String(current).startsWith('{{')) {
|
|
170
|
+
this.valueChange.emit(current);
|
|
171
|
+
}
|
|
172
|
+
else if (this.param().dataType === 'boolean') {
|
|
111
173
|
const def = this.param().defaultValue !== undefined ? Boolean(this.param().defaultValue) : true;
|
|
112
174
|
this.valueChange.emit(def);
|
|
113
175
|
}
|
|
176
|
+
else if (this.param().dataType === 'number') {
|
|
177
|
+
const def = this.param().defaultValue !== undefined ? Number(this.param().defaultValue) : 0;
|
|
178
|
+
this.valueChange.emit(def);
|
|
179
|
+
}
|
|
114
180
|
else {
|
|
115
181
|
this.valueChange.emit('');
|
|
116
182
|
}
|
|
@@ -167,14 +233,12 @@ export class ParameterBindingEditorComponent {
|
|
|
167
233
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ParameterBindingEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
168
234
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ParameterBindingEditorComponent, isStandalone: true, selector: "rpt-parameter-binding-editor", inputs: { param: { classPropertyName: "param", publicName: "param", isSignal: true, isRequired: true, transformFunction: null }, currentValue: { classPropertyName: "currentValue", publicName: "currentValue", isSignal: true, isRequired: false, transformFunction: null }, allComponents: { classPropertyName: "allComponents", publicName: "allComponents", isSignal: true, isRequired: false, transformFunction: null }, currentComponentId: { classPropertyName: "currentComponentId", publicName: "currentComponentId", isSignal: true, isRequired: false, transformFunction: null }, isAdvancedMode: { classPropertyName: "isAdvancedMode", publicName: "isAdvancedMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", linkedFieldChange: "linkedFieldChange" }, ngImport: i0, template: `
|
|
169
235
|
<div class="param-card" [class.session-bound]="isAutoSessionDerived()">
|
|
236
|
+
<!-- Card Header: Title, Technical Name, Type, and Badges -->
|
|
170
237
|
<div class="param-header">
|
|
171
238
|
<div class="param-title-wrap">
|
|
172
|
-
<span class="param-label">{{ friendlyLabel() }}</span>
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
} @else {
|
|
176
|
-
<span class="param-type-badge">{{ displayType() }}</span>
|
|
177
|
-
}
|
|
239
|
+
<span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
|
|
240
|
+
<span class="param-tech-badge">{{ param().name }}</span>
|
|
241
|
+
<span class="param-type-badge">{{ displayType() }}</span>
|
|
178
242
|
@if (isAutoSessionDerived()) {
|
|
179
243
|
<span class="session-auto-badge">Auto Session</span>
|
|
180
244
|
} @else if (param().required && !hasValue()) {
|
|
@@ -182,80 +246,88 @@ export class ParameterBindingEditorComponent {
|
|
|
182
246
|
}
|
|
183
247
|
</div>
|
|
184
248
|
|
|
185
|
-
<!-- Binding Mode
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
@if (sessionMatch()) {
|
|
189
|
-
<button
|
|
190
|
-
type="button"
|
|
191
|
-
class="mode-btn"
|
|
192
|
-
[class.active]="activeMode() === 'session'"
|
|
193
|
-
(click)="setMode('session')"
|
|
194
|
-
title="Auto-bound to host session context"
|
|
195
|
-
>
|
|
196
|
-
<rpt-icon name="user" [size]="10" />
|
|
197
|
-
<span>Session</span>
|
|
198
|
-
</button>
|
|
199
|
-
}
|
|
200
|
-
<button
|
|
201
|
-
type="button"
|
|
202
|
-
class="mode-btn"
|
|
203
|
-
[class.active]="activeMode() === 'control'"
|
|
204
|
-
(click)="setMode('control')"
|
|
205
|
-
title="Link value to another field on canvas (e.g. Branch dropdown)"
|
|
206
|
-
>
|
|
207
|
-
<rpt-icon name="link" [size]="10" />
|
|
208
|
-
<span>Form Field</span>
|
|
209
|
-
</button>
|
|
249
|
+
<!-- Binding Mode Segmented Selector -->
|
|
250
|
+
<div class="binding-mode-tabs" role="tablist">
|
|
251
|
+
@if (sessionMatch()) {
|
|
210
252
|
<button
|
|
211
253
|
type="button"
|
|
212
254
|
class="mode-btn"
|
|
213
|
-
[class.active]="activeMode() === '
|
|
214
|
-
(click)="setMode('
|
|
215
|
-
title="
|
|
255
|
+
[class.active]="activeMode() === 'session'"
|
|
256
|
+
(click)="setMode('session')"
|
|
257
|
+
title="Bound to session user/branch context"
|
|
216
258
|
>
|
|
217
|
-
<rpt-icon name="
|
|
218
|
-
<span>
|
|
259
|
+
<rpt-icon name="user" [size]="11" />
|
|
260
|
+
<span>Session</span>
|
|
219
261
|
</button>
|
|
262
|
+
}
|
|
263
|
+
<button
|
|
264
|
+
type="button"
|
|
265
|
+
class="mode-btn"
|
|
266
|
+
[class.active]="activeMode() === 'control'"
|
|
267
|
+
(click)="setMode('control')"
|
|
268
|
+
title="Link value to a form field on canvas (e.g. Dropdown, DatePicker)"
|
|
269
|
+
>
|
|
270
|
+
<rpt-icon name="link" [size]="11" />
|
|
271
|
+
<span>Form Field</span>
|
|
272
|
+
</button>
|
|
273
|
+
<button
|
|
274
|
+
type="button"
|
|
275
|
+
class="mode-btn"
|
|
276
|
+
[class.active]="activeMode() === 'fixed'"
|
|
277
|
+
(click)="setMode('fixed')"
|
|
278
|
+
title="Type a manual or fixed value (e.g. 1, 0, 101)"
|
|
279
|
+
>
|
|
280
|
+
<rpt-icon name="edit" [size]="11" />
|
|
281
|
+
<span>Fixed Value</span>
|
|
282
|
+
</button>
|
|
283
|
+
<button
|
|
284
|
+
type="button"
|
|
285
|
+
class="mode-btn"
|
|
286
|
+
[class.active]="activeMode() === 'context'"
|
|
287
|
+
(click)="setMode('context')"
|
|
288
|
+
title="Use system date presets (e.g. Today, Month Start)"
|
|
289
|
+
>
|
|
290
|
+
<rpt-icon name="clock" [size]="11" />
|
|
291
|
+
<span>Preset</span>
|
|
292
|
+
</button>
|
|
293
|
+
@if (isAdvancedMode()) {
|
|
220
294
|
<button
|
|
221
295
|
type="button"
|
|
222
296
|
class="mode-btn"
|
|
223
|
-
[class.active]="activeMode() === '
|
|
224
|
-
(click)="setMode('
|
|
225
|
-
title="
|
|
297
|
+
[class.active]="activeMode() === 'custom'"
|
|
298
|
+
(click)="setMode('custom')"
|
|
299
|
+
title="Manual template expression"
|
|
226
300
|
>
|
|
227
|
-
<rpt-icon name="
|
|
228
|
-
<span>
|
|
301
|
+
<rpt-icon name="code" [size]="11" />
|
|
302
|
+
<span>Expr</span>
|
|
229
303
|
</button>
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
type="button"
|
|
233
|
-
class="mode-btn"
|
|
234
|
-
[class.active]="activeMode() === 'custom'"
|
|
235
|
-
(click)="setMode('custom')"
|
|
236
|
-
title="Manual expression with {{ '{{' }}mustache{{ '}}' }}"
|
|
237
|
-
>
|
|
238
|
-
<rpt-icon name="code" [size]="10" />
|
|
239
|
-
<span>Expr</span>
|
|
240
|
-
</button>
|
|
241
|
-
}
|
|
242
|
-
</div>
|
|
243
|
-
}
|
|
304
|
+
}
|
|
305
|
+
</div>
|
|
244
306
|
</div>
|
|
245
307
|
|
|
246
308
|
<!-- Mode-specific Input Controls -->
|
|
247
309
|
<div class="param-body">
|
|
248
|
-
<!-- 0. AUTO SESSION DERIVED
|
|
310
|
+
<!-- 0. AUTO SESSION DERIVED -->
|
|
249
311
|
@if (activeMode() === 'session' && sessionMatch()) {
|
|
250
312
|
<div class="session-box">
|
|
251
313
|
<div class="session-box-text">
|
|
252
|
-
<rpt-icon name="user" [size]="
|
|
314
|
+
<rpt-icon name="user" [size]="13" class="session-icon" />
|
|
253
315
|
<span>
|
|
254
316
|
Derived from <strong>{{ sessionMatch()?.sessionKey }}</strong> ({{ sessionMatch()?.friendlyLabel }})
|
|
255
317
|
</span>
|
|
256
318
|
</div>
|
|
257
|
-
<div class="session-
|
|
258
|
-
|
|
319
|
+
<div class="session-box-actions">
|
|
320
|
+
<div class="session-val-tag">
|
|
321
|
+
Current: <strong>{{ sessionMatch()?.value ?? '(none)' }}</strong>
|
|
322
|
+
</div>
|
|
323
|
+
<button
|
|
324
|
+
type="button"
|
|
325
|
+
class="btn-session-override"
|
|
326
|
+
(click)="setMode('fixed')"
|
|
327
|
+
title="Override with manual value"
|
|
328
|
+
>
|
|
329
|
+
Override
|
|
330
|
+
</button>
|
|
259
331
|
</div>
|
|
260
332
|
</div>
|
|
261
333
|
}
|
|
@@ -263,7 +335,7 @@ export class ParameterBindingEditorComponent {
|
|
|
263
335
|
<!-- 1. FORM CONTROL LINKER -->
|
|
264
336
|
@if (activeMode() === 'control') {
|
|
265
337
|
<div class="linker-row">
|
|
266
|
-
<rpt-icon name="link" [size]="
|
|
338
|
+
<rpt-icon name="link" [size]="13" class="linker-icon" />
|
|
267
339
|
<select
|
|
268
340
|
class="field-select linker-select"
|
|
269
341
|
[ngModel]="selectedControlKey()"
|
|
@@ -278,11 +350,11 @@ export class ParameterBindingEditorComponent {
|
|
|
278
350
|
</select>
|
|
279
351
|
</div>
|
|
280
352
|
@if (!selectedControlKey() && compatibleControls().length === 0) {
|
|
281
|
-
<div class="empty-hint">No
|
|
353
|
+
<div class="empty-hint">No input fields on canvas. Add a dropdown, date picker, or input first.</div>
|
|
282
354
|
}
|
|
283
355
|
}
|
|
284
356
|
|
|
285
|
-
<!-- 2. FIXED VALUE -->
|
|
357
|
+
<!-- 2. ENTER FIXED VALUE -->
|
|
286
358
|
@if (activeMode() === 'fixed') {
|
|
287
359
|
@switch (param().dataType) {
|
|
288
360
|
@case ('boolean') {
|
|
@@ -292,63 +364,90 @@ export class ParameterBindingEditorComponent {
|
|
|
292
364
|
[ngModel]="booleanFixedValue()"
|
|
293
365
|
(ngModelChange)="onBooleanChanged($event)"
|
|
294
366
|
/>
|
|
295
|
-
<span class="toggle-text">{{ booleanFixedValue() ? 'Active / Yes' : 'Inactive / No' }}</span>
|
|
367
|
+
<span class="toggle-text">{{ booleanFixedValue() ? 'Active / Yes (1)' : 'Inactive / No (0)' }}</span>
|
|
296
368
|
</label>
|
|
297
369
|
}
|
|
298
370
|
@case ('number') {
|
|
299
|
-
<input
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
371
|
+
<div class="input-wrap">
|
|
372
|
+
<input
|
|
373
|
+
type="number"
|
|
374
|
+
class="field-input"
|
|
375
|
+
placeholder="Enter number (e.g. 1, 0, 11)"
|
|
376
|
+
[ngModel]="currentValue()"
|
|
377
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
378
|
+
/>
|
|
379
|
+
</div>
|
|
306
380
|
}
|
|
307
381
|
@case ('date') {
|
|
308
|
-
<input
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
382
|
+
<div class="input-wrap">
|
|
383
|
+
<input
|
|
384
|
+
type="date"
|
|
385
|
+
class="field-input"
|
|
386
|
+
[ngModel]="currentValue()"
|
|
387
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
388
|
+
/>
|
|
389
|
+
</div>
|
|
314
390
|
}
|
|
315
391
|
@default {
|
|
316
|
-
<input
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
392
|
+
<div class="input-wrap">
|
|
393
|
+
<input
|
|
394
|
+
type="text"
|
|
395
|
+
class="field-input"
|
|
396
|
+
placeholder="Enter value (e.g. 101, text, code)"
|
|
397
|
+
[ngModel]="currentValue()"
|
|
398
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
399
|
+
/>
|
|
400
|
+
</div>
|
|
323
401
|
}
|
|
324
402
|
}
|
|
403
|
+
@if (paramQuickSuggestions().length > 0) {
|
|
404
|
+
<div class="quick-chips-row">
|
|
405
|
+
<span class="chips-label">Quick:</span>
|
|
406
|
+
@for (chip of paramQuickSuggestions(); track chip.value) {
|
|
407
|
+
<button
|
|
408
|
+
type="button"
|
|
409
|
+
class="chip-btn"
|
|
410
|
+
[class.active]="isCurrentValue(chip.value)"
|
|
411
|
+
(click)="onFixedValueChanged(chip.value)"
|
|
412
|
+
>
|
|
413
|
+
{{ chip.label }}
|
|
414
|
+
</button>
|
|
415
|
+
}
|
|
416
|
+
</div>
|
|
417
|
+
}
|
|
325
418
|
}
|
|
326
419
|
|
|
327
|
-
<!-- 3. SYSTEM
|
|
420
|
+
<!-- 3. SYSTEM DATE PRESETS -->
|
|
328
421
|
@if (activeMode() === 'context') {
|
|
329
|
-
<
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
422
|
+
<div class="input-wrap">
|
|
423
|
+
<select
|
|
424
|
+
class="field-select"
|
|
425
|
+
[ngModel]="selectedContextKey()"
|
|
426
|
+
(ngModelChange)="onContextSelected($event)"
|
|
427
|
+
>
|
|
428
|
+
<option value="">-- Choose Date / Context Preset --</option>
|
|
429
|
+
<option value="{{ '{{' }}context.today{{ '}}' }}">Today's Date</option>
|
|
430
|
+
<option value="{{ '{{' }}context.startOfMonth{{ '}}' }}">First Day of Current Month</option>
|
|
431
|
+
<option value="{{ '{{' }}context.endOfMonth{{ '}}' }}">Last Day of Current Month</option>
|
|
432
|
+
<option value="{{ '{{' }}context.startOfYear{{ '}}' }}">First Day of Current Year</option>
|
|
433
|
+
<option value="{{ '{{' }}context.yesterday{{ '}}' }}">Yesterday</option>
|
|
434
|
+
<option value="{{ '{{' }}context.branchId{{ '}}' }}">Current User Branch</option>
|
|
435
|
+
<option value="{{ '{{' }}context.userId{{ '}}' }}">Current User ID</option>
|
|
436
|
+
</select>
|
|
437
|
+
</div>
|
|
341
438
|
}
|
|
342
439
|
|
|
343
440
|
<!-- 4. CUSTOM EXPRESSION -->
|
|
344
441
|
@if (activeMode() === 'custom') {
|
|
345
|
-
<input
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
442
|
+
<div class="input-wrap">
|
|
443
|
+
<input
|
|
444
|
+
type="text"
|
|
445
|
+
class="field-input monospace-input"
|
|
446
|
+
placeholder="e.g. {{ '{{' }}form.dropdownField ?? 1{{ '}}' }}"
|
|
447
|
+
[ngModel]="currentValue()"
|
|
448
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
449
|
+
/>
|
|
450
|
+
</div>
|
|
352
451
|
}
|
|
353
452
|
</div>
|
|
354
453
|
|
|
@@ -356,20 +455,18 @@ export class ParameterBindingEditorComponent {
|
|
|
356
455
|
<div class="param-desc">{{ param().description }}</div>
|
|
357
456
|
}
|
|
358
457
|
</div>
|
|
359
|
-
`, isInline: true, styles: [".
|
|
458
|
+
`, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".param-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 3px #00000008;box-sizing:border-box;width:100%;min-width:0;transition:all .12s ease}.param-card:hover{border-color:#94a3b8}.param-card.session-bound{background:#f0fdf4;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:6px;width:100%}.param-label{font-size:.775rem;font-weight:700;color:#0f172a;white-space:nowrap}.param-tech-badge{font-size:.65rem;font-family:monospace;padding:1px 6px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.param-type-badge{font-size:.65rem;padding:1px 6px;border-radius:4px;background:#f1f5f9;color:#475569;text-transform:capitalize}.session-auto-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0}.required-warn-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.binding-mode-tabs{display:flex;flex-wrap:wrap;width:100%;background:#f1f5f9;border-radius:6px;padding:3px;gap:3px;box-sizing:border-box}.mode-btn{flex:1 1 70px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;font-size:.69rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#fff9}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:8px;width:100%;min-width:0;box-sizing:border-box}.linker-icon{color:#2563eb;flex-shrink:0}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #bfdbfe;border-radius:6px;background-color:#eff6ff;font-weight:500;color:#1e40af;padding:6px 10px;font-size:.75rem}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:4px}.chips-label{font-size:.65rem;font-weight:600;color:#64748b;margin-right:2px}.chip-btn{font-size:.65rem;font-weight:500;padding:2px 7px;border-radius:4px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;cursor:pointer;transition:all .12s ease}.chip-btn:hover{background:#e2e8f0;color:#0f172a;border-color:#94a3b8}.chip-btn.active{background:#dbeafe;color:#1e40af;border-color:#60a5fa;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.mode-switch-hint{font-size:.68rem;color:#64748b;margin-top:1px;display:flex;align-items:center;gap:5px;flex-wrap:wrap}.btn-text-switch{background:none;border:none;padding:0;color:#2563eb;font-weight:600;cursor:pointer;text-decoration:underline;font-size:.68rem}.btn-text-switch:hover{color:#1d4ed8}.session-box{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;background:#fff;border:1px solid #bbf7d0;border-radius:6px;padding:6px 10px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.72rem;color:#166534;min-width:0}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.7rem;color:#15803d;background:#dcfce7;padding:2px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:monospace;font-size:.72rem}.param-desc{font-size:.675rem;color:#64748b;line-height:1.35}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
360
459
|
}
|
|
361
460
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ParameterBindingEditorComponent, decorators: [{
|
|
362
461
|
type: Component,
|
|
363
462
|
args: [{ selector: 'rpt-parameter-binding-editor', standalone: true, imports: [CommonModule, FormsModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
364
463
|
<div class="param-card" [class.session-bound]="isAutoSessionDerived()">
|
|
464
|
+
<!-- Card Header: Title, Technical Name, Type, and Badges -->
|
|
365
465
|
<div class="param-header">
|
|
366
466
|
<div class="param-title-wrap">
|
|
367
|
-
<span class="param-label">{{ friendlyLabel() }}</span>
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
} @else {
|
|
371
|
-
<span class="param-type-badge">{{ displayType() }}</span>
|
|
372
|
-
}
|
|
467
|
+
<span class="param-label" [title]="param().name">{{ friendlyLabel() }}</span>
|
|
468
|
+
<span class="param-tech-badge">{{ param().name }}</span>
|
|
469
|
+
<span class="param-type-badge">{{ displayType() }}</span>
|
|
373
470
|
@if (isAutoSessionDerived()) {
|
|
374
471
|
<span class="session-auto-badge">Auto Session</span>
|
|
375
472
|
} @else if (param().required && !hasValue()) {
|
|
@@ -377,80 +474,88 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
377
474
|
}
|
|
378
475
|
</div>
|
|
379
476
|
|
|
380
|
-
<!-- Binding Mode
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
@if (sessionMatch()) {
|
|
384
|
-
<button
|
|
385
|
-
type="button"
|
|
386
|
-
class="mode-btn"
|
|
387
|
-
[class.active]="activeMode() === 'session'"
|
|
388
|
-
(click)="setMode('session')"
|
|
389
|
-
title="Auto-bound to host session context"
|
|
390
|
-
>
|
|
391
|
-
<rpt-icon name="user" [size]="10" />
|
|
392
|
-
<span>Session</span>
|
|
393
|
-
</button>
|
|
394
|
-
}
|
|
395
|
-
<button
|
|
396
|
-
type="button"
|
|
397
|
-
class="mode-btn"
|
|
398
|
-
[class.active]="activeMode() === 'control'"
|
|
399
|
-
(click)="setMode('control')"
|
|
400
|
-
title="Link value to another field on canvas (e.g. Branch dropdown)"
|
|
401
|
-
>
|
|
402
|
-
<rpt-icon name="link" [size]="10" />
|
|
403
|
-
<span>Form Field</span>
|
|
404
|
-
</button>
|
|
477
|
+
<!-- Binding Mode Segmented Selector -->
|
|
478
|
+
<div class="binding-mode-tabs" role="tablist">
|
|
479
|
+
@if (sessionMatch()) {
|
|
405
480
|
<button
|
|
406
481
|
type="button"
|
|
407
482
|
class="mode-btn"
|
|
408
|
-
[class.active]="activeMode() === '
|
|
409
|
-
(click)="setMode('
|
|
410
|
-
title="
|
|
483
|
+
[class.active]="activeMode() === 'session'"
|
|
484
|
+
(click)="setMode('session')"
|
|
485
|
+
title="Bound to session user/branch context"
|
|
411
486
|
>
|
|
412
|
-
<rpt-icon name="
|
|
413
|
-
<span>
|
|
487
|
+
<rpt-icon name="user" [size]="11" />
|
|
488
|
+
<span>Session</span>
|
|
414
489
|
</button>
|
|
490
|
+
}
|
|
491
|
+
<button
|
|
492
|
+
type="button"
|
|
493
|
+
class="mode-btn"
|
|
494
|
+
[class.active]="activeMode() === 'control'"
|
|
495
|
+
(click)="setMode('control')"
|
|
496
|
+
title="Link value to a form field on canvas (e.g. Dropdown, DatePicker)"
|
|
497
|
+
>
|
|
498
|
+
<rpt-icon name="link" [size]="11" />
|
|
499
|
+
<span>Form Field</span>
|
|
500
|
+
</button>
|
|
501
|
+
<button
|
|
502
|
+
type="button"
|
|
503
|
+
class="mode-btn"
|
|
504
|
+
[class.active]="activeMode() === 'fixed'"
|
|
505
|
+
(click)="setMode('fixed')"
|
|
506
|
+
title="Type a manual or fixed value (e.g. 1, 0, 101)"
|
|
507
|
+
>
|
|
508
|
+
<rpt-icon name="edit" [size]="11" />
|
|
509
|
+
<span>Fixed Value</span>
|
|
510
|
+
</button>
|
|
511
|
+
<button
|
|
512
|
+
type="button"
|
|
513
|
+
class="mode-btn"
|
|
514
|
+
[class.active]="activeMode() === 'context'"
|
|
515
|
+
(click)="setMode('context')"
|
|
516
|
+
title="Use system date presets (e.g. Today, Month Start)"
|
|
517
|
+
>
|
|
518
|
+
<rpt-icon name="clock" [size]="11" />
|
|
519
|
+
<span>Preset</span>
|
|
520
|
+
</button>
|
|
521
|
+
@if (isAdvancedMode()) {
|
|
415
522
|
<button
|
|
416
523
|
type="button"
|
|
417
524
|
class="mode-btn"
|
|
418
|
-
[class.active]="activeMode() === '
|
|
419
|
-
(click)="setMode('
|
|
420
|
-
title="
|
|
525
|
+
[class.active]="activeMode() === 'custom'"
|
|
526
|
+
(click)="setMode('custom')"
|
|
527
|
+
title="Manual template expression"
|
|
421
528
|
>
|
|
422
|
-
<rpt-icon name="
|
|
423
|
-
<span>
|
|
529
|
+
<rpt-icon name="code" [size]="11" />
|
|
530
|
+
<span>Expr</span>
|
|
424
531
|
</button>
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
type="button"
|
|
428
|
-
class="mode-btn"
|
|
429
|
-
[class.active]="activeMode() === 'custom'"
|
|
430
|
-
(click)="setMode('custom')"
|
|
431
|
-
title="Manual expression with {{ '{{' }}mustache{{ '}}' }}"
|
|
432
|
-
>
|
|
433
|
-
<rpt-icon name="code" [size]="10" />
|
|
434
|
-
<span>Expr</span>
|
|
435
|
-
</button>
|
|
436
|
-
}
|
|
437
|
-
</div>
|
|
438
|
-
}
|
|
532
|
+
}
|
|
533
|
+
</div>
|
|
439
534
|
</div>
|
|
440
535
|
|
|
441
536
|
<!-- Mode-specific Input Controls -->
|
|
442
537
|
<div class="param-body">
|
|
443
|
-
<!-- 0. AUTO SESSION DERIVED
|
|
538
|
+
<!-- 0. AUTO SESSION DERIVED -->
|
|
444
539
|
@if (activeMode() === 'session' && sessionMatch()) {
|
|
445
540
|
<div class="session-box">
|
|
446
541
|
<div class="session-box-text">
|
|
447
|
-
<rpt-icon name="user" [size]="
|
|
542
|
+
<rpt-icon name="user" [size]="13" class="session-icon" />
|
|
448
543
|
<span>
|
|
449
544
|
Derived from <strong>{{ sessionMatch()?.sessionKey }}</strong> ({{ sessionMatch()?.friendlyLabel }})
|
|
450
545
|
</span>
|
|
451
546
|
</div>
|
|
452
|
-
<div class="session-
|
|
453
|
-
|
|
547
|
+
<div class="session-box-actions">
|
|
548
|
+
<div class="session-val-tag">
|
|
549
|
+
Current: <strong>{{ sessionMatch()?.value ?? '(none)' }}</strong>
|
|
550
|
+
</div>
|
|
551
|
+
<button
|
|
552
|
+
type="button"
|
|
553
|
+
class="btn-session-override"
|
|
554
|
+
(click)="setMode('fixed')"
|
|
555
|
+
title="Override with manual value"
|
|
556
|
+
>
|
|
557
|
+
Override
|
|
558
|
+
</button>
|
|
454
559
|
</div>
|
|
455
560
|
</div>
|
|
456
561
|
}
|
|
@@ -458,7 +563,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
458
563
|
<!-- 1. FORM CONTROL LINKER -->
|
|
459
564
|
@if (activeMode() === 'control') {
|
|
460
565
|
<div class="linker-row">
|
|
461
|
-
<rpt-icon name="link" [size]="
|
|
566
|
+
<rpt-icon name="link" [size]="13" class="linker-icon" />
|
|
462
567
|
<select
|
|
463
568
|
class="field-select linker-select"
|
|
464
569
|
[ngModel]="selectedControlKey()"
|
|
@@ -473,11 +578,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
473
578
|
</select>
|
|
474
579
|
</div>
|
|
475
580
|
@if (!selectedControlKey() && compatibleControls().length === 0) {
|
|
476
|
-
<div class="empty-hint">No
|
|
581
|
+
<div class="empty-hint">No input fields on canvas. Add a dropdown, date picker, or input first.</div>
|
|
477
582
|
}
|
|
478
583
|
}
|
|
479
584
|
|
|
480
|
-
<!-- 2. FIXED VALUE -->
|
|
585
|
+
<!-- 2. ENTER FIXED VALUE -->
|
|
481
586
|
@if (activeMode() === 'fixed') {
|
|
482
587
|
@switch (param().dataType) {
|
|
483
588
|
@case ('boolean') {
|
|
@@ -487,63 +592,90 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
487
592
|
[ngModel]="booleanFixedValue()"
|
|
488
593
|
(ngModelChange)="onBooleanChanged($event)"
|
|
489
594
|
/>
|
|
490
|
-
<span class="toggle-text">{{ booleanFixedValue() ? 'Active / Yes' : 'Inactive / No' }}</span>
|
|
595
|
+
<span class="toggle-text">{{ booleanFixedValue() ? 'Active / Yes (1)' : 'Inactive / No (0)' }}</span>
|
|
491
596
|
</label>
|
|
492
597
|
}
|
|
493
598
|
@case ('number') {
|
|
494
|
-
<input
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
599
|
+
<div class="input-wrap">
|
|
600
|
+
<input
|
|
601
|
+
type="number"
|
|
602
|
+
class="field-input"
|
|
603
|
+
placeholder="Enter number (e.g. 1, 0, 11)"
|
|
604
|
+
[ngModel]="currentValue()"
|
|
605
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
606
|
+
/>
|
|
607
|
+
</div>
|
|
501
608
|
}
|
|
502
609
|
@case ('date') {
|
|
503
|
-
<input
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
610
|
+
<div class="input-wrap">
|
|
611
|
+
<input
|
|
612
|
+
type="date"
|
|
613
|
+
class="field-input"
|
|
614
|
+
[ngModel]="currentValue()"
|
|
615
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
616
|
+
/>
|
|
617
|
+
</div>
|
|
509
618
|
}
|
|
510
619
|
@default {
|
|
511
|
-
<input
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
620
|
+
<div class="input-wrap">
|
|
621
|
+
<input
|
|
622
|
+
type="text"
|
|
623
|
+
class="field-input"
|
|
624
|
+
placeholder="Enter value (e.g. 101, text, code)"
|
|
625
|
+
[ngModel]="currentValue()"
|
|
626
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
627
|
+
/>
|
|
628
|
+
</div>
|
|
518
629
|
}
|
|
519
630
|
}
|
|
631
|
+
@if (paramQuickSuggestions().length > 0) {
|
|
632
|
+
<div class="quick-chips-row">
|
|
633
|
+
<span class="chips-label">Quick:</span>
|
|
634
|
+
@for (chip of paramQuickSuggestions(); track chip.value) {
|
|
635
|
+
<button
|
|
636
|
+
type="button"
|
|
637
|
+
class="chip-btn"
|
|
638
|
+
[class.active]="isCurrentValue(chip.value)"
|
|
639
|
+
(click)="onFixedValueChanged(chip.value)"
|
|
640
|
+
>
|
|
641
|
+
{{ chip.label }}
|
|
642
|
+
</button>
|
|
643
|
+
}
|
|
644
|
+
</div>
|
|
645
|
+
}
|
|
520
646
|
}
|
|
521
647
|
|
|
522
|
-
<!-- 3. SYSTEM
|
|
648
|
+
<!-- 3. SYSTEM DATE PRESETS -->
|
|
523
649
|
@if (activeMode() === 'context') {
|
|
524
|
-
<
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
650
|
+
<div class="input-wrap">
|
|
651
|
+
<select
|
|
652
|
+
class="field-select"
|
|
653
|
+
[ngModel]="selectedContextKey()"
|
|
654
|
+
(ngModelChange)="onContextSelected($event)"
|
|
655
|
+
>
|
|
656
|
+
<option value="">-- Choose Date / Context Preset --</option>
|
|
657
|
+
<option value="{{ '{{' }}context.today{{ '}}' }}">Today's Date</option>
|
|
658
|
+
<option value="{{ '{{' }}context.startOfMonth{{ '}}' }}">First Day of Current Month</option>
|
|
659
|
+
<option value="{{ '{{' }}context.endOfMonth{{ '}}' }}">Last Day of Current Month</option>
|
|
660
|
+
<option value="{{ '{{' }}context.startOfYear{{ '}}' }}">First Day of Current Year</option>
|
|
661
|
+
<option value="{{ '{{' }}context.yesterday{{ '}}' }}">Yesterday</option>
|
|
662
|
+
<option value="{{ '{{' }}context.branchId{{ '}}' }}">Current User Branch</option>
|
|
663
|
+
<option value="{{ '{{' }}context.userId{{ '}}' }}">Current User ID</option>
|
|
664
|
+
</select>
|
|
665
|
+
</div>
|
|
536
666
|
}
|
|
537
667
|
|
|
538
668
|
<!-- 4. CUSTOM EXPRESSION -->
|
|
539
669
|
@if (activeMode() === 'custom') {
|
|
540
|
-
<input
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
670
|
+
<div class="input-wrap">
|
|
671
|
+
<input
|
|
672
|
+
type="text"
|
|
673
|
+
class="field-input monospace-input"
|
|
674
|
+
placeholder="e.g. {{ '{{' }}form.dropdownField ?? 1{{ '}}' }}"
|
|
675
|
+
[ngModel]="currentValue()"
|
|
676
|
+
(ngModelChange)="onFixedValueChanged($event)"
|
|
677
|
+
/>
|
|
678
|
+
</div>
|
|
547
679
|
}
|
|
548
680
|
</div>
|
|
549
681
|
|
|
@@ -551,6 +683,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
551
683
|
<div class="param-desc">{{ param().description }}</div>
|
|
552
684
|
}
|
|
553
685
|
</div>
|
|
554
|
-
`, styles: [".
|
|
686
|
+
`, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".param-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 1px 3px #00000008;box-sizing:border-box;width:100%;min-width:0;transition:all .12s ease}.param-card:hover{border-color:#94a3b8}.param-card.session-bound{background:#f0fdf4;border-color:#bbf7d0}.param-header{display:flex;flex-direction:column;gap:6px;width:100%;box-sizing:border-box}.param-title-wrap{display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:6px;width:100%}.param-label{font-size:.775rem;font-weight:700;color:#0f172a;white-space:nowrap}.param-tech-badge{font-size:.65rem;font-family:monospace;padding:1px 6px;border-radius:4px;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.param-type-badge{font-size:.65rem;padding:1px 6px;border-radius:4px;background:#f1f5f9;color:#475569;text-transform:capitalize}.session-auto-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#dcfce7;color:#15803d;border:1px solid #bbf7d0}.required-warn-badge{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:4px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.binding-mode-tabs{display:flex;flex-wrap:wrap;width:100%;background:#f1f5f9;border-radius:6px;padding:3px;gap:3px;box-sizing:border-box}.mode-btn{flex:1 1 70px;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;font-size:.69rem;font-weight:500;background:transparent;color:#64748b;border:none;border-radius:4px;cursor:pointer;transition:all .12s ease;white-space:nowrap}.mode-btn:hover{color:#0f172a;background:#fff9}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 2px #00000014}.param-body{display:flex;flex-direction:column;gap:6px;width:100%;min-width:0;box-sizing:border-box}.linker-row{display:flex;align-items:center;gap:8px;width:100%;min-width:0;box-sizing:border-box}.linker-icon{color:#2563eb;flex-shrink:0}.linker-select{flex:1;width:100%;min-width:0;box-sizing:border-box;border:1px solid #bfdbfe;border-radius:6px;background-color:#eff6ff;font-weight:500;color:#1e40af;padding:6px 10px;font-size:.75rem}.quick-chips-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-top:4px}.chips-label{font-size:.65rem;font-weight:600;color:#64748b;margin-right:2px}.chip-btn{font-size:.65rem;font-weight:500;padding:2px 7px;border-radius:4px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;cursor:pointer;transition:all .12s ease}.chip-btn:hover{background:#e2e8f0;color:#0f172a;border-color:#94a3b8}.chip-btn.active{background:#dbeafe;color:#1e40af;border-color:#60a5fa;font-weight:600}.input-wrap{width:100%;min-width:0;box-sizing:border-box}.mode-switch-hint{font-size:.68rem;color:#64748b;margin-top:1px;display:flex;align-items:center;gap:5px;flex-wrap:wrap}.btn-text-switch{background:none;border:none;padding:0;color:#2563eb;font-weight:600;cursor:pointer;text-decoration:underline;font-size:.68rem}.btn-text-switch:hover{color:#1d4ed8}.session-box{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;background:#fff;border:1px solid #bbf7d0;border-radius:6px;padding:6px 10px;gap:6px;width:100%;box-sizing:border-box}.session-box-text{display:flex;align-items:center;gap:6px;font-size:.72rem;color:#166534;min-width:0}.session-icon{color:#16a34a;flex-shrink:0}.session-box-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.session-val-tag{font-size:.7rem;color:#15803d;background:#dcfce7;padding:2px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0}.btn-session-override{background:#fff;border:1px solid #86efac;color:#15803d;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-session-override:hover{background:#dcfce7}.empty-hint{font-size:.68rem;color:#94a3b8;font-style:italic}.toggle-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:.75rem;color:#334155;font-weight:500}.monospace-input{font-family:monospace;font-size:.72rem}.param-desc{font-size:.675rem;color:#64748b;line-height:1.35}\n"] }]
|
|
555
687
|
}] });
|
|
556
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3BhcmFtZXRlci1iaW5kaW5nLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7QUFvWDdGLE1BQU0sT0FBTywrQkFBK0I7SUFDekIsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBRTdELEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUE4QixDQUFDO0lBQ3JELFlBQVksR0FBRyxLQUFLLENBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELGFBQWEsR0FBRyxLQUFLLENBQThCLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELGtCQUFrQixHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUN2QyxjQUFjLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXZDLFdBQVcsR0FBRyxNQUFNLEVBQTZCLENBQUM7SUFDbEQsaUJBQWlCLEdB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStMVCx5N0VBak1TLFlBQVksOEJBQUUsV0FBVyw2MUNBQUUsZ0JBQWdCOzs0RkE2VzFDLCtCQUErQjtrQkFoWDNDLFNBQVM7K0JBQ0UsOEJBQThCLGNBQzVCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsbUJBQ3JDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0xUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgUGFyYW1ldGVyQmluZGluZ01vZGUgPSAnc2Vzc2lvbicgfCAnY29udHJvbCcgfCAnZml4ZWQnIHwgJ2NvbnRleHQnIHwgJ2N1c3RvbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wYXJhbWV0ZXItYmluZGluZy1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1jYXJkXCIgW2NsYXNzLnNlc3Npb24tYm91bmRdPVwiaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tdGl0bGUtd3JhcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tbGFiZWxcIj57eyBmcmllbmRseUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICAgICAgQGlmIChpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtLXRlY2gtYmFkZ2VcIj57eyBwYXJhbSgpLm5hbWUgfX0gKHt7IHBhcmFtKCkuc3FsVHlwZSB9fSk8L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtLXR5cGUtYmFkZ2VcIj57eyBkaXNwbGF5VHlwZSgpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGlzQXV0b1Nlc3Npb25EZXJpdmVkKCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1hdXRvLWJhZGdlXCI+QXV0byBTZXNzaW9uPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKHBhcmFtKCkucmVxdWlyZWQgJiYgIWhhc1ZhbHVlKCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtd2Fybi1iYWRnZVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCaW5kaW5nIE1vZGUgVG9nZ2xlIEJ1dHRvbnMgKEFsd2F5cyBpbiBBZHZhbmNlZCBtb2RlLCBvciB3aGVuIG5vdCBhdXRvIHNlc3Npb24gaW4gU2ltcGxlIG1vZGUpIC0tPlxuICAgICAgICBAaWYgKGlzQWR2YW5jZWRNb2RlKCkgfHwgIWlzQXV0b1Nlc3Npb25EZXJpdmVkKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmluZGluZy1tb2RlLXRhYnNcIj5cbiAgICAgICAgICAgIEBpZiAoc2Vzc2lvbk1hdGNoKCkpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdzZXNzaW9uJylcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQXV0by1ib3VuZCB0byBob3N0IHNlc3Npb24gY29udGV4dFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxMFwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+U2Vzc2lvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjb250cm9sJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdjb250cm9sJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkxpbmsgdmFsdWUgdG8gYW5vdGhlciBmaWVsZCBvbiBjYW52YXMgKGUuZy4gQnJhbmNoIGRyb3Bkb3duKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlua1wiIFtzaXplXT1cIjEwXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+Rm9ybSBGaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnZml4ZWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2ZpeGVkJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIlVzZSBhIHN0YXRpYyBmaXhlZCB2YWx1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZWRpdFwiIFtzaXplXT1cIjEwXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+Rml4ZWQ8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZU1vZGUoKSA9PT0gJ2NvbnRleHQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2NvbnRleHQnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiVXNlIHN5c3RlbSBjb250ZXh0IHByZXNldHMgKGUuZy4gVG9kYXksIE1vbnRoIFN0YXJ0KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvY2tcIiBbc2l6ZV09XCIxMFwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlByZXNldDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmIChpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZU1vZGUoKSA9PT0gJ2N1c3RvbSdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdjdXN0b20nKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJNYW51YWwgZXhwcmVzc2lvbiB3aXRoIHt7ICd7eycgfX1tdXN0YWNoZXt7ICd9fScgfX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTBcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkV4cHI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNb2RlLXNwZWNpZmljIElucHV0IENvbnRyb2xzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWJvZHlcIj5cbiAgICAgICAgPCEtLSAwLiBBVVRPIFNFU1NJT04gREVSSVZFRCAoU2ltcGxlIE1vZGUgZGVmYXVsdCBvciBTZXNzaW9uIG1vZGUpIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ3Nlc3Npb24nICYmIHNlc3Npb25NYXRjaCgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1ib3gtdGV4dFwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxMlwiIGNsYXNzPVwic2Vzc2lvbi1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgRGVyaXZlZCBmcm9tIDxzdHJvbmc+e3sgc2Vzc2lvbk1hdGNoKCk/LnNlc3Npb25LZXkgfX08L3N0cm9uZz4gKHt7IHNlc3Npb25NYXRjaCgpPy5mcmllbmRseUxhYmVsIH19KVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXZhbC10YWdcIj5cbiAgICAgICAgICAgICAgQ3VycmVudDogPHN0cm9uZz57eyBzZXNzaW9uTWF0Y2goKT8udmFsdWUgPz8gJyhub25lKScgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAxLiBGT1JNIENPTlRST0wgTElOS0VSIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmtlci1yb3dcIj5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlua1wiIFtzaXplXT1cIjEyXCIgY2xhc3M9XCJsaW5rZXItaWNvblwiIC8+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0IGxpbmtlci1zZWxlY3RcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZENvbnRyb2xLZXkoKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ29udHJvbFNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gQ2hvb3NlIEZvcm0gRmllbGQgb24gQ2FudmFzIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGNvbXBhdGlibGVDb250cm9scygpOyB0cmFjayBmaWVsZC5rZXkgfHwgZmllbGQuaWQpIHtcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmaWVsZC5rZXkgfHwgZmllbGQuaWRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmtleSB9fSAoe3sgZmllbGQudHlwZSB9fSlcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICghc2VsZWN0ZWRDb250cm9sS2V5KCkgJiYgY29tcGF0aWJsZUNvbnRyb2xzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaGludFwiPk5vIG90aGVyIGNvbnRyb2xzIG9uIGNhbnZhcy4gQWRkIGEgZHJvcGRvd24gb3IgaW5wdXQgZmlyc3QuPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBGSVhFRCBWQUxVRSAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVNb2RlKCkgPT09ICdmaXhlZCcpIHtcbiAgICAgICAgICBAc3dpdGNoIChwYXJhbSgpLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRvZ2dsZS1zd2l0Y2hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJib29sZWFuRml4ZWRWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQm9vbGVhbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS10ZXh0XCI+e3sgYm9vbGVhbkZpeGVkVmFsdWUoKSA/ICdBY3RpdmUgLyBZZXMnIDogJ0luYWN0aXZlIC8gTm8nIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbnVtYmVyIChlLmcuIDEwMClcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImN1cnJlbnRWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlJykge1xuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRml4ZWRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGZpeGVkIHZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaXhlZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDMuIFNZU1RFTSBDT05URVhUIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ2NvbnRleHQnKSB7XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRDb250ZXh0S2V5KClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250ZXh0U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIENob29zZSBTeXN0ZW0gQ29udGV4dCBWYWx1ZSAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ICd7eycgfX1jb250ZXh0LmJyYW5jaElke3sgJ319JyB9fVwiPkN1cnJlbnQgVXNlcidzIEJyYW5jaDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ICd7eycgfX1jb250ZXh0LnVzZXJJZHt7ICd9fScgfX1cIj5DdXJyZW50IFVzZXIgSUQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC50ZW5hbnRJZHt7ICd9fScgfX1cIj5DdXJyZW50IENvbXBhbnkgLyBUZW5hbnQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC50b2RheXt7ICd9fScgfX1cIj5Ub2RheSdzIERhdGU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5zdGFydE9mTW9udGh7eyAnfX0nIH19XCI+Rmlyc3QgRGF5IG9mIEN1cnJlbnQgTW9udGg8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gNC4gQ1VTVE9NIEVYUFJFU1NJT04gLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY3VzdG9tJykge1xuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dCBtb25vc3BhY2UtaW5wdXRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIHt7ICd7eycgfX1mb3JtLmJyYW5jaEZpZWxkID8/IDF7eyAnfX0nIH19XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImN1cnJlbnRWYWx1ZSgpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRml4ZWRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAocGFyYW0oKS5kZXNjcmlwdGlvbiAmJiBpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1kZXNjXCI+e3sgcGFyYW0oKS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnBhcmFtLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgcGFkZGluZzogOHB4IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkOmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICB9XG4gICAgLnBhcmFtLWNhcmQuc2Vzc2lvbi1ib3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmJmN2QwO1xuICAgIH1cbiAgICAucGFyYW0taGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuICAgIC5wYXJhbS10aXRsZS13cmFwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5wYXJhbS1sYWJlbCB7XG4gICAgICBmb250LXNpemU6IDAuNzZyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTI5M2I7XG4gICAgfVxuICAgIC5wYXJhbS10eXBlLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICB9XG4gICAgLnNlc3Npb24tYXV0by1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjJyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNkY2ZjZTc7XG4gICAgICBjb2xvcjogIzE1ODAzZDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgfVxuICAgIC5yZXF1aXJlZC13YXJuLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZlZjJmMjtcbiAgICAgIGNvbG9yOiAjYjkxYzFjO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBwYWRkaW5nOiA1cHggOHB4O1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuICAgIC5zZXNzaW9uLWJveC10ZXh0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiAjMTY2NTM0O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1pY29uIHtcbiAgICAgIGNvbG9yOiAjMTZhMzRhO1xuICAgIH1cbiAgICAuc2Vzc2lvbi12YWwtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42OHJlbTtcbiAgICAgIGNvbG9yOiAjMTU4MDNkO1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuICAgIC5wYXJhbS10ZWNoLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgIH1cbiAgICAuYmluZGluZy1tb2RlLXRhYnMge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgcGFkZGluZzogMnB4O1xuICAgICAgZ2FwOiAycHg7XG4gICAgfVxuICAgIC5tb2RlLWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDNweDtcbiAgICAgIHBhZGRpbmc6IDNweCA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMDBtcyBlYXNlO1xuICAgIH1cbiAgICAubW9kZS1idG46aG92ZXIge1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5tb2RlLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuICAgIC5wYXJhbS1ib2R5IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC5saW5rZXItcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC5saW5rZXItaWNvbiB7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAubGlua2VyLXNlbGVjdCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmZkYmZlO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZjZmZjtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzFlNDBhZjtcbiAgICB9XG4gICAgLmVtcHR5LWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjY4cmVtO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgfVxuICAgIC50b2dnbGUtc3dpdGNoIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuICAgIC5tb25vc3BhY2UtaW5wdXQge1xuICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgIGZvbnQtc2l6ZTogMC43MnJlbTtcbiAgICB9XG4gICAgLnBhcmFtLWRlc2Mge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyQmluZGluZ0VkaXRvckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlKTtcblxuICByZWFkb25seSBwYXJhbSA9IGlucHV0LnJlcXVpcmVkPFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhPigpO1xuICByZWFkb25seSBjdXJyZW50VmFsdWUgPSBpbnB1dDxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPignJyk7XG4gIHJlYWRvbmx5IGFsbENvbXBvbmVudHMgPSBpbnB1dDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgY3VycmVudENvbXBvbmVudElkID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGlzQWR2YW5jZWRNb2RlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpbmtlZEZpZWxkQ2hhbmdlID0gb3V0cHV0PHsgcGFyYW1OYW1lOiBzdHJpbmc7IGZpZWxkS2V5OiBzdHJpbmc7IGlzTGlua2VkOiBib29sZWFuIH0+KCk7XG5cbiAgcmVhZG9ubHkgaW50ZXJuYWxNb2RlID0gc2lnbmFsPFBhcmFtZXRlckJpbmRpbmdNb2RlIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2Vzc2lvbk1hdGNoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZXNzaW9uU2VydmljZS5tYXRjaFBhcmFtZXRlcih0aGlzLnBhcmFtKCkubmFtZSkpO1xuXG4gIHJlYWRvbmx5IGZyaWVuZGx5TGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW0oKS5mcmllbmRseUxhYmVsIHx8IGh1bWFuaXplSWRlbnRpZmllcih0aGlzLnBhcmFtKCkubmFtZSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRpc3BsYXlUeXBlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHN3aXRjaCAodGhpcy5wYXJhbSgpLmRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICdZZXMgLyBObyc7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJ051bWJlcic7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuICdEYXRlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnVGV4dCc7XG4gICAgfVxuICB9KTtcblxuICByZWFkb25seSBjb21wYXRpYmxlQ29udHJvbHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsQ29tcG9uZW50cygpLmZpbHRlcigoYykgPT4gYy5pZCAhPT0gdGhpcy5jdXJyZW50Q29tcG9uZW50SWQoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhhc1ZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1cnJlbnRWYWx1ZSgpO1xuICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJztcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlTW9kZSA9IGNvbXB1dGVkPFBhcmFtZXRlckJpbmRpbmdNb2RlPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaW50ZXJuYWxNb2RlKCkgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVybmFsTW9kZSgpITtcbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSBTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUoKSA/PyAnJyk7XG5cbiAgICAvLyBJZiBtYXRjaGVzIHNlc3Npb24gY29udGV4dCBhbmQgaGFzIG5vIGV4cGxpY2l0IG1hbnVhbCBvdmVycmlkZSwgZGVmYXVsdCB0byBzZXNzaW9uXG4gICAgaWYgKHRoaXMuc2Vzc2lvbk1hdGNoKCkgIT09IG51bGwgJiYgKCF2YWwgfHwgdmFsLnN0YXJ0c1dpdGgoJ3t7c2Vzc2lvbi4nKSkpIHtcbiAgICAgIHJldHVybiAnc2Vzc2lvbic7XG4gICAgfVxuXG4gICAgaWYgKCF2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhdGlibGVDb250cm9scygpLmxlbmd0aCA+IDAgPyAnY29udHJvbCcgOiAnZml4ZWQnO1xuICAgIH1cblxuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tjb250ZXh0LicpKSB7XG4gICAgICByZXR1cm4gJ2NvbnRleHQnO1xuICAgIH1cblxuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tzZXNzaW9uLicpKSB7XG4gICAgICByZXR1cm4gJ3Nlc3Npb24nO1xuICAgIH1cblxuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3snKSAmJiB2YWwuZW5kc1dpdGgoJ319JykpIHtcbiAgICAgIGNvbnN0IGlubmVyID0gdmFsLnNsaWNlKDIsIC0yKS50cmltKCk7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkuZmluZCgoYykgPT4gKGMua2V5IHx8IGMuaWQpID09PSBpbm5lcik7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnY3VzdG9tJztcbiAgICB9XG5cbiAgICBjb25zdCBwbGFpbk1hdGNoID0gdGhpcy5jb21wYXRpYmxlQ29udHJvbHMoKS5maW5kKChjKSA9PiAoYy5rZXkgfHwgYy5pZCkgPT09IHZhbCk7XG4gICAgaWYgKHBsYWluTWF0Y2gpIHtcbiAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmaXhlZCc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzQXV0b1Nlc3Npb25EZXJpdmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25NYXRjaCgpICE9PSBudWxsICYmIHRoaXMuYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbic7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29udHJvbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUoKSA/PyAnJyk7XG4gICAgaWYgKHZhbC5zdGFydHNXaXRoKCd7eycpICYmIHZhbC5lbmRzV2l0aCgnfX0nKSkge1xuICAgICAgcmV0dXJuIHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZENvbnRleHRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkgPz8gJycpO1xuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tjb250ZXh0LicpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJvb2xlYW5GaXhlZFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1cnJlbnRWYWx1ZSgpO1xuICAgIHJldHVybiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyB8fCB2ID09PSAxIHx8IHYgPT09ICcxJztcbiAgfSk7XG5cbiAgc2V0TW9kZShtb2RlOiBQYXJhbWV0ZXJCaW5kaW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxNb2RlLnNldChtb2RlKTtcbiAgICBpZiAobW9kZSA9PT0gJ3Nlc3Npb24nKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuc2Vzc2lvbk1hdGNoKCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGB7e3Nlc3Npb24uJHttYXRjaC5zZXNzaW9uS2V5fX19YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleTogJycsXG4gICAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ2ZpeGVkJykge1xuICAgICAgaWYgKHRoaXMucGFyYW0oKS5kYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMucGFyYW0oKS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4odGhpcy5wYXJhbSgpLmRlZmF1bHRWYWx1ZSkgOiB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCgnJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleTogJycsXG4gICAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29udHJvbFNlbGVjdGVkKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGtleSkge1xuICAgICAgY29uc3QgZXhwciA9IGB7eyR7a2V5fX19YDtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChleHByKTtcbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiBrZXksXG4gICAgICAgIGlzTGlua2VkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCgnJyk7XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleTogJycsXG4gICAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQm9vbGVhbkNoYW5nZWQoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjaGVja2VkKTtcbiAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRml4ZWRWYWx1ZUNoYW5nZWQodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgb25Db250ZXh0U2VsZWN0ZWQoY3R4S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY3R4S2V5KTtcbiAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
688
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWJpbmRpbmctZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3BhcmFtZXRlci1iaW5kaW5nLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7QUE0Z0I3RixNQUFNLE9BQU8sK0JBQStCO0lBQ3pCLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUU3RCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBOEIsQ0FBQztJQUNyRCxZQUFZLEdBQUcsS0FBSyxDQUE0QixFQUFFLENBQUMsQ0FBQztJQUNwRCxhQUFhLEdBQUcsS0FBSyxDQUE4QixFQUFFLENBQUMsQ0FBQztJQUN2RCxrQkFBa0IsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkMsY0FBYyxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV2QyxXQUFXLEdBQUcsTUFBTSxFQUE2QixDQUFDO0lBQ2xELGlCQUFpQixH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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ09UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFByb2NlZHVyZVBhcmFtZXRlck1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgUGFyYW1ldGVyQmluZGluZ01vZGUgPSAnc2Vzc2lvbicgfCAnY29udHJvbCcgfCAnZml4ZWQnIHwgJ2NvbnRleHQnIHwgJ2N1c3RvbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wYXJhbWV0ZXItYmluZGluZy1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1jYXJkXCIgW2NsYXNzLnNlc3Npb24tYm91bmRdPVwiaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKVwiPlxuICAgICAgPCEtLSBDYXJkIEhlYWRlcjogVGl0bGUsIFRlY2huaWNhbCBOYW1lLCBUeXBlLCBhbmQgQmFkZ2VzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhcmFtLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tdGl0bGUtd3JhcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tbGFiZWxcIiBbdGl0bGVdPVwicGFyYW0oKS5uYW1lXCI+e3sgZnJpZW5kbHlMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFyYW0tdGVjaC1iYWRnZVwiPnt7IHBhcmFtKCkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhcmFtLXR5cGUtYmFkZ2VcIj57eyBkaXNwbGF5VHlwZSgpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoaXNBdXRvU2Vzc2lvbkRlcml2ZWQoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWF1dG8tYmFkZ2VcIj5BdXRvIFNlc3Npb248L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSBpZiAocGFyYW0oKS5yZXF1aXJlZCAmJiAhaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC13YXJuLWJhZGdlXCI+UmVxdWlyZWQ8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJpbmRpbmcgTW9kZSBTZWdtZW50ZWQgU2VsZWN0b3IgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaW5kaW5nLW1vZGUtdGFic1wiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgQGlmIChzZXNzaW9uTWF0Y2goKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbidcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnc2Vzc2lvbicpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJCb3VuZCB0byBzZXNzaW9uIHVzZXIvYnJhbmNoIGNvbnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPlNlc3Npb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnY29udHJvbCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2NvbnRyb2wnKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkxpbmsgdmFsdWUgdG8gYSBmb3JtIGZpZWxkIG9uIGNhbnZhcyAoZS5nLiBEcm9wZG93biwgRGF0ZVBpY2tlcilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlua1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkZvcm0gRmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlTW9kZSgpID09PSAnZml4ZWQnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdmaXhlZCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVHlwZSBhIG1hbnVhbCBvciBmaXhlZCB2YWx1ZSAoZS5nLiAxLCAwLCAxMDEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5GaXhlZCBWYWx1ZTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVNb2RlKCkgPT09ICdjb250ZXh0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY29udGV4dCcpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiVXNlIHN5c3RlbSBkYXRlIHByZXNldHMgKGUuZy4gVG9kYXksIE1vbnRoIFN0YXJ0KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjbG9ja1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlByZXNldDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGlzQWR2YW5jZWRNb2RlKCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZU1vZGUoKSA9PT0gJ2N1c3RvbSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnY3VzdG9tJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIk1hbnVhbCB0ZW1wbGF0ZSBleHByZXNzaW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5FeHByPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGUtc3BlY2lmaWMgSW5wdXQgQ29udHJvbHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFyYW0tYm9keVwiPlxuICAgICAgICA8IS0tIDAuIEFVVE8gU0VTU0lPTiBERVJJVkVEIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ3Nlc3Npb24nICYmIHNlc3Npb25NYXRjaCgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1ib3gtdGV4dFwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVzZXJcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwic2Vzc2lvbi1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgRGVyaXZlZCBmcm9tIDxzdHJvbmc+e3sgc2Vzc2lvbk1hdGNoKCk/LnNlc3Npb25LZXkgfX08L3N0cm9uZz4gKHt7IHNlc3Npb25NYXRjaCgpPy5mcmllbmRseUxhYmVsIH19KVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWJveC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXZhbC10YWdcIj5cbiAgICAgICAgICAgICAgICBDdXJyZW50OiA8c3Ryb25nPnt7IHNlc3Npb25NYXRjaCgpPy52YWx1ZSA/PyAnKG5vbmUpJyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNlc3Npb24tb3ZlcnJpZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdmaXhlZCcpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIk92ZXJyaWRlIHdpdGggbWFudWFsIHZhbHVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE92ZXJyaWRlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDEuIEZPUk0gQ09OVFJPTCBMSU5LRVIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY29udHJvbCcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlua2VyLXJvd1wiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJsaW5rXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImxpbmtlci1pY29uXCIgLz5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zZWxlY3QgbGlua2VyLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQ29udHJvbEtleSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250cm9sU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBDaG9vc2UgRm9ybSBGaWVsZCBvbiBDYW52YXMgLS08L29wdGlvbj5cbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgY29tcGF0aWJsZUNvbnRyb2xzKCk7IHRyYWNrIGZpZWxkLmtleSB8fCBmaWVsZC5pZCkge1xuICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImZpZWxkLmtleSB8fCBmaWVsZC5pZFwiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQua2V5IH19ICh7eyBmaWVsZC50eXBlIH19KVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKCFzZWxlY3RlZENvbnRyb2xLZXkoKSAmJiBjb21wYXRpYmxlQ29udHJvbHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1oaW50XCI+Tm8gaW5wdXQgZmllbGRzIG9uIGNhbnZhcy4gQWRkIGEgZHJvcGRvd24sIGRhdGUgcGlja2VyLCBvciBpbnB1dCBmaXJzdC48L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDIuIEVOVEVSIEZJWEVEIFZBTFVFIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZU1vZGUoKSA9PT0gJ2ZpeGVkJykge1xuICAgICAgICAgIEBzd2l0Y2ggKHBhcmFtKCkuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIEBjYXNlICgnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImJvb2xlYW5GaXhlZFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Cb29sZWFuQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj57eyBib29sZWFuRml4ZWRWYWx1ZSgpID8gJ0FjdGl2ZSAvIFllcyAoMSknIDogJ0luYWN0aXZlIC8gTm8gKDApJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbnVtYmVyIChlLmcuIDEsIDAsIDExKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50VmFsdWUoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHZhbHVlIChlLmcuIDEwMSwgdGV4dCwgY29kZSlcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaXhlZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChwYXJhbVF1aWNrU3VnZ2VzdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stY2hpcHMtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcHMtbGFiZWxcIj5RdWljazo8L3NwYW4+XG4gICAgICAgICAgICAgIEBmb3IgKGNoaXAgb2YgcGFyYW1RdWlja1N1Z2dlc3Rpb25zKCk7IHRyYWNrIGNoaXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcC1idG5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0N1cnJlbnRWYWx1ZShjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaXhlZFZhbHVlQ2hhbmdlZChjaGlwLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgY2hpcC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDMuIFNZU1RFTSBEQVRFIFBSRVNFVFMgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY29udGV4dCcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcFwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQ29udGV4dEtleSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db250ZXh0U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBDaG9vc2UgRGF0ZSAvIENvbnRleHQgUHJlc2V0IC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC50b2RheXt7ICd9fScgfX1cIj5Ub2RheSdzIERhdGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7ICd7eycgfX1jb250ZXh0LnN0YXJ0T2ZNb250aHt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBNb250aDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3sgJ3t7JyB9fWNvbnRleHQuZW5kT2ZNb250aHt7ICd9fScgfX1cIj5MYXN0IERheSBvZiBDdXJyZW50IE1vbnRoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5zdGFydE9mWWVhcnt7ICd9fScgfX1cIj5GaXJzdCBEYXkgb2YgQ3VycmVudCBZZWFyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC55ZXN0ZXJkYXl7eyAnfX0nIH19XCI+WWVzdGVyZGF5PC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC5icmFuY2hJZHt7ICd9fScgfX1cIj5DdXJyZW50IFVzZXIgQnJhbmNoPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7eyAne3snIH19Y29udGV4dC51c2VySWR7eyAnfX0nIH19XCI+Q3VycmVudCBVc2VyIElEPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gNC4gQ1VTVE9NIEVYUFJFU1NJT04gLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlTW9kZSgpID09PSAnY3VzdG9tJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IG1vbm9zcGFjZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiB7eyAne3snIH19Zm9ybS5kcm9wZG93bkZpZWxkID8/IDF7eyAnfX0nIH19XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpeGVkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAocGFyYW0oKS5kZXNjcmlwdGlvbiAmJiBpc0FkdmFuY2VkTW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJhbS1kZXNjXCI+e3sgcGFyYW0oKS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnBhcmFtLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5wYXJhbS1jYXJkOmhvdmVyIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzk0YTNiODtcbiAgICB9XG4gICAgLnBhcmFtLWNhcmQuc2Vzc2lvbi1ib3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmJmN2QwO1xuICAgIH1cbiAgICAucGFyYW0taGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5wYXJhbS10aXRsZS13cmFwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnBhcmFtLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAucGFyYW0tdGVjaC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgcGFkZGluZzogMXB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgfVxuICAgIC5wYXJhbS10eXBlLWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgICB9XG4gICAgLnNlc3Npb24tYXV0by1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJmN2QwO1xuICAgIH1cbiAgICAucmVxdWlyZWQtd2Fybi1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgY29sb3I6ICNiOTFjMWM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgIH1cbiAgICAuYmluZGluZy1tb2RlLXRhYnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGdhcDogM3B4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLm1vZGUtYnRuIHtcbiAgICAgIGZsZXg6IDEgMSA3MHB4O1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIHBhZGRpbmc6IDVweCA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNjlyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLm1vZGUtYnRuOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpO1xuICAgIH1cbiAgICAubW9kZS1idG4uYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICAgIH1cbiAgICAucGFyYW0tYm9keSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGlua2VyLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGlua2VyLWljb24ge1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmxpbmtlci1zZWxlY3Qge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZmNmZmO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMWU0MGFmO1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgfVxuICAgIC5xdWljay1jaGlwcy1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmNoaXBzLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIH1cbiAgICAuY2hpcC1idG4ge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIHBhZGRpbmc6IDJweCA3cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5jaGlwLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuICAgIC5jaGlwLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTtcbiAgICAgIGNvbG9yOiAjMWU0MGFmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjNjBhNWZhO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgLmlucHV0LXdyYXAge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubW9kZS1zd2l0Y2gtaGludCB7XG4gICAgICBmb250LXNpemU6IDAuNjhyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuICAgIC5idG4tdGV4dC1zd2l0Y2gge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgIGZvbnQtc2l6ZTogMC42OHJlbTtcbiAgICB9XG4gICAgLmJ0bi10ZXh0LXN3aXRjaDpob3ZlciB7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1ib3gtdGV4dCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgY29sb3I6ICMxNjY1MzQ7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgfVxuICAgIC5zZXNzaW9uLWljb24ge1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLnNlc3Npb24tYm94LWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuc2Vzc2lvbi12YWwtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmJ0bi1zZXNzaW9uLW92ZXJyaWRlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjODZlZmFjO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLXNlc3Npb24tb3ZlcnJpZGU6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICB9XG4gICAgLmVtcHR5LWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjY4cmVtO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgfVxuICAgIC50b2dnbGUtc3dpdGNoIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAubW9ub3NwYWNlLWlucHV0IHtcbiAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgfVxuICAgIC5wYXJhbS1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM1O1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckJpbmRpbmdFZGl0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcGFyYW0gPSBpbnB1dC5yZXF1aXJlZDxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YT4oKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gaW5wdXQ8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4oJycpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gaW5wdXQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRDb21wb25lbnRJZCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc0FkdmFuY2VkTW9kZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG91dHB1dDxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPigpO1xuICByZWFkb25seSBsaW5rZWRGaWVsZENoYW5nZSA9IG91dHB1dDx7IHBhcmFtTmFtZTogc3RyaW5nOyBmaWVsZEtleTogc3RyaW5nOyBpc0xpbmtlZDogYm9vbGVhbiB9PigpO1xuXG4gIHJlYWRvbmx5IGludGVybmFsTW9kZSA9IHNpZ25hbDxQYXJhbWV0ZXJCaW5kaW5nTW9kZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHNlc3Npb25NYXRjaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2Vzc2lvblNlcnZpY2UubWF0Y2hQYXJhbWV0ZXIodGhpcy5wYXJhbSgpLm5hbWUpKTtcblxuICByZWFkb25seSBmcmllbmRseUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtKCkuZnJpZW5kbHlMYWJlbCB8fCBodW1hbml6ZUlkZW50aWZpZXIodGhpcy5wYXJhbSgpLm5hbWUpO1xuICB9KTtcblxuICByZWFkb25seSBkaXNwbGF5VHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMucGFyYW0oKS5kYXRhVHlwZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAnWWVzIC8gTm8nO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdOdW1iZXInO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiAnRGF0ZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNDdXJyZW50VmFsdWUgPSAodmFsOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkpID09PSBTdHJpbmcodmFsKTtcbiAgfTtcblxuICByZWFkb25seSBwYXJhbVF1aWNrU3VnZ2VzdGlvbnMgPSBjb21wdXRlZDx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdPigoKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgaWYgKG5hbWUgPT09ICdpbnR0cmFub3JkdWVkYXRlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IFRyYW5zYWN0aW9uIERhdGUnLCB2YWx1ZTogMCB9LFxuICAgICAgICB7IGxhYmVsOiAnMTogRHVlIERhdGUnLCB2YWx1ZTogMSB9LFxuICAgICAgICB7IGxhYmVsOiAnMjogR0lSIERhdGUnLCB2YWx1ZTogMiB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdpbnRvbmx5ZHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IEFsbCBCaWxscycsIHZhbHVlOiAwIH0sXG4gICAgICAgIHsgbGFiZWw6ICcxOiBPbmx5IER1ZSBCaWxscycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHZhbHVlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzExOiBDdXN0b21lciBMZWRnZXInLCB2YWx1ZTogMTEgfSxcbiAgICAgICAgeyBsYWJlbDogJzEyOiBTdXBwbGllciBMZWRnZXInLCB2YWx1ZTogMTIgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnY2hyY29tcGFueWlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogRGVmYXVsdCBDbycsIHZhbHVlOiAnMTAxJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJjb21wdW5pdGlkJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzEwMTogVW5pdCAxMDEnLCB2YWx1ZTogJzEwMScgfSxcbiAgICAgICAgeyBsYWJlbDogJzEwMSwxMDIsMTAzOiBBbGwgVW5pdHMnLCB2YWx1ZTogJzEwMSwxMDIsMTAzJyB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICdjaHJzdWJhY25vbGlzdCcpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsgbGFiZWw6ICcwOiBBbGwgQWNjb3VudHMnLCB2YWx1ZTogJzAnIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ2ludHdpdGhjaXR5Jykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBsYWJlbDogJzA6IE5vJywgdmFsdWU6IDAgfSxcbiAgICAgICAgeyBsYWJlbDogJzE6IFllcycsIHZhbHVlOiAxIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNvbXBhdGlibGVDb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5hbGxDb21wb25lbnRzKCkuZmlsdGVyKChjKSA9PiBjLmlkICE9PSB0aGlzLmN1cnJlbnRDb21wb25lbnRJZCgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVNb2RlID0gY29tcHV0ZWQ8UGFyYW1ldGVyQmluZGluZ01vZGU+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pbnRlcm5hbE1vZGUoKSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxNb2RlKCkhO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbCA9IFN0cmluZyh0aGlzLmN1cnJlbnRWYWx1ZSgpID8/ICcnKTtcblxuICAgIC8vIElmIG1hdGNoZXMgc2Vzc2lvbiBjb250ZXh0IGFuZCBoYXMgbm8gZXhwbGljaXQgbWFudWFsIG92ZXJyaWRlLCBkZWZhdWx0IHRvIHNlc3Npb25cbiAgICBpZiAodGhpcy5zZXNzaW9uTWF0Y2goKSAhPT0gbnVsbCAmJiAoIXZhbCB8fCB2YWwuc3RhcnRzV2l0aCgne3tzZXNzaW9uLicpKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7Y29udGV4dC4nKSkge1xuICAgICAgcmV0dXJuICdjb250ZXh0JztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7c2Vzc2lvbi4nKSkge1xuICAgICAgcmV0dXJuICdzZXNzaW9uJztcbiAgICB9XG5cbiAgICBpZiAodmFsLnN0YXJ0c1dpdGgoJ3t7JykgJiYgdmFsLmVuZHNXaXRoKCd9fScpKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmNvbXBhdGlibGVDb250cm9scygpLmZpbmQoKGMpID0+IChjLmtleSB8fCBjLmlkKSA9PT0gaW5uZXIpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2N1c3RvbSc7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhaW5NYXRjaCA9IHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkuZmluZCgoYykgPT4gKGMua2V5IHx8IGMuaWQpID09PSB2YWwpO1xuICAgIGlmIChwbGFpbk1hdGNoKSB7XG4gICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgIH1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICAvLyBTbWFydCBkZWZhdWx0OiBudW1lcmljIG9yIGZsYWcgcGFyYW1ldGVycyBkZWZhdWx0IHRvICdmaXhlZCcgKEVudGVyIFZhbHVlKVxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucGFyYW0oKS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyYW0oKS5kYXRhVHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgbmFtZS5zdGFydHNXaXRoKCdpbnQnKSB8fFxuICAgICAgICBuYW1lLmluY2x1ZGVzKCdmbGFnJykgfHxcbiAgICAgICAgbmFtZS5pbmNsdWRlcygndHlwZScpIHx8XG4gICAgICAgIG5hbWUuaW5jbHVkZXMoJ29ubHknKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGNvbXBhdGlibGUgZm9ybSBmaWVsZHMgb24gY2FudmFzLCBkZWZhdWx0IHRvIGNvbnRyb2wsIG90aGVyd2lzZSBmaXhlZFxuICAgICAgcmV0dXJuIHRoaXMuY29tcGF0aWJsZUNvbnRyb2xzKCkubGVuZ3RoID4gMCA/ICdjb250cm9sJyA6ICdmaXhlZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdmaXhlZCc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzQXV0b1Nlc3Npb25EZXJpdmVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25NYXRjaCgpICE9PSBudWxsICYmIHRoaXMuYWN0aXZlTW9kZSgpID09PSAnc2Vzc2lvbic7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29udHJvbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBTdHJpbmcodGhpcy5jdXJyZW50VmFsdWUoKSA/PyAnJyk7XG4gICAgaWYgKHZhbC5zdGFydHNXaXRoKCd7eycpICYmIHZhbC5lbmRzV2l0aCgnfX0nKSkge1xuICAgICAgcmV0dXJuIHZhbC5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZENvbnRleHRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFsID0gU3RyaW5nKHRoaXMuY3VycmVudFZhbHVlKCkgPz8gJycpO1xuICAgIGlmICh2YWwuc3RhcnRzV2l0aCgne3tjb250ZXh0LicpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJvb2xlYW5GaXhlZFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1cnJlbnRWYWx1ZSgpO1xuICAgIHJldHVybiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyB8fCB2ID09PSAxIHx8IHYgPT09ICcxJztcbiAgfSk7XG5cbiAgc2V0TW9kZShtb2RlOiBQYXJhbWV0ZXJCaW5kaW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxNb2RlLnNldChtb2RlKTtcbiAgICBpZiAobW9kZSA9PT0gJ3Nlc3Npb24nKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuc2Vzc2lvbk1hdGNoKCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGB7e3Nlc3Npb24uJHttYXRjaC5zZXNzaW9uS2V5fX19YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpbmtlZEZpZWxkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgICBmaWVsZEtleTogJycsXG4gICAgICAgIGlzTGlua2VkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ2ZpeGVkJykge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFZhbHVlKCk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gJycgJiYgIVN0cmluZyhjdXJyZW50KS5zdGFydHNXaXRoKCd7eycpKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjdXJyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJhbSgpLmRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5wYXJhbSgpLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbih0aGlzLnBhcmFtKCkuZGVmYXVsdFZhbHVlKSA6IHRydWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkZWYpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhcmFtKCkuZGF0YVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMucGFyYW0oKS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IE51bWJlcih0aGlzLnBhcmFtKCkuZGVmYXVsdFZhbHVlKSA6IDA7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Db250cm9sU2VsZWN0ZWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBleHByID0gYHt7JHtrZXl9fX1gO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGV4cHIpO1xuICAgICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgICAgcGFyYW1OYW1lOiB0aGlzLnBhcmFtKCkubmFtZSxcbiAgICAgICAgZmllbGRLZXk6IGtleSxcbiAgICAgICAgaXNMaW5rZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KCcnKTtcbiAgICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICAgIGZpZWxkS2V5OiAnJyxcbiAgICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Cb29sZWFuQ2hhbmdlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgb25GaXhlZFZhbHVlQ2hhbmdlZCh2YWw6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgdGhpcy5saW5rZWRGaWVsZENoYW5nZS5lbWl0KHtcbiAgICAgIHBhcmFtTmFtZTogdGhpcy5wYXJhbSgpLm5hbWUsXG4gICAgICBmaWVsZEtleTogJycsXG4gICAgICBpc0xpbmtlZDogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBvbkNvbnRleHRTZWxlY3RlZChjdHhLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjdHhLZXkpO1xuICAgIHRoaXMubGlua2VkRmllbGRDaGFuZ2UuZW1pdCh7XG4gICAgICBwYXJhbU5hbWU6IHRoaXMucGFyYW0oKS5uYW1lLFxuICAgICAgZmllbGRLZXk6ICcnLFxuICAgICAgaXNMaW5rZWQ6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|