kwikid-forms 0.3.2 → 0.3.3

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 (43) hide show
  1. package/bundles/kwikid-forms.umd.js +1395 -393
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/builder/builder.component.js +86 -67
  4. package/esm2015/lib/builder/builder.module.js +52 -7
  5. package/esm2015/lib/builder/element-config-editor/editors/basic/checkbox-config.editor.component.js +72 -0
  6. package/esm2015/lib/builder/element-config-editor/editors/basic/date-config.editor.component.js +72 -0
  7. package/esm2015/lib/builder/element-config-editor/editors/basic/number-config.editor.component.js +72 -0
  8. package/esm2015/lib/builder/element-config-editor/editors/basic/otp-config.editor.component.js +130 -0
  9. package/esm2015/lib/builder/element-config-editor/editors/basic/phone-config.editor.component.js +130 -0
  10. package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +241 -147
  11. package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +48 -51
  12. package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +475 -333
  13. package/esm2015/lib/builder/element-config-editor/editors/document/aadhaar-number-config.editor.component.js +130 -0
  14. package/esm2015/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.js +135 -0
  15. package/esm2015/lib/builder/element-config-editor/editors/document-element-config.editor.component.js +610 -0
  16. package/esm2015/lib/builder/element-config-editor/editors/other/html-config.editor.component.js +120 -0
  17. package/esm2015/lib/builder/element-config-editor/editors/other/title-config.editor.component.js +121 -0
  18. package/esm2015/lib/builder/element-config-editor/editors/other-element-config.editor.component.js +214 -0
  19. package/esm2015/lib/builder/element-config-editor/element-config-editor.component.js +6 -3
  20. package/esm2015/lib/builder/shared/elements.js +33 -8
  21. package/esm2015/lib/renderer/config-converter.helper.js +1 -2
  22. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +1 -1
  23. package/esm2015/lib/renderer/form-view/form-view.component.js +28 -13
  24. package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +17 -15
  25. package/esm2015/lib/renderer/renderer.component.js +1 -2
  26. package/fesm2015/kwikid-forms.js +2786 -738
  27. package/fesm2015/kwikid-forms.js.map +1 -1
  28. package/lib/builder/builder.component.d.ts +4 -0
  29. package/lib/builder/builder.module.d.ts +16 -5
  30. package/lib/builder/element-config-editor/editors/basic/checkbox-config.editor.component.d.ts +16 -0
  31. package/lib/builder/element-config-editor/editors/basic/date-config.editor.component.d.ts +16 -0
  32. package/lib/builder/element-config-editor/editors/basic/number-config.editor.component.d.ts +16 -0
  33. package/lib/builder/element-config-editor/editors/basic/otp-config.editor.component.d.ts +16 -0
  34. package/lib/builder/element-config-editor/editors/basic/phone-config.editor.component.d.ts +16 -0
  35. package/lib/builder/element-config-editor/editors/document/aadhaar-number-config.editor.component.d.ts +16 -0
  36. package/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.d.ts +16 -0
  37. package/lib/builder/element-config-editor/editors/document-element-config.editor.component.d.ts +20 -0
  38. package/lib/builder/element-config-editor/editors/other/html-config.editor.component.d.ts +16 -0
  39. package/lib/builder/element-config-editor/editors/other/title-config.editor.component.d.ts +16 -0
  40. package/lib/builder/element-config-editor/editors/other-element-config.editor.component.d.ts +20 -0
  41. package/lib/builder/shared/elements.d.ts +3 -1
  42. package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +3 -1
  43. package/package.json +1 -1
@@ -3,8 +3,9 @@ import { Component, EventEmitter, Input, Output } from "@angular/core";
3
3
  import { FormArray, FormControl, FormGroup } from "@angular/forms";
4
4
  import { logMethod, setMissingKeyValue } from "kwikid-toolkit";
5
5
  import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/forms";
7
- import * as i2 from "@angular/common";
6
+ import * as i1 from "kwikui";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@angular/common";
8
9
  export class BasicRadioConfigEditor {
9
10
  constructor() {
10
11
  this.optionType = {
@@ -26,12 +27,13 @@ export class BasicRadioConfigEditor {
26
27
  this.createBasicRadioFormGroup();
27
28
  }
28
29
  ngOnChanges(changes) {
30
+ var _a;
29
31
  const verifyChange = (key) => {
30
32
  return changes.hasOwnProperty(key) && !changes[key].firstChange;
31
33
  };
32
34
  if (verifyChange("elementConfig")) {
33
35
  this.elementConfig = changes.elementConfig.currentValue;
34
- this.createBasicRadioFormGroup();
36
+ (_a = this.basicRadioFormGroup) === null || _a === void 0 ? void 0 : _a.reset(this.elementConfig);
35
37
  }
36
38
  if (verifyChange("saveBasicClickCounter")) {
37
39
  if (changes.saveBasicClickCounter.previousValue !==
@@ -100,82 +102,128 @@ export class BasicRadioConfigEditor {
100
102
  /** @nocollapse */ BasicRadioConfigEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BasicRadioConfigEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
101
103
  /** @nocollapse */ BasicRadioConfigEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BasicRadioConfigEditor, selector: "basic-radio-config-editor", inputs: { saveBasicClickCounter: "saveBasicClickCounter", elementConfig: "elementConfig" }, outputs: { updateElement: "updateElement" }, usesOnChanges: true, ngImport: i0, template: `
102
104
  <form [formGroup]="basicRadioFormGroup">
103
- <fieldset formArrayName="options">
104
- <legend>Options</legend>
105
- <ng-container
106
- *ngFor="let option of optionsArray.controls; let i = index"
107
- >
108
- <div [formGroupName]="i">
109
- <div class="form-group">
110
- <label for="basic-radio-config-placeholder">label</label>
111
- <input
112
- class="form-control"
113
- formControlName="label"
114
- id="basic-radio-config-placeholder"
115
- type="text"
116
- />
117
- </div>
118
- <div class="form-group">
119
- <label for="basic-radio-config-disabled">disabled</label>
120
- <select
121
- class="form-control"
122
- formControlName="disabled"
123
- id="basic-radio-config-disabled"
124
- >
125
- <option
126
- [ngValue]="null"
127
- disabled
128
- >Select Disability</option
129
- >
130
- <option
131
- *ngFor="let disabled of [true, false]"
132
- [ngValue]="disabled"
133
- >
134
- {{ disabled }}
135
- </option>
136
- </select>
137
- </div>
138
- <div class="form-group">
139
- <label for="basic-radio-config-description">description</label>
140
- <input
141
- class="form-control"
142
- formControlName="description"
143
- id="basic-radio-config-description"
144
- type="text"
145
- />
146
- </div>
147
- </div>
148
- <div class="form-array-actions">
149
- <button (click)="removeOption(i)">Remove</button>
150
- <button (click)="addOption()">Add</button>
151
- </div>
152
- </ng-container>
153
- </fieldset>
154
- <fieldset formGroupName="properties">
155
- <legend>Miscellaneous</legend>
156
- <div class="form-group">
157
- <label for="basic-radio-config-orientation">Orientation</label>
158
- <select
159
- class="form-control"
160
- formControlName="orientation"
161
- id="basic-radio-config-orientation"
105
+ <fieldset>
106
+ <legend class="form-group-title">Options</legend>
107
+ <div formArrayName="options">
108
+ <ng-container
109
+ *ngFor="let option of optionsArray.controls; let i = index"
162
110
  >
163
- <option
164
- [ngValue]="null"
165
- disabled
166
- >Select Orientation</option
167
- >
168
- <option
169
- *ngFor="let orientation of ['horizontal', 'vertical']"
170
- [ngValue]="orientation"
171
- >
172
- {{ orientation }}
173
- </option>
174
- </select>
111
+ <div [formGroupName]="i">
112
+ <div class="form-group">
113
+ <kwikui-input
114
+ [label]="'Label'"
115
+ [id]="'basic-radio-config-placeholder'"
116
+ [type]="'text'"
117
+ [formControlName]="'label'"
118
+ [formControl]="
119
+ basicRadioFormGroup['controls'].options['controls'][i][
120
+ 'controls'
121
+ ].label
122
+ "
123
+ [disabled]="false"
124
+ [placeholder]="'Please enter your label'"
125
+ [focus]="false"
126
+ [invalid]="false"
127
+ [case]="'default'"
128
+ size="m"
129
+ ></kwikui-input>
130
+ </div>
131
+ <div class="form-group">
132
+ <kwikui-select-combobox
133
+ [options]="[true, false]"
134
+ [label]="'disabled'"
135
+ [id]="'basic-radio-config-disabled'"
136
+ size="m"
137
+ [formControlName]="'disabled'"
138
+ [formControl]="
139
+ basicRadioFormGroup['controls'].options['controls'][i][
140
+ 'controls'
141
+ ].disabled
142
+ "
143
+ [focus]="false"
144
+ [disabled]="false"
145
+ [invalid]="false"
146
+ [placeholder]="'Please select either true or false'"
147
+ ></kwikui-select-combobox>
148
+ </div>
149
+ <div class="form-group">
150
+ <kwikui-input
151
+ [label]="'Description'"
152
+ [id]="'basic-radio-config-description'"
153
+ [type]="'text'"
154
+ [formControlName]="'description'"
155
+ [formControl]="
156
+ basicRadioFormGroup['controls'].options['controls'][i][
157
+ 'controls'
158
+ ].description
159
+ "
160
+ [disabled]="false"
161
+ [placeholder]="'Please enter your description'"
162
+ [focus]="false"
163
+ [invalid]="false"
164
+ [case]="'default'"
165
+ size="m"
166
+ ></kwikui-input>
167
+ </div>
168
+ <div class="form-array-actions">
169
+ <kwikui-button
170
+ [disabled]="false"
171
+ label="Remove"
172
+ [showLoader]="false"
173
+ styles=""
174
+ class="save-button"
175
+ type="button"
176
+ appearance="secondary"
177
+ icon=""
178
+ iconRight=""
179
+ [shape]="'rounded'"
180
+ size="s"
181
+ (onClick)="removeOption(i)"
182
+ ></kwikui-button>
183
+ <kwikui-button
184
+ [disabled]="false"
185
+ label="Add"
186
+ [showLoader]="false"
187
+ styles=""
188
+ class="save-button"
189
+ type="button"
190
+ appearance="secondary"
191
+ icon=""
192
+ iconRight=""
193
+ [shape]="'rounded'"
194
+ size="s"
195
+ (onClick)="addOption()"
196
+ ></kwikui-button>
197
+ </div>
198
+ </div>
199
+ </ng-container>
175
200
  </div>
176
201
  </fieldset>
202
+
203
+ <div formGroupName="properties">
204
+ <fieldset>
205
+ <legend class="form-group-title">Miscellaneous</legend>
206
+ <div class="form-group">
207
+ <kwikui-select-combobox
208
+ [options]="['horizontal', 'vertical']"
209
+ [label]="'Orientation'"
210
+ [id]="'basic-radio-config-orientation'"
211
+ size="m"
212
+ [formControlName]="'orientation'"
213
+ [formControl]="
214
+ basicRadioFormGroup['controls'].properties['controls']
215
+ .orientation
216
+ "
217
+ [focus]="false"
218
+ [disabled]="false"
219
+ [invalid]="false"
220
+ [placeholder]="'Please select orientation'"
221
+ ></kwikui-select-combobox>
222
+ </div>
223
+ </fieldset>
224
+ </div>
177
225
  </form>
178
- `, isInline: true, styles: ["\n .form-array-actions {\n display: flex;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n }\n "], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
226
+ `, isInline: true, styles: ["\n .form-array-actions {\n display: flex;\n flex-direction: row;\n align-content: center;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n }\n "], components: [{ type: i1.KwikUIInputComponent, selector: "kwikui-input", inputs: ["label", "id", "type", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "validators", "case", "size", "icon", "properties"], outputs: ["getKeyValue"] }, { type: i1.KwikUISelectComboboxComponent, selector: "kwikui-select-combobox", inputs: ["label", "id", "formControlName", "formControl", "placeholder", "focus", "invalid", "disabled", "options", "size", "validators", "properties"], outputs: ["getKeyValue"] }, { type: i1.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["disabled", "id", "label", "showLoader", "styles", "class", "type", "appearance", "icon", "iconRight", "shape", "size"], outputs: ["onClick"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
179
227
  __decorate([
180
228
  logMethod
181
229
  ], BasicRadioConfigEditor.prototype, "ngOnInit", null);
@@ -203,80 +251,126 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
203
251
  selector: "basic-radio-config-editor",
204
252
  template: `
205
253
  <form [formGroup]="basicRadioFormGroup">
206
- <fieldset formArrayName="options">
207
- <legend>Options</legend>
208
- <ng-container
209
- *ngFor="let option of optionsArray.controls; let i = index"
210
- >
211
- <div [formGroupName]="i">
212
- <div class="form-group">
213
- <label for="basic-radio-config-placeholder">label</label>
214
- <input
215
- class="form-control"
216
- formControlName="label"
217
- id="basic-radio-config-placeholder"
218
- type="text"
219
- />
220
- </div>
221
- <div class="form-group">
222
- <label for="basic-radio-config-disabled">disabled</label>
223
- <select
224
- class="form-control"
225
- formControlName="disabled"
226
- id="basic-radio-config-disabled"
227
- >
228
- <option
229
- [ngValue]="null"
230
- disabled
231
- >Select Disability</option
232
- >
233
- <option
234
- *ngFor="let disabled of [true, false]"
235
- [ngValue]="disabled"
236
- >
237
- {{ disabled }}
238
- </option>
239
- </select>
240
- </div>
241
- <div class="form-group">
242
- <label for="basic-radio-config-description">description</label>
243
- <input
244
- class="form-control"
245
- formControlName="description"
246
- id="basic-radio-config-description"
247
- type="text"
248
- />
249
- </div>
250
- </div>
251
- <div class="form-array-actions">
252
- <button (click)="removeOption(i)">Remove</button>
253
- <button (click)="addOption()">Add</button>
254
- </div>
255
- </ng-container>
256
- </fieldset>
257
- <fieldset formGroupName="properties">
258
- <legend>Miscellaneous</legend>
259
- <div class="form-group">
260
- <label for="basic-radio-config-orientation">Orientation</label>
261
- <select
262
- class="form-control"
263
- formControlName="orientation"
264
- id="basic-radio-config-orientation"
254
+ <fieldset>
255
+ <legend class="form-group-title">Options</legend>
256
+ <div formArrayName="options">
257
+ <ng-container
258
+ *ngFor="let option of optionsArray.controls; let i = index"
265
259
  >
266
- <option
267
- [ngValue]="null"
268
- disabled
269
- >Select Orientation</option
270
- >
271
- <option
272
- *ngFor="let orientation of ['horizontal', 'vertical']"
273
- [ngValue]="orientation"
274
- >
275
- {{ orientation }}
276
- </option>
277
- </select>
260
+ <div [formGroupName]="i">
261
+ <div class="form-group">
262
+ <kwikui-input
263
+ [label]="'Label'"
264
+ [id]="'basic-radio-config-placeholder'"
265
+ [type]="'text'"
266
+ [formControlName]="'label'"
267
+ [formControl]="
268
+ basicRadioFormGroup['controls'].options['controls'][i][
269
+ 'controls'
270
+ ].label
271
+ "
272
+ [disabled]="false"
273
+ [placeholder]="'Please enter your label'"
274
+ [focus]="false"
275
+ [invalid]="false"
276
+ [case]="'default'"
277
+ size="m"
278
+ ></kwikui-input>
279
+ </div>
280
+ <div class="form-group">
281
+ <kwikui-select-combobox
282
+ [options]="[true, false]"
283
+ [label]="'disabled'"
284
+ [id]="'basic-radio-config-disabled'"
285
+ size="m"
286
+ [formControlName]="'disabled'"
287
+ [formControl]="
288
+ basicRadioFormGroup['controls'].options['controls'][i][
289
+ 'controls'
290
+ ].disabled
291
+ "
292
+ [focus]="false"
293
+ [disabled]="false"
294
+ [invalid]="false"
295
+ [placeholder]="'Please select either true or false'"
296
+ ></kwikui-select-combobox>
297
+ </div>
298
+ <div class="form-group">
299
+ <kwikui-input
300
+ [label]="'Description'"
301
+ [id]="'basic-radio-config-description'"
302
+ [type]="'text'"
303
+ [formControlName]="'description'"
304
+ [formControl]="
305
+ basicRadioFormGroup['controls'].options['controls'][i][
306
+ 'controls'
307
+ ].description
308
+ "
309
+ [disabled]="false"
310
+ [placeholder]="'Please enter your description'"
311
+ [focus]="false"
312
+ [invalid]="false"
313
+ [case]="'default'"
314
+ size="m"
315
+ ></kwikui-input>
316
+ </div>
317
+ <div class="form-array-actions">
318
+ <kwikui-button
319
+ [disabled]="false"
320
+ label="Remove"
321
+ [showLoader]="false"
322
+ styles=""
323
+ class="save-button"
324
+ type="button"
325
+ appearance="secondary"
326
+ icon=""
327
+ iconRight=""
328
+ [shape]="'rounded'"
329
+ size="s"
330
+ (onClick)="removeOption(i)"
331
+ ></kwikui-button>
332
+ <kwikui-button
333
+ [disabled]="false"
334
+ label="Add"
335
+ [showLoader]="false"
336
+ styles=""
337
+ class="save-button"
338
+ type="button"
339
+ appearance="secondary"
340
+ icon=""
341
+ iconRight=""
342
+ [shape]="'rounded'"
343
+ size="s"
344
+ (onClick)="addOption()"
345
+ ></kwikui-button>
346
+ </div>
347
+ </div>
348
+ </ng-container>
278
349
  </div>
279
350
  </fieldset>
351
+
352
+ <div formGroupName="properties">
353
+ <fieldset>
354
+ <legend class="form-group-title">Miscellaneous</legend>
355
+ <div class="form-group">
356
+ <kwikui-select-combobox
357
+ [options]="['horizontal', 'vertical']"
358
+ [label]="'Orientation'"
359
+ [id]="'basic-radio-config-orientation'"
360
+ size="m"
361
+ [formControlName]="'orientation'"
362
+ [formControl]="
363
+ basicRadioFormGroup['controls'].properties['controls']
364
+ .orientation
365
+ "
366
+ [focus]="false"
367
+ [disabled]="false"
368
+ [invalid]="false"
369
+ [placeholder]="'Please select orientation'"
370
+ ></kwikui-select-combobox>
371
+ </div>
372
+ </fieldset>
373
+ </div>
280
374
  </form>
281
375
  `,
282
376
  styles: [
@@ -299,4 +393,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
299
393
  }], updateElement: [{
300
394
  type: Output
301
395
  }], ngOnInit: [], ngOnChanges: [], createBasicRadioFormGroup: [], handleOnSave: [], createOptionConfigFormGroup: [], addOption: [], removeOption: [] } });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tY29uZmlnLmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2VsZW1lbnQtY29uZmlnLWVkaXRvci9lZGl0b3JzL2Jhc2ljL3JhZGlvLWNvbmZpZy5lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQStGL0QsTUFBTSxPQUFPLHNCQUFzQjtJQXVCakM7UUF0QlMsZUFBVSxHQUFHO1lBQ3BCLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLEtBQUs7WUFDZixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO1FBR0YsMEJBQXFCLEdBQVcsQ0FBQyxDQUFDO1FBR2xDLGtCQUFhLEdBQVE7WUFDbkIsVUFBVSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxZQUFZO2FBQzFCO1lBQ0QsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBR0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXhDLHdCQUFtQixHQUFjLFNBQVMsQ0FBQztJQUU1QixDQUFDO0lBR2hCLFFBQVE7UUFDTixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBR0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDbkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJ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QUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFjLENBQUM7UUFDckUsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsbUJBQW1CO1NBQ3BCO0lBQ0gsQ0FBQzs7dUlBM0hVLHNCQUFzQjsySEFBdEIsc0JBQXNCLCtOQTNGdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkVUO0FBd0NEO0lBREMsU0FBUztzREFHVDtBQUdEO0lBREMsU0FBUzt5REFxQlQ7QUFHRDtJQURDLFNBQVM7dUVBd0JUO0FBR0Q7SUFEQyxTQUFTOzBEQU9UO0FBT0Q7SUFEQyxTQUFTO3lFQWNUO0FBR0Q7SUFEQyxTQUFTO3VEQUlUO0FBR0Q7SUFEQyxTQUFTOzBEQVNUOzRGQTNIVSxzQkFBc0I7a0JBN0ZsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2RVQ7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOOzs7Ozs7Ozs7S0FTQztxQkFDRjtpQkFDRjswRUFTQyxxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixLQUFLO2dCQVNOLGFBQWE7c0JBRFosTUFBTTtnQkFRUCxRQUFRLE1BS1IsV0FBVyxNQXVCWCx5QkFBeUIsTUEwQnpCLFlBQVksTUFhWiwyQkFBMkIsTUFnQjNCLFNBQVMsTUFNVCxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBsb2dNZXRob2QsIHNldE1pc3NpbmdLZXlWYWx1ZSB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYmFzaWMtcmFkaW8tY29uZmlnLWVkaXRvclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYmFzaWNSYWRpb0Zvcm1Hcm91cFwiPlxuICAgICAgPGZpZWxkc2V0IGZvcm1BcnJheU5hbWU9XCJvcHRpb25zXCI+XG4gICAgICAgIDxsZWdlbmQ+T3B0aW9uczwvbGVnZW5kPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWMtcmFkaW8tY29uZmlnLXBsYWNlaG9sZGVyXCI+bGFiZWw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgIGlkPVwiYmFzaWMtcmFkaW8tY29uZmlnLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpYy1yYWRpby1jb25maWctZGlzYWJsZWRcIj5kaXNhYmxlZDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIGlkPVwiYmFzaWMtcmFkaW8tY29uZmlnLWRpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgID5TZWxlY3QgRGlzYWJpbGl0eTwvb3B0aW9uXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkaXNhYmxlZCBvZiBbdHJ1ZSwgZmFsc2VdXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBkaXNhYmxlZCB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImJhc2ljLXJhZGlvLWNvbmZpZy1kZXNjcmlwdGlvblwiPmRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBpZD1cImJhc2ljLXJhZGlvLWNvbmZpZy1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tYXJyYXktYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlT3B0aW9uKGkpXCI+UmVtb3ZlPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRPcHRpb24oKVwiPkFkZDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8ZmllbGRzZXQgZm9ybUdyb3VwTmFtZT1cInByb3BlcnRpZXNcIj5cbiAgICAgICAgPGxlZ2VuZD5NaXNjZWxsYW5lb3VzPC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImJhc2ljLXJhZGlvLWNvbmZpZy1vcmllbnRhdGlvblwiPk9yaWVudGF0aW9uPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmllbnRhdGlvblwiXG4gICAgICAgICAgICBpZD1cImJhc2ljLXJhZGlvLWNvbmZpZy1vcmllbnRhdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJudWxsXCJcbiAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgPlNlbGVjdCBPcmllbnRhdGlvbjwvb3B0aW9uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcmllbnRhdGlvbiBvZiBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXVwiXG4gICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cIm9yaWVudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgb3JpZW50YXRpb24gfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgPC9mb3JtPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZm9ybS1hcnJheS1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxcmVtO1xuICAgICAgfVxuICAgIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBCYXNpY1JhZGlvQ29uZmlnRWRpdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmVhZG9ubHkgb3B0aW9uVHlwZSA9IHtcbiAgICBsYWJlbDogXCJcIixcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfTtcblxuICBASW5wdXQoKVxuICBzYXZlQmFzaWNDbGlja0NvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KClcbiAgZWxlbWVudENvbmZpZzogYW55ID0ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIlxuICAgIH0sXG4gICAgb3B0aW9uczogW11cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljUmFkaW9Gb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZWxlbWVudENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5lbGVtZW50Q29uZmlnID0gY2hhbmdlcy5lbGVtZW50Q29uZmlnLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgdGhpcy5jcmVhdGVCYXNpY1JhZGlvRm9ybUdyb3VwKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJzYXZlQmFzaWNDbGlja0NvdW50ZXJcIikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIucHJldmlvdXNWYWx1ZSAhPT1cbiAgICAgICAgY2hhbmdlcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIuY3VycmVudFZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zYXZlQmFzaWNDbGlja0NvdW50ZXIgPSBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVPblNhdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbnNGb3JtQXJyYXkgPSBbXTtcblxuICAgIHRoaXMuZWxlbWVudENvbmZpZyA9IHNldE1pc3NpbmdLZXlWYWx1ZSh0aGlzLmVsZW1lbnRDb25maWcsIFwib3B0aW9uc1wiLCBbXG4gICAgICB0aGlzLm9wdGlvblR5cGVcbiAgICBdKTtcblxuICAgIGZvciAobGV0IG9wdGlvbiBvZiB0aGlzLmVsZW1lbnRDb25maWcub3B0aW9ucykge1xuICAgICAgb3B0aW9uc0Zvcm1BcnJheS5wdXNoKHRoaXMuY3JlYXRlT3B0aW9uQ29uZmlnRm9ybUdyb3VwKG9wdGlvbikpO1xuICAgIH1cblxuICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgcHJvcGVydGllczogbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5lbGVtZW50Q29uZmlnLnByb3BlcnRpZXMub3JpZW50YXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXBkYXRlT246IFwiY2hhbmdlXCJcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0pLFxuICAgICAgb3B0aW9uczogbmV3IEZvcm1BcnJheShvcHRpb25zRm9ybUFycmF5KVxuICAgIH0pO1xuICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uU2F2ZSgpIHtcbiAgICBsZXQgYmFzaWNFbGVtZW50Q29uZmlnID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQuZW1pdCh7XG4gICAgICBiYXNpY0VsZW1lbnRDb25maWc6IGJhc2ljRWxlbWVudENvbmZpZ1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnNBcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmJhc2ljUmFkaW9Gb3JtR3JvdXAuZ2V0KFwib3B0aW9uc1wiKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNyZWF0ZU9wdGlvbkNvbmZpZ0Zvcm1Hcm91cChvcHRpb25Db25maWc6IGFueSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3Qgb3B0aW9uRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBsYWJlbDogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5sYWJlbCwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSksXG4gICAgICBkaXNhYmxlZDogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5kaXNhYmxlZCwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSksXG4gICAgICBkZXNjcmlwdGlvbjogbmV3IEZvcm1Db250cm9sKG9wdGlvbkNvbmZpZy5kZXNjcmlwdGlvbiwge1xuICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gb3B0aW9uRm9ybUdyb3VwO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhZGRPcHRpb24oKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgICBvcHRpb25zLnB1c2godGhpcy5jcmVhdGVPcHRpb25Db25maWdGb3JtR3JvdXAodGhpcy5vcHRpb25UeXBlKSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHJlbW92ZU9wdGlvbihvcHRpb25JbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICBvcHRpb25zLnJlbW92ZUF0KG9wdGlvbkluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRPcHRpb24oKTtcbiAgICAgIC8vIG9wdGlvbnMucmVzZXQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tY29uZmlnLmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2VsZW1lbnQtY29uZmlnLWVkaXRvci9lZGl0b3JzL2Jhc2ljL3JhZGlvLWNvbmZpZy5lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUE2SS9ELE1BQU0sT0FBTyxzQkFBc0I7SUF1QmpDO1FBdEJTLGVBQVUsR0FBRztZQUNwQixLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxLQUFLO1lBQ2YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUdGLDBCQUFxQixHQUFXLENBQUMsQ0FBQztRQUdsQyxrQkFBYSxHQUFRO1lBQ25CLFVBQVUsRUFBRTtnQkFDVixXQUFXLEVBQUUsWUFBWTthQUMxQjtZQUNELE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUdGLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV4Qyx3QkFBbUIsR0FBYyxTQUFTLENBQUM7SUFFNUIsQ0FBQztJQUdoQixRQUFRO1FBQ04sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUdELFdBQVcsQ0FBQyxPQUFzQjs7UUFDaEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUNuQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFD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eUJBQXlCLE1BMEJ6QixZQUFZLE1BYVosMkJBQTJCLE1BZ0IzQixTQUFTLE1BTVQsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgbG9nTWV0aG9kLCBzZXRNaXNzaW5nS2V5VmFsdWUgfSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImJhc2ljLXJhZGlvLWNvbmZpZy1lZGl0b3JcIixcbiAgdGVtcGxhdGU6IGBcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImJhc2ljUmFkaW9Gb3JtR3JvdXBcIj5cbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZCBjbGFzcz1cImZvcm0tZ3JvdXAtdGl0bGVcIj5PcHRpb25zPC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cIm9wdGlvbnNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1pbnB1dFxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidMYWJlbCdcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidiYXNpYy1yYWRpby1jb25maWctcGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidsYWJlbCdcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIlxuICAgICAgICAgICAgICAgICAgICBiYXNpY1JhZGlvRm9ybUdyb3VwWydjb250cm9scyddLm9wdGlvbnNbJ2NvbnRyb2xzJ11baV1bXG4gICAgICAgICAgICAgICAgICAgICAgJ2NvbnRyb2xzJ1xuICAgICAgICAgICAgICAgICAgICBdLmxhYmVsXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIGVudGVyIHlvdXIgbGFiZWwnXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbY2FzZV09XCInZGVmYXVsdCdcIlxuICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1zZWxlY3QtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt0cnVlLCBmYWxzZV1cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidkaXNhYmxlZCdcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidiYXNpYy1yYWRpby1jb25maWctZGlzYWJsZWQnXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2Rpc2FibGVkJ1wiXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiXG4gICAgICAgICAgICAgICAgICAgIGJhc2ljUmFkaW9Gb3JtR3JvdXBbJ2NvbnRyb2xzJ10ub3B0aW9uc1snY29udHJvbHMnXVtpXVtcbiAgICAgICAgICAgICAgICAgICAgICAnY29udHJvbHMnXG4gICAgICAgICAgICAgICAgICAgIF0uZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIHNlbGVjdCBlaXRoZXIgdHJ1ZSBvciBmYWxzZSdcIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1zZWxlY3QtY29tYm9ib3g+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxrd2lrdWktaW5wdXRcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInRGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCInYmFzaWMtcmFkaW8tY29uZmlnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJcbiAgICAgICAgICAgICAgICAgICAgYmFzaWNSYWRpb0Zvcm1Hcm91cFsnY29udHJvbHMnXS5vcHRpb25zWydjb250cm9scyddW2ldW1xuICAgICAgICAgICAgICAgICAgICAgICdjb250cm9scydcbiAgICAgICAgICAgICAgICAgICAgXS5kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1BsZWFzZSBlbnRlciB5b3VyIGRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2Nhc2VdPVwiJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hcnJheS1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZXM9XCJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cIlwiXG4gICAgICAgICAgICAgICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgW3NoYXBlXT1cIidyb3VuZGVkJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJyZW1vdmVPcHRpb24oaSlcIlxuICAgICAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkFkZFwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZXM9XCJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cIlwiXG4gICAgICAgICAgICAgICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgW3NoYXBlXT1cIidyb3VuZGVkJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRPcHRpb24oKVwiXG4gICAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwiZm9ybS1ncm91cC10aXRsZVwiPk1pc2NlbGxhbmVvdXM8L2xlZ2VuZD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGt3aWt1aS1zZWxlY3QtY29tYm9ib3hcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ11cIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCInYmFzaWMtcmFkaW8tY29uZmlnLW9yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInb3JpZW50YXRpb24nXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIlxuICAgICAgICAgICAgICAgIGJhc2ljUmFkaW9Gb3JtR3JvdXBbJ2NvbnRyb2xzJ10ucHJvcGVydGllc1snY29udHJvbHMnXVxuICAgICAgICAgICAgICAgICAgLm9yaWVudGF0aW9uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidQbGVhc2Ugc2VsZWN0IG9yaWVudGF0aW9uJ1wiXG4gICAgICAgICAgICA+PC9rd2lrdWktc2VsZWN0LWNvbWJvYm94PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZm9ybS1hcnJheS1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxcmVtO1xuICAgICAgfVxuICAgIGBcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBCYXNpY1JhZGlvQ29uZmlnRWRpdG9yIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmVhZG9ubHkgb3B0aW9uVHlwZSA9IHtcbiAgICBsYWJlbDogXCJcIixcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfTtcblxuICBASW5wdXQoKVxuICBzYXZlQmFzaWNDbGlja0NvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KClcbiAgZWxlbWVudENvbmZpZzogYW55ID0ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIlxuICAgIH0sXG4gICAgb3B0aW9uczogW11cbiAgfTtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGJhc2ljUmFkaW9Gb3JtR3JvdXA6IEZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZUJhc2ljUmFkaW9Gb3JtR3JvdXAoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZWxlbWVudENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5lbGVtZW50Q29uZmlnID0gY2hhbmdlcy5lbGVtZW50Q29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cD8ucmVzZXQodGhpcy5lbGVtZW50Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcInNhdmVCYXNpY0NsaWNrQ291bnRlclwiKSkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5wcmV2aW91c1ZhbHVlICE9PVxuICAgICAgICBjaGFuZ2VzLnNhdmVCYXNpY0NsaWNrQ291bnRlci5jdXJyZW50VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNhdmVCYXNpY0NsaWNrQ291bnRlciA9IGNoYW5nZXMuc2F2ZUJhc2ljQ2xpY2tDb3VudGVyLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICB0aGlzLmhhbmRsZU9uU2F2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgY3JlYXRlQmFzaWNSYWRpb0Zvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICBsZXQgb3B0aW9uc0Zvcm1BcnJheSA9IFtdO1xuXG4gICAgdGhpcy5lbGVtZW50Q29uZmlnID0gc2V0TWlzc2luZ0tleVZhbHVlKHRoaXMuZWxlbWVudENvbmZpZywgXCJvcHRpb25zXCIsIFtcbiAgICAgIHRoaXMub3B0aW9uVHlwZVxuICAgIF0pO1xuXG4gICAgZm9yIChsZXQgb3B0aW9uIG9mIHRoaXMuZWxlbWVudENvbmZpZy5vcHRpb25zKSB7XG4gICAgICBvcHRpb25zRm9ybUFycmF5LnB1c2godGhpcy5jcmVhdGVPcHRpb25Db25maWdGb3JtR3JvdXAob3B0aW9uKSk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBwcm9wZXJ0aWVzOiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgb3JpZW50YXRpb246IG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnRDb25maWcucHJvcGVydGllcy5vcmllbnRhdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cGRhdGVPbjogXCJjaGFuZ2VcIlxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfSksXG4gICAgICBvcHRpb25zOiBuZXcgRm9ybUFycmF5KG9wdGlvbnNGb3JtQXJyYXkpXG4gICAgfSk7XG4gICAgdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25TYXZlKCkge1xuICAgIGxldCBiYXNpY0VsZW1lbnRDb25maWcgPSB0aGlzLmJhc2ljUmFkaW9Gb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcblxuICAgIHRoaXMudXBkYXRlRWxlbWVudC5lbWl0KHtcbiAgICAgIGJhc2ljRWxlbWVudENvbmZpZzogYmFzaWNFbGVtZW50Q29uZmlnXG4gICAgfSk7XG4gIH1cblxuICBnZXQgb3B0aW9uc0FycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzaWNSYWRpb0Zvcm1Hcm91cC5nZXQoXCJvcHRpb25zXCIpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgY3JlYXRlT3B0aW9uQ29uZmlnRm9ybUdyb3VwKG9wdGlvbkNvbmZpZzogYW55KTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBvcHRpb25Gb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGxhYmVsOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmxhYmVsLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KSxcbiAgICAgIGRpc2FibGVkOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmRpc2FibGVkLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KSxcbiAgICAgIGRlc2NyaXB0aW9uOiBuZXcgRm9ybUNvbnRyb2wob3B0aW9uQ29uZmlnLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIHVwZGF0ZU9uOiBcImNoYW5nZVwiXG4gICAgICB9KVxuICAgIH0pO1xuICAgIHJldHVybiBvcHRpb25Gb3JtR3JvdXA7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFkZE9wdGlvbigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldChcIm9wdGlvbnNcIikgYXMgRm9ybUFycmF5O1xuICAgIG9wdGlvbnMucHVzaCh0aGlzLmNyZWF0ZU9wdGlvbkNvbmZpZ0Zvcm1Hcm91cCh0aGlzLm9wdGlvblR5cGUpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbkluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5iYXNpY1JhZGlvRm9ybUdyb3VwLmdldChcIm9wdGlvbnNcIikgYXMgRm9ybUFycmF5O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgIG9wdGlvbnMucmVtb3ZlQXQob3B0aW9uSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE9wdGlvbigpO1xuICAgICAgLy8gb3B0aW9ucy5yZXNldCgpO1xuICAgIH1cbiAgfVxufVxuIl19