@cqa-lib/cqa-ui 1.1.225 → 1.1.227

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2020/lib/simulator/simulator.component.mjs +28 -45
  2. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +267 -44
  3. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +183 -41
  4. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +44 -3
  5. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +218 -57
  6. package/esm2020/lib/test-case-details/element-popup/element-form/element-form.component.mjs +277 -0
  7. package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +32 -192
  8. package/esm2020/lib/ui-kit.module.mjs +6 -1
  9. package/esm2020/public-api.mjs +2 -1
  10. package/fesm2015/cqa-lib-cqa-ui.mjs +1118 -444
  11. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  12. package/fesm2020/cqa-lib-cqa-ui.mjs +1103 -440
  13. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  14. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +50 -4
  15. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +39 -2
  16. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +17 -1
  17. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +56 -5
  18. package/lib/test-case-details/element-popup/element-form/element-form.component.d.ts +77 -0
  19. package/lib/test-case-details/element-popup/element-popup.component.d.ts +13 -32
  20. package/lib/ui-kit.module.d.ts +42 -41
  21. package/package.json +1 -1
  22. package/public-api.d.ts +1 -0
  23. package/styles.css +1 -1
@@ -4,9 +4,8 @@ import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/forms";
5
5
  import * as i2 from "../../search-bar/search-bar.component";
6
6
  import * as i3 from "../template-variables-form/template-variables-form.component";
7
- import * as i4 from "@angular/material/icon";
8
- import * as i5 from "../../button/button.component";
9
- import * as i6 from "@angular/common";
7
+ import * as i4 from "../../button/button.component";
8
+ import * as i5 from "@angular/common";
10
9
  export class StepBuilderActionComponent {
11
10
  constructor(fb) {
12
11
  this.fb = fb;
@@ -18,7 +17,22 @@ export class StepBuilderActionComponent {
18
17
  /** Function to handle variable processing or custom logic. Can be passed from parent component. */
19
18
  this.setTemplateVariables = () => { return []; };
20
19
  this.preventSelectTemplate = ['databaseverification'];
20
+ this.elementOptions = []; // Element objects for element dropdown
21
+ this.hasMoreElements = false; // Whether more elements are available
22
+ this.isLoadingElements = false; // Loading state for elements
23
+ /** Screen name options for element form autocomplete (from API) */
24
+ this.screenNameOptions = [];
25
+ /** Whether more screen names are available for infinite scroll */
26
+ this.hasMoreScreenNames = false;
27
+ /** True while parent is loading screen names (search or load more) */
28
+ this.isLoadingScreenNames = false;
21
29
  this.templateChanged = new EventEmitter();
30
+ this.loadMoreElements = new EventEmitter(); // Emit when load more is requested
31
+ this.searchElements = new EventEmitter(); // Emit when user searches for elements
32
+ this.createElement = new EventEmitter(); // Emit when element is created
33
+ this.searchScreenName = new EventEmitter(); // Emit when user searches screen names
34
+ this.loadMoreScreenNames = new EventEmitter(); // Emit when user scrolls to load more screen names
35
+ this.createScreenNameRequest = new EventEmitter(); // Emit when user requests to create a new screen name
22
36
  /** Emit when step is created */
23
37
  this.createStep = new EventEmitter();
24
38
  /** Emit when cancelled */
@@ -30,12 +44,21 @@ export class StepBuilderActionComponent {
30
44
  this.description = '';
31
45
  this.advancedExpanded = false;
32
46
  this.templateVariables = [];
47
+ this.updatedHtmlGrammar = ''; // Updated HTML grammar with variable values
48
+ // Track element form visibility
49
+ this.isElementFormVisible = false;
33
50
  // Cache for select configs to avoid recalculating on every change detection
34
51
  this.selectConfigCache = new Map();
35
52
  this.formValidCache = false;
36
53
  this.lastFormValidationTime = 0;
37
54
  this.FORM_VALIDATION_CACHE_MS = 100; // Cache for 100ms
38
- this.variablesForm = this.fb.group({});
55
+ this.variablesForm = this.fb.array([]);
56
+ }
57
+ /**
58
+ * Handle element form visibility change
59
+ */
60
+ onElementFormVisibilityChange(visible) {
61
+ this.isElementFormVisible = visible;
39
62
  }
40
63
  ngOnInit() {
41
64
  this.filteredTemplates = [...this.templates];
@@ -65,14 +88,38 @@ export class StepBuilderActionComponent {
65
88
  const searchTerm = this.searchValue.toLowerCase().trim();
66
89
  this.filteredTemplates = this.templates.filter(template => {
67
90
  const naturalText = template.naturalText?.toLowerCase() || '';
68
- const displayName = template.displayName?.toLowerCase() || '';
91
+ // Strip HTML tags from htmlGrammar for searching (only search text content, not HTML markup)
92
+ const htmlGrammarText = this.stripHtmlTags(template.htmlGrammar || '').toLowerCase();
69
93
  const searchableGrammar = template.searchableGrammar?.toLowerCase() || '';
70
94
  return naturalText.includes(searchTerm) ||
71
- displayName.includes(searchTerm) ||
95
+ htmlGrammarText.includes(searchTerm) ||
72
96
  searchableGrammar.includes(searchTerm);
73
97
  });
74
98
  console.log("filteredTemplates", this.filteredTemplates);
75
99
  }
100
+ /**
101
+ * Strip HTML tags from a string, returning only the text content
102
+ * @param htmlString - HTML string to strip tags from
103
+ * @returns Plain text without HTML tags
104
+ */
105
+ stripHtmlTags(htmlString) {
106
+ if (!htmlString)
107
+ return '';
108
+ // Use browser's DOMParser if available
109
+ if (typeof document !== 'undefined' && document.createElement) {
110
+ try {
111
+ const tempDiv = document.createElement('div');
112
+ tempDiv.innerHTML = htmlString;
113
+ return tempDiv.textContent || tempDiv.innerText || '';
114
+ }
115
+ catch (error) {
116
+ // Fallback to regex if DOM parsing fails
117
+ return htmlString.replace(/<[^>]*>/g, '');
118
+ }
119
+ }
120
+ // Fallback: regex-based tag removal for server-side rendering
121
+ return htmlString.replace(/<[^>]*>/g, '');
122
+ }
76
123
  selectTemplate(template) {
77
124
  if (this.preventSelectTemplate.includes(template.displayName || '')) {
78
125
  this.templateChanged.emit(template);
@@ -89,20 +136,26 @@ export class StepBuilderActionComponent {
89
136
  setTimeout(() => {
90
137
  try {
91
138
  this.templateVariables = this.setTemplateVariables(template);
139
+ console.log("templateVariables", this.templateVariables);
92
140
  this.buildVariablesForm();
141
+ // Initialize updated HTML grammar
142
+ this.updateHtmlGrammar();
93
143
  }
94
144
  catch (error) {
95
145
  console.error('Error processing template variables:', error);
96
146
  }
97
147
  }, 0);
98
148
  }
149
+ else {
150
+ // Initialize with template's HTML grammar if no variables
151
+ this.updatedHtmlGrammar = template.htmlGrammar || template.naturalText || '';
152
+ }
99
153
  }
100
154
  buildVariablesForm() {
101
- // Clear existing form controls
102
- const controlKeys = Object.keys(this.variablesForm.controls);
103
- controlKeys.forEach(key => {
104
- this.variablesForm.removeControl(key);
105
- });
155
+ // Clear existing form array
156
+ while (this.variablesForm.length !== 0) {
157
+ this.variablesForm.removeAt(0);
158
+ }
106
159
  // Clear cache when form is rebuilt
107
160
  this.selectConfigCache.clear();
108
161
  this.formValidCache = false;
@@ -110,13 +163,39 @@ export class StepBuilderActionComponent {
110
163
  if (this.formValueChangesSubscription) {
111
164
  this.formValueChangesSubscription.unsubscribe();
112
165
  }
113
- // Add form controls for each variable
166
+ // Add form groups for each variable
114
167
  this.templateVariables.forEach(variable => {
115
168
  // Handle boolean variables - use boolean value, others use string
116
169
  const defaultValue = variable.type === 'boolean'
117
170
  ? (variable.value === true || variable.value === 'true' || variable.value === 1)
118
171
  : (variable.value || '');
119
- this.variablesForm.addControl(variable.name, new FormControl(defaultValue));
172
+ // Create a FormGroup for each variable with name and value
173
+ const variableGroup = this.fb.group({
174
+ name: [variable.name],
175
+ value: [defaultValue],
176
+ type: [variable.type || 'string'],
177
+ label: [variable.label || ''],
178
+ options: [variable.options || []]
179
+ });
180
+ // Add dataType control for test-data variables if needed
181
+ const label = variable.label?.toLowerCase() || '';
182
+ if (label === 'test-data' || label === 'source-value' || label === 'target-value' ||
183
+ label === 'source_value' || label === 'target_value') {
184
+ // Parse the value to determine data type
185
+ const valueStr = String(defaultValue || '');
186
+ let dataType = 'plain-text';
187
+ if (valueStr.startsWith('@|') && valueStr.endsWith('|')) {
188
+ dataType = 'parameter';
189
+ }
190
+ else if (valueStr.startsWith('$|') && valueStr.endsWith('|')) {
191
+ dataType = 'runtime';
192
+ }
193
+ else if (valueStr.startsWith('*|') && valueStr.endsWith('|')) {
194
+ dataType = 'environment';
195
+ }
196
+ variableGroup.addControl('dataType', new FormControl(dataType));
197
+ }
198
+ this.variablesForm.push(variableGroup);
120
199
  });
121
200
  // Subscribe to form value changes to invalidate cache (only when user actually changes values)
122
201
  // Note: We use emitEvent: false when programmatically setting values, so this won't fire unnecessarily
@@ -130,7 +209,7 @@ export class StepBuilderActionComponent {
130
209
  this.formValueChangesSubscription.unsubscribe();
131
210
  }
132
211
  }
133
- getSelectConfig(variable) {
212
+ getSelectConfig(variable, index) {
134
213
  // Use cache to avoid recalculating on every change detection
135
214
  const cacheKey = `${variable.name}_${variable.options?.join(',') || ''}`;
136
215
  if (this.selectConfigCache.has(cacheKey)) {
@@ -143,7 +222,7 @@ export class StepBuilderActionComponent {
143
222
  label: opt
144
223
  }));
145
224
  const config = {
146
- key: variable.name,
225
+ key: `value`,
147
226
  placeholder: `Select ${variable.label}`,
148
227
  multiple: false,
149
228
  searchable: false,
@@ -155,18 +234,62 @@ export class StepBuilderActionComponent {
155
234
  this.selectConfigCache.set(cacheKey, config);
156
235
  return config;
157
236
  }
237
+ /** Get form group for a variable by name */
238
+ getVariableFormGroup(variableName) {
239
+ const variableIndex = this.variablesForm.controls.findIndex(control => control.get('name')?.value === variableName);
240
+ if (variableIndex !== -1) {
241
+ return this.variablesForm.at(variableIndex);
242
+ }
243
+ return null;
244
+ }
245
+ /** Add a new variable to the form array dynamically */
246
+ addVariable(variable) {
247
+ const defaultValue = variable.type === 'boolean'
248
+ ? (variable.value === true || variable.value === 'true' || variable.value === 1)
249
+ : (variable.value || '');
250
+ const variableGroup = this.fb.group({
251
+ name: [variable.name],
252
+ value: [defaultValue],
253
+ type: [variable.type || 'string'],
254
+ label: [variable.label || ''],
255
+ options: [variable.options || []]
256
+ });
257
+ // Add dataType control for test-data variables if needed
258
+ const label = variable.label?.toLowerCase() || '';
259
+ if (label === 'test-data' || label === 'source-value' || label === 'target-value' ||
260
+ label === 'source_value' || label === 'target_value') {
261
+ const valueStr = String(defaultValue || '');
262
+ let dataType = 'plain-text';
263
+ if (valueStr.startsWith('@|') && valueStr.endsWith('|')) {
264
+ dataType = 'parameter';
265
+ }
266
+ else if (valueStr.startsWith('$|') && valueStr.endsWith('|')) {
267
+ dataType = 'runtime';
268
+ }
269
+ else if (valueStr.startsWith('*|') && valueStr.endsWith('|')) {
270
+ dataType = 'environment';
271
+ }
272
+ variableGroup.addControl('dataType', new FormControl(dataType));
273
+ }
274
+ this.variablesForm.push(variableGroup);
275
+ this.formValidCache = false;
276
+ }
158
277
  onVariableValueChange(variableName, value) {
278
+ console.log("onVariableValueChange", variableName, value);
159
279
  // Update the variable in templateVariables array
160
280
  const variable = this.templateVariables.find(v => v.name === variableName);
161
281
  if (variable) {
162
282
  variable.value = value;
163
283
  }
164
- // Also update form control (use emitEvent: false to prevent triggering valueChanges)
165
- if (this.variablesForm.get(variableName)) {
166
- this.variablesForm.get(variableName)?.setValue(value, { emitEvent: false });
284
+ // Also update form array (use emitEvent: false to prevent triggering valueChanges)
285
+ const variableIndex = this.variablesForm.controls.findIndex(control => control.get('name')?.value === variableName);
286
+ if (variableIndex !== -1) {
287
+ this.variablesForm.at(variableIndex).get('value')?.setValue(value, { emitEvent: false });
167
288
  }
168
289
  // Invalidate form validation cache
169
290
  this.formValidCache = false;
291
+ // Update HTML grammar with new value
292
+ this.updateHtmlGrammar();
170
293
  }
171
294
  onVariableBooleanChange(variableName, value) {
172
295
  // Update the variable in templateVariables array
@@ -174,16 +297,26 @@ export class StepBuilderActionComponent {
174
297
  if (variable) {
175
298
  variable.value = value;
176
299
  }
177
- // Also update form control (use emitEvent: false to prevent triggering valueChanges)
178
- if (this.variablesForm.get(variableName)) {
179
- this.variablesForm.get(variableName)?.setValue(value, { emitEvent: false });
300
+ // Also update form array (use emitEvent: false to prevent triggering valueChanges)
301
+ const variableIndex = this.variablesForm.controls.findIndex(control => control.get('name')?.value === variableName);
302
+ if (variableIndex !== -1) {
303
+ this.variablesForm.at(variableIndex).get('value')?.setValue(value, { emitEvent: false });
180
304
  }
181
305
  else {
182
- // Create form control if it doesn't exist
183
- this.variablesForm.addControl(variableName, new FormControl(value));
306
+ // Create new form group if it doesn't exist
307
+ const variableGroup = this.fb.group({
308
+ name: [variableName],
309
+ value: [value],
310
+ type: ['boolean'],
311
+ label: [variable?.label || ''],
312
+ options: [variable?.options || []]
313
+ });
314
+ this.variablesForm.push(variableGroup);
184
315
  }
185
316
  // Invalidate form validation cache
186
317
  this.formValidCache = false;
318
+ // Update HTML grammar with new value
319
+ this.updateHtmlGrammar();
187
320
  }
188
321
  onBack() {
189
322
  this.selectedTemplate = null;
@@ -191,10 +324,11 @@ export class StepBuilderActionComponent {
191
324
  this.description = '';
192
325
  this.advancedExpanded = false;
193
326
  this.templateVariables = [];
194
- // Clear form controls
195
- Object.keys(this.variablesForm.controls).forEach(key => {
196
- this.variablesForm.removeControl(key);
197
- });
327
+ this.updatedHtmlGrammar = '';
328
+ // Clear form array
329
+ while (this.variablesForm.length !== 0) {
330
+ this.variablesForm.removeAt(0);
331
+ }
198
332
  // Reapply filter to maintain search state
199
333
  this.applyFilter();
200
334
  }
@@ -212,22 +346,22 @@ export class StepBuilderActionComponent {
212
346
  return this.formValidCache;
213
347
  }
214
348
  // Check if all required variables are filled
215
- let isValid = true;
216
- if (this.templateVariables && this.templateVariables.length > 0) {
217
- isValid = this.templateVariables.every(variable => {
218
- // Boolean variables are always valid (they have a default value)
219
- if (variable.type === 'boolean') {
220
- return true;
221
- }
222
- // Check if variable has a value
223
- const value = variable.value;
224
- return value !== null && value !== undefined && value !== '';
225
- });
226
- }
349
+ // let isValid = true;
350
+ // if (this.templateVariables && this.templateVariables.length > 0) {
351
+ // isValid = this.templateVariables.every(variable => {
352
+ // // Boolean variables are always valid (they have a default value)
353
+ // if (variable.type === 'boolean') {
354
+ // return true;
355
+ // }
356
+ // // Check if variable has a value
357
+ // const value = variable.value;
358
+ // return value !== null && value !== undefined && value !== '';
359
+ // });
360
+ // }
227
361
  // Cache the result
228
- this.formValidCache = isValid;
362
+ this.formValidCache = this.variablesForm.valid;
229
363
  this.lastFormValidationTime = now;
230
- return isValid;
364
+ return this.variablesForm.valid;
231
365
  }
232
366
  trackByTemplate(index, template) {
233
367
  return template.id || template.displayName || index;
@@ -245,6 +379,8 @@ export class StepBuilderActionComponent {
245
379
  description: this.description,
246
380
  templateVariables: this.templateVariables
247
381
  };
382
+ console.log("stepData", stepData);
383
+ console.log("variablesForm", this.variablesForm.value);
248
384
  this.createStep.emit(stepData);
249
385
  }
250
386
  toggleAdvanced() {
@@ -260,12 +396,75 @@ export class StepBuilderActionComponent {
260
396
  onTestDataValueChange(key, value) {
261
397
  console.log(key, value);
262
398
  }
399
+ /**
400
+ * Update HTML grammar by replacing placeholder spans with actual variable values
401
+ */
402
+ updateHtmlGrammar() {
403
+ if (!this.selectedTemplate) {
404
+ this.updatedHtmlGrammar = '';
405
+ return;
406
+ }
407
+ const htmlGrammar = this.selectedTemplate.htmlGrammar || this.selectedTemplate.naturalText || '';
408
+ if (!htmlGrammar) {
409
+ this.updatedHtmlGrammar = '';
410
+ return;
411
+ }
412
+ // Create a map of variable values by name for quick lookup
413
+ const valueMap = new Map();
414
+ if (this.templateVariables && Array.isArray(this.templateVariables)) {
415
+ this.templateVariables.forEach((variable) => {
416
+ if (variable.name && variable.value !== undefined && variable.value !== null) {
417
+ // Convert value to string, handling boolean values
418
+ const valueStr = typeof variable.value === 'boolean'
419
+ ? (variable.value ? 'true' : 'false')
420
+ : String(variable.value || '');
421
+ valueMap.set(variable.name, valueStr);
422
+ }
423
+ });
424
+ }
425
+ // Use browser's DOMParser if available, otherwise fallback to string replacement
426
+ if (typeof document !== 'undefined' && document.createElement) {
427
+ try {
428
+ const tempDiv = document.createElement('div');
429
+ tempDiv.innerHTML = String(htmlGrammar);
430
+ // Find all spans with data-event-key attribute
431
+ const spans = tempDiv.querySelectorAll('span[data-event-key]');
432
+ spans.forEach((span) => {
433
+ const eventKey = span.getAttribute('data-event-key');
434
+ if (eventKey && valueMap.has(eventKey)) {
435
+ const value = valueMap.get(eventKey);
436
+ // Preserve the span structure but update the content
437
+ span.innerHTML = value || '';
438
+ }
439
+ });
440
+ this.updatedHtmlGrammar = tempDiv.innerHTML;
441
+ }
442
+ catch (error) {
443
+ console.error('Error updating HTML grammar:', error);
444
+ // Fallback to original HTML grammar
445
+ this.updatedHtmlGrammar = String(htmlGrammar);
446
+ }
447
+ }
448
+ else {
449
+ // Fallback: simple string replacement for server-side rendering
450
+ let updatedHtml = String(htmlGrammar);
451
+ valueMap.forEach((value, key) => {
452
+ // Replace spans with data-event-key matching the variable name
453
+ const regex = new RegExp(`<span[^>]*data-event-key="${key}"[^>]*>.*?</span>`, 'gi');
454
+ updatedHtml = updatedHtml.replace(regex, (match) => {
455
+ // Replace the content inside the span
456
+ return match.replace(/>.*?</, `>${value}<`);
457
+ });
458
+ });
459
+ this.updatedHtmlGrammar = updatedHtml;
460
+ }
461
+ }
263
462
  }
264
463
  StepBuilderActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
265
- StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate" }, outputs: { templateChanged: "templateChanged", createStep: "createStep", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
464
+ StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", createStep: "createStep", cancelled: "cancelled" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!isElementFormVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
266
465
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, decorators: [{
267
466
  type: Component,
268
- args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
467
+ args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <!-- <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n </div>\n </div> -->\n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!isElementFormVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
269
468
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { showHeader: [{
270
469
  type: Input
271
470
  }], templates: [{
@@ -276,11 +475,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
276
475
  type: Input
277
476
  }], preventSelectTemplate: [{
278
477
  type: Input
478
+ }], elementOptions: [{
479
+ type: Input
480
+ }], hasMoreElements: [{
481
+ type: Input
482
+ }], isLoadingElements: [{
483
+ type: Input
484
+ }], screenNameOptions: [{
485
+ type: Input
486
+ }], hasMoreScreenNames: [{
487
+ type: Input
488
+ }], isLoadingScreenNames: [{
489
+ type: Input
279
490
  }], templateChanged: [{
280
491
  type: Output
492
+ }], loadMoreElements: [{
493
+ type: Output
494
+ }], searchElements: [{
495
+ type: Output
496
+ }], createElement: [{
497
+ type: Output
498
+ }], searchScreenName: [{
499
+ type: Output
500
+ }], loadMoreScreenNames: [{
501
+ type: Output
502
+ }], createScreenNameRequest: [{
503
+ type: Output
281
504
  }], createStep: [{
282
505
  type: Output
283
506
  }], cancelled: [{
284
507
  type: Output
285
508
  }] } });
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBMEIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBcUNyRSxNQUFNLE9BQU8sMEJBQTBCO0lBbUNyQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQWxDMUIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUNwQywwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFFMUMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7UUFFOUUsMEJBQXFCLEdBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDL0QsZ0NBQWdDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRS9DLDBCQUEwQjtRQUNoQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUvQyxzQkFBaUIsR0FBcUIsRUFBRSxDQUFDO1FBQ3pDLGdCQUFXLEdBQVcsRUFBRSxD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O0lBQzFCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDOzt1SEF2U1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsb2FDdEN2QyxtdUlBNkZNOzJGRHZETywwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UseUJBQXlCLFFBRzdCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtrR0FHckIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVEZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0OiBzdHJpbmcgfCBib29sZWFuO1xuICBtdXRhYmxlOiBib29sZWFuO1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVGVtcGxhdGUge1xuICBpZD86IG51bWJlcjtcbiAgbmF0dXJhbFRleHQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBodG1sR3JhbW1hcj86IHN0cmluZztcbiAgc2VhcmNoYWJsZUdyYW1tYXI/OiBzdHJpbmc7XG4gIHdvcmtzcGFjZVR5cGU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgaXNBZGRvbj86IGJvb2xlYW47XG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIFZhcmlhYmxlRGVmaW5pdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdlbGVtZW50JyB8ICd0ZXN0LWRhdGEnIHwgJ2F0dHJpYnV0ZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJBY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICBASW5wdXQoKSBwcmV2ZW50U2VsZWN0VGVtcGxhdGU6IHN0cmluZ1tdID0gWydkYXRhYmFzZXZlcmlmaWNhdGlvbiddO1xuICBAT3V0cHV0KCkgdGVtcGxhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxBY3Rpb25UZW1wbGF0ZT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGZpbHRlcmVkVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcbiAgXG4gIC8vIENhY2hlIGZvciBzZWxlY3QgY29uZmlncyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBmb3JtVmFsaWRDYWNoZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RGb3JtVmFsaWRhdGlvblRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9STV9WQUxJREFUSU9OX0NBQ0hFX01TID0gMTAwOyAvLyBDYWNoZSBmb3IgMTAwbXNcbiAgcHJpdmF0ZSBmb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy52YXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVzJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hDbGVhcmVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gdGhpcy50ZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gdGVtcGxhdGUubmF0dXJhbFRleHQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRlbXBsYXRlLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc2VhcmNoYWJsZUdyYW1tYXIgPSB0ZW1wbGF0ZS5zZWFyY2hhYmxlR3JhbW1hcj8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIFxuICAgICAgcmV0dXJuIG5hdHVyYWxUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgIGRpc3BsYXlOYW1lLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgIHNlYXJjaGFibGVHcmFtbWFyLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKFwiZmlsdGVyZWRUZW1wbGF0ZXNcIiwgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyk7XG4gIH1cblxuICBzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUpOiB2b2lkIHtcbiAgICBpZih0aGlzLnByZXZlbnRTZWxlY3RUZW1wbGF0ZS5pbmNsdWRlcyh0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIHRlbXBsYXRlIGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIFxuICAgIGlmKHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBkZWZlciBoZWF2eSBvcGVyYXRpb25zIGFuZCBwcmV2ZW50IFVJIGZyZWV6aW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgVUkgdG8gdXBkYXRlIGZpcnN0LCB0aGVuIHByb2Nlc3MgdGhlIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICAgIHRoaXMuYnVpbGRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyB0ZW1wbGF0ZSB2YXJpYWJsZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBmb3JtIGNvbnRyb2xzXG4gICAgY29uc3QgY29udHJvbEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMpO1xuICAgIGNvbnRyb2xLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIGZvcm0gaXMgcmVidWlsdFxuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBpZiBpdCBleGlzdHNcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBjb250cm9scyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBmb3JtIHZhbHVlIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSBjYWNoZSAob25seSB3aGVuIHVzZXIgYWN0dWFsbHkgY2hhbmdlcyB2YWx1ZXMpXG4gICAgLy8gTm90ZTogV2UgdXNlIGVtaXRFdmVudDogZmFsc2Ugd2hlbiBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgdmFsdWVzLCBzbyB0aGlzIHdvbid0IGZpcmUgdW5uZWNlc3NhcmlseVxuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9XyR7dmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgaWYgKHRoaXMudmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGVOYW1lKSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gY29udHJvbCAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBpZiAodGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlTmFtZSk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBmb3JtIGNvbnRyb2wgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGVOYW1lLCBuZXcgRm9ybUNvbnRyb2wodmFsdWUpKTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICB0aGlzLm1ldGFkYXRhID0gJyc7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9ICcnO1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICAvLyBDbGVhciBmb3JtIGNvbnRyb2xzXG4gICAgT2JqZWN0LmtleXModGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIC8vIFJlYXBwbHkgZmlsdGVyIHRvIG1haW50YWluIHNlYXJjaCBzdGF0ZVxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMub25CYWNrKCk7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGNhY2hlZCByZXN1bHQgaWYgYXZhaWxhYmxlIGFuZCByZWNlbnRcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmZvcm1WYWxpZENhY2hlICYmIChub3cgLSB0aGlzLmxhc3RGb3JtVmFsaWRhdGlvblRpbWUpIDwgdGhpcy5GT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZENhY2hlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgcmVxdWlyZWQgdmFyaWFibGVzIGFyZSBmaWxsZWRcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBpc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgICAgIC8vIEJvb2xlYW4gdmFyaWFibGVzIGFyZSBhbHdheXMgdmFsaWQgKHRoZXkgaGF2ZSBhIGRlZmF1bHQgdmFsdWUpXG4gICAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB2YXJpYWJsZSBoYXMgYSB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBpc1ZhbGlkO1xuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuICBcbiAgdHJhY2tCeVRlbXBsYXRlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlkIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZVN0ZXAuZW1pdChzdGVwRGF0YSk7XG4gIH1cblxuICB0b2dnbGVBZHZhbmNlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSAhdGhpcy5hZHZhbmNlZEV4cGFuZGVkO1xuICB9XG5cblxuICBvbkVsZW1lbnRDbGljayhlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGb2N1cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBmaWVsZFxuICAgIC8vIFRoaXMgY2FuIGJlIGVuaGFuY2VkIHRvIHNjcm9sbCB0byBvciBoaWdobGlnaHQgdGhlIGZpZWxkXG4gIH1cblxuICBvbkVsZW1lbnRWYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgb25UZXN0RGF0YVZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZVwiIFtuZ0NsYXNzXT1cInsnY3FhLXB4LTQgY3FhLXB5LTInOiBzaG93SGVhZGVyfVwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyICpuZ0lmPVwic2hvd0hlYWRlclwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItMVwiPlxuICAgIENyZWF0ZSBhbiBhY3Rpb24gc3RlcFxuICA8L2gyPlxuICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1mbGV4LTFcIlxuICAgIFtuZ0NsYXNzXT1cInsnY3FhLXB4LTMnOiBzaG93SGVhZGVyfVwiPlxuXG4gICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcGItMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCIgKm5nSWY9XCJzaG93SGVhZGVyXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgVGVtcGxhdGUgbGlicmFyeVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhciBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiIChzZWFyY2gpPVwib25TZWFyY2hTdWJtaXQoJGV2ZW50KVwiIChjbGVhcmVkKT1cIm9uU2VhcmNoQ2xlYXJlZCgpXCI+XG4gICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUZW1wbGF0ZSBMaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLXB4LTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHktMlwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBmaWx0ZXJlZFRlbXBsYXRlczsgdHJhY2tCeTogdHJhY2tCeVRlbXBsYXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS1iZy13aGl0ZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGhvdmVyOmNxYS1ib3JkZXItYmx1ZS01MDAgaG92ZXI6Y3FhLXNoYWRvdy1zbSBtYi02XCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGVtcGxhdGUodGVtcGxhdGUpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwidGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkVGVtcGxhdGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1weS04IGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgIE5vIHRlbXBsYXRlcyBmb3VuZFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGxcIj5cbiAgICA8IS0tIEluc3RydWN0aW9uIFRleHQgd2l0aCBFbGVtZW50IEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwic2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hciB8fCBzZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9ybSBGaWVsZHMgaW4gVHdvIENvbHVtbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwidGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwidmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgIChtZXRhZGF0YUNoYW5nZSk9XCJtZXRhZGF0YSA9ICRldmVudFwiXG4gICAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiZGVzY3JpcHRpb24gPSAkZXZlbnRcIj5cbiAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCAoRXhwYW5kYWJsZSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWR2YW5jZWQoKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWR2YW5jZWRFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICAgIDwhLS0gQWR2YW5jZWQgZmllbGRzIGNhbiBiZSBhZGRlZCBoZXJlIC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICA8Y3FhLWJ1dHRvbiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJDYW5jZWxcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvbiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJmaWxsZWRcIiB0ZXh0PVwiQ3JlYXRlIFN0ZXBcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTBELE1BQU0sZUFBZSxDQUFDO0FBQy9ILE9BQU8sRUFBMEIsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFnRGhGLE1BQU0sT0FBTywwQkFBMEI7SUFzRHJDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBckQxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLDBDQUEwQztRQUNqQyxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUUxQyx3Q0FBd0M7UUFDL0Isc0JBQWlCLEdBQVcsZ0JBQWdCLENBQUM7UUFFdEQsbUdBQW1HO1FBQzFGLHlCQUFvQixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU5RSwwQkFBcUIsR0FBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDM0QsbUJBQWMsR0FBYyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7UUFDdkUsb0JBQWUsR0FBWSxLQUFLLENBQUMsQ0FBQyxzQ0FBc0M7UUFDeEUsc0JBQWlCLEdBQVksS0FBSyxDQUFDLENBQUMsNkJBQTZCO1FBQzFFLG1FQUFtRTtRQUMxRCxzQkFBaUIsR0FBb0MsRUFBRSxDQUFDO1FBQ2pFLGtFQUFrRTtRQUN6RCx1QkFBa0IsR0FB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QkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVEZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0OiBzdHJpbmcgfCBib29sZWFuO1xuICBtdXRhYmxlOiBib29sZWFuO1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVGVtcGxhdGUge1xuICBpZD86IG51bWJlcjtcbiAgbmF0dXJhbFRleHQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBodG1sR3JhbW1hcj86IHN0cmluZztcbiAgc2VhcmNoYWJsZUdyYW1tYXI/OiBzdHJpbmc7XG4gIHdvcmtzcGFjZVR5cGU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgaXNBZGRvbj86IGJvb2xlYW47XG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIFZhcmlhYmxlRGVmaW5pdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdlbGVtZW50JyB8ICd0ZXN0LWRhdGEnIHwgJ2F0dHJpYnV0ZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6IGJsb2NrO2hlaWdodDogMTAwJTt3aWR0aDogMTAwJTsnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJBY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICBASW5wdXQoKSBwcmV2ZW50U2VsZWN0VGVtcGxhdGU6IHN0cmluZ1tdID0gWydkYXRhYmFzZXZlcmlmaWNhdGlvbiddO1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogRWxlbWVudFtdID0gW107IC8vIEVsZW1lbnQgb2JqZWN0cyBmb3IgZWxlbWVudCBkcm9wZG93blxuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gV2hldGhlciBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGVcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTG9hZGluZyBzdGF0ZSBmb3IgZWxlbWVudHNcbiAgLyoqIFNjcmVlbiBuYW1lIG9wdGlvbnMgZm9yIGVsZW1lbnQgZm9ybSBhdXRvY29tcGxldGUgKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBzY3JlZW5OYW1lT3B0aW9uczogeyBpZD86IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHNjcmVlbiBuYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHNjcmVlbiBuYW1lcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uVGVtcGxhdGU+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmaWx0ZXJlZFRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkVGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIG1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIHVwZGF0ZWRIdG1sR3JhbW1hcjogc3RyaW5nID0gJyc7IC8vIFVwZGF0ZWQgSFRNTCBncmFtbWFyIHdpdGggdmFyaWFibGUgdmFsdWVzXG4gIFxuICAvLyBUcmFjayBlbGVtZW50IGZvcm0gdmlzaWJpbGl0eVxuICBpc0VsZW1lbnRGb3JtVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlXG4gICAqL1xuICBvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0VsZW1lbnRGb3JtVmlzaWJsZSA9IHZpc2libGU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVzJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hDbGVhcmVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gdGhpcy50ZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gdGVtcGxhdGUubmF0dXJhbFRleHQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBodG1sR3JhbW1hciBmb3Igc2VhcmNoaW5nIChvbmx5IHNlYXJjaCB0ZXh0IGNvbnRlbnQsIG5vdCBIVE1MIG1hcmt1cClcbiAgICAgIGNvbnN0IGh0bWxHcmFtbWFyVGV4dCA9IHRoaXMuc3RyaXBIdG1sVGFncyh0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaGFibGVHcmFtbWFyID0gdGVtcGxhdGUuc2VhcmNoYWJsZUdyYW1tYXI/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBcbiAgICAgIHJldHVybiBuYXR1cmFsVGV4dC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICAgaHRtbEdyYW1tYXJUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgIHNlYXJjaGFibGVHcmFtbWFyLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKFwiZmlsdGVyZWRUZW1wbGF0ZXNcIiwgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaXAgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcsIHJldHVybmluZyBvbmx5IHRoZSB0ZXh0IGNvbnRlbnRcbiAgICogQHBhcmFtIGh0bWxTdHJpbmcgLSBIVE1MIHN0cmluZyB0byBzdHJpcCB0YWdzIGZyb21cbiAgICogQHJldHVybnMgUGxhaW4gdGV4dCB3aXRob3V0IEhUTUwgdGFnc1xuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sU3RyaW5nKSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gVXNlIGJyb3dzZXIncyBET01QYXJzZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmc7XG4gICAgICAgIHJldHVybiB0ZW1wRGl2LnRleHRDb250ZW50IHx8IHRlbXBEaXYuaW5uZXJUZXh0IHx8ICcnO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcmVnZXggaWYgRE9NIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEZhbGxiYWNrOiByZWdleC1iYXNlZCB0YWcgcmVtb3ZhbCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gIH1cblxuICBzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUpOiB2b2lkIHtcbiAgICBpZih0aGlzLnByZXZlbnRTZWxlY3RUZW1wbGF0ZS5pbmNsdWRlcyh0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIHRlbXBsYXRlIGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIFxuICAgIGlmKHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBkZWZlciBoZWF2eSBvcGVyYXRpb25zIGFuZCBwcmV2ZW50IFVJIGZyZWV6aW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgVUkgdG8gdXBkYXRlIGZpcnN0LCB0aGVuIHByb2Nlc3MgdGhlIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidGVtcGxhdGVWYXJpYWJsZXNcIiwgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5idWlsZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIHVwZGF0ZWQgSFRNTCBncmFtbWFyXG4gICAgICAgICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgdGVtcGxhdGUgdmFyaWFibGVzOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0ZW1wbGF0ZSdzIEhUTUwgZ3JhbW1hciBpZiBubyB2YXJpYWJsZXNcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgY2FjaGUgd2hlbiBmb3JtIGlzIHJlYnVpbHRcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91cyBzdWJzY3JpcHRpb24gaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIHZhcmlhYmxlcyAtIHVzZSBib29sZWFuIHZhbHVlLCBvdGhlcnMgdXNlIHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZSB3aXRoIG5hbWUgYW5kIHZhbHVlXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBBZGQgZGF0YVR5cGUgY29udHJvbCBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlcyBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAobGFiZWwgPT09ICd0ZXN0LWRhdGEnIHx8IGxhYmVsID09PSAnc291cmNlLXZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldC12YWx1ZScgfHwgXG4gICAgICAgICAgbGFiZWwgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAvLyBQYXJzZSB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGRhdGEgdHlwZVxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgICBsZXQgZGF0YVR5cGUgPSAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgICAgfVxuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBmb3JtIHZhbHVlIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSBjYWNoZSAob25seSB3aGVuIHVzZXIgYWN0dWFsbHkgY2hhbmdlcyB2YWx1ZXMpXG4gICAgLy8gTm90ZTogV2UgdXNlIGVtaXRFdmVudDogZmFsc2Ugd2hlbiBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgdmFsdWVzLCBzbyB0aGlzIHdvbid0IGZpcmUgdW5uZWNlc3NhcmlseVxuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYW4gdXAgc3Vic2NyaXB0aW9uIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBhbnksIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9XyR7dmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiBgdmFsdWVgLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBBZGQgYSBuZXcgdmFyaWFibGUgdG8gdGhlIGZvcm0gYXJyYXkgZHluYW1pY2FsbHkgKi9cbiAgYWRkVmFyaWFibGUodmFyaWFibGU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ10sXG4gICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBBZGQgZGF0YVR5cGUgY29udHJvbCBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlcyBpZiBuZWVkZWRcbiAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGlmIChsYWJlbCA9PT0gJ3Rlc3QtZGF0YScgfHwgbGFiZWwgPT09ICdzb3VyY2UtdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0LXZhbHVlJyB8fCBcbiAgICAgICAgbGFiZWwgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgIGxldCBkYXRhVHlwZSA9ICdwbGFpbi10ZXh0JztcbiAgICAgIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAnZW52aXJvbm1lbnQnO1xuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gIH1cblxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIm9uVmFyaWFibGVWYWx1ZUNoYW5nZVwiLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIC8vIEludmFsaWRhdGUgZm9ybSB2YWxpZGF0aW9uIGNhY2hlXG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgd2l0aCBuZXcgdmFsdWVcbiAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gIH1cblxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgZm9ybSBncm91cCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZU5hbWVdLFxuICAgICAgICB2YWx1ZTogW3ZhbHVlXSxcbiAgICAgICAgdHlwZTogWydib29sZWFuJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGU/LmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlPy5vcHRpb25zIHx8IFtdXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgIHRoaXMubWV0YWRhdGEgPSAnJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkID0gZmFsc2U7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgLy8gQ2xlYXIgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIC8vIFJlYXBwbHkgZmlsdGVyIHRvIG1haW50YWluIHNlYXJjaCBzdGF0ZVxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMub25CYWNrKCk7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGNhY2hlZCByZXN1bHQgaWYgYXZhaWxhYmxlIGFuZCByZWNlbnRcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmZvcm1WYWxpZENhY2hlICYmIChub3cgLSB0aGlzLmxhc3RGb3JtVmFsaWRhdGlvblRpbWUpIDwgdGhpcy5GT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZENhY2hlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgcmVxdWlyZWQgdmFyaWFibGVzIGFyZSBmaWxsZWRcbiAgICAvLyBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICBpc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgLy8gICAgIC8vIEJvb2xlYW4gdmFyaWFibGVzIGFyZSBhbHdheXMgdmFsaWQgKHRoZXkgaGF2ZSBhIGRlZmF1bHQgdmFsdWUpXG4gICAgLy8gICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICAvLyBDaGVjayBpZiB2YXJpYWJsZSBoYXMgYSB2YWx1ZVxuICAgIC8vICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgIC8vICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsaWQ7IFxuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkO1xuICB9XG4gIFxuICB0cmFja0J5VGVtcGxhdGUoaW5kZXg6IG51bWJlciwgdGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlKTogYW55IHtcbiAgICByZXR1cm4gdGVtcGxhdGUuaWQgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFyaWFibGUubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwRGF0YSA9IHtcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKFwic3RlcERhdGFcIiwgc3RlcERhdGEpO1xuICAgIGNvbnNvbGUubG9nKFwidmFyaWFibGVzRm9ybVwiLCB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaHRtbEdyYW1tYXIgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGhpcy5zZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICAgIGlmICghaHRtbEdyYW1tYXIpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbWFwIG9mIHZhcmlhYmxlIHZhbHVlcyBieSBuYW1lIGZvciBxdWljayBsb29rdXBcbiAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5uYW1lICYmIHZhcmlhYmxlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IHZhbHVlIHRvIHN0cmluZywgaGFuZGxpbmcgYm9vbGVhbiB2YWx1ZXNcbiAgICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKVxuICAgICAgICAgICAgOiBTdHJpbmcodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAgIHZhbHVlTWFwLnNldCh2YXJpYWJsZS5uYW1lLCB2YWx1ZVN0cik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZSBicm93c2VyJ3MgRE9NUGFyc2VyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIHN0cmluZyByZXBsYWNlbWVudFxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuXG4gICAgICAgIC8vIEZpbmQgYWxsIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IHNwYW5zID0gdGVtcERpdi5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3BhbltkYXRhLWV2ZW50LWtleV0nKTtcbiAgICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBldmVudEtleSA9IHNwYW4uZ2V0QXR0cmlidXRlKCdkYXRhLWV2ZW50LWtleScpO1xuICAgICAgICAgIGlmIChldmVudEtleSAmJiB2YWx1ZU1hcC5oYXMoZXZlbnRLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlTWFwLmdldChldmVudEtleSk7XG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3BhbiBzdHJ1Y3R1cmUgYnV0IHVwZGF0ZSB0aGUgY29udGVudFxuICAgICAgICAgICAgc3Bhbi5pbm5lckhUTUwgPSB2YWx1ZSB8fCAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBIVE1MIGdyYW1tYXI6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBIVE1MIGdyYW1tYXJcbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogc2ltcGxlIHN0cmluZyByZXBsYWNlbWVudCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICBsZXQgdXBkYXRlZEh0bWwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgdmFsdWVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAvLyBSZXBsYWNlIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgbWF0Y2hpbmcgdGhlIHZhcmlhYmxlIG5hbWVcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGA8c3BhbltePl0qZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgICAgdXBkYXRlZEh0bWwgPSB1cGRhdGVkSHRtbC5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBjb250ZW50IGluc2lkZSB0aGUgc3BhblxuICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+Lio/PC8sIGA+JHt2YWx1ZX08YCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IHVwZGF0ZWRIdG1sO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlXCIgW25nQ2xhc3NdPVwieydjcWEtcHgtNCc6IHNob3dIZWFkZXIsICdjcWEtcHktMic6IHNob3dIZWFkZXIgJiYgIXNlbGVjdGVkVGVtcGxhdGV9XCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi0xXCI+XG4gICAgQ3JlYXRlIGFuIGFjdGlvbiBzdGVwXG4gIDwvaDI+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtMVwiXG4gICAgW25nQ2xhc3NdPVwieydjcWEtcHgtMyc6IHNob3dIZWFkZXJ9XCI+XG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIiAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBsaWJyYXJ5XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1zZWFyY2gtYmFyIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgkZXZlbnQpXCIgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCIgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRlbXBsYXRlIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHgtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIGZpbHRlcmVkVGVtcGxhdGVzOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgaG92ZXI6Y3FhLWJvcmRlci1ibHVlLTUwMCBob3ZlcjpjcWEtc2hhZG93LXNtIG1iLTZcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRUZW1wbGF0ZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgTm8gdGVtcGxhdGVzIGZvdW5kXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW92ZXJmbG93LXktYXV0b1wiIHN0eWxlPVwiZmxleDogMSAxIDAgIWltcG9ydGFudDtcIj5cbiAgICA8IS0tIEluc3RydWN0aW9uIFRleHQgd2l0aCBFbGVtZW50IEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwidXBkYXRlZEh0bWxHcmFtbWFyIHx8IHNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvcm0gRmllbGRzIGluIFR3byBDb2x1bW5zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1mbGV4LTEgY3FhLXBiLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1mbGV4LXdyYXAgY3FhLXBiLTRcIj5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBGb3JtIENvbXBvbmVudCAtLT5cbiAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXG4gICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwidGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwidmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAobWV0YWRhdGFDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIlxuICAgICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uRWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZHZhbmNlZCAoRXhwYW5kYWJsZSkgLS0+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRWxlbWVudEZvcm1WaXNpYmxlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtcGItMlwiPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=