@stemy/ngx-dynamic-form 10.1.3 → 10.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-dynamic-form.umd.js +2247 -2247
  3. package/bundles/stemy-ngx-dynamic-form.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-dynamic-form.umd.min.js +2 -2
  5. package/bundles/stemy-ngx-dynamic-form.umd.min.js.map +1 -1
  6. package/esm2015/ngx-dynamic-form/common-types.js +591 -591
  7. package/esm2015/ngx-dynamic-form/components/base/dynamic-form-base.component.js +87 -87
  8. package/esm2015/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.js +91 -91
  9. package/esm2015/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.js +112 -112
  10. package/esm2015/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.js +19 -19
  11. package/esm2015/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.js +73 -73
  12. package/esm2015/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.js +23 -23
  13. package/esm2015/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.js +73 -73
  14. package/esm2015/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.js +20 -20
  15. package/esm2015/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.js +134 -134
  16. package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +89 -89
  17. package/esm2015/ngx-dynamic-form/directives/dynamic-form-control.directive.js +32 -32
  18. package/esm2015/ngx-dynamic-form/directives/dynamic-form-group.directive.js +40 -40
  19. package/esm2015/ngx-dynamic-form/directives/dynamic-form-template.directive.js +38 -38
  20. package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +85 -85
  21. package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +48 -48
  22. package/esm2015/ngx-dynamic-form/services/form-utilities.js +108 -108
  23. package/esm2015/ngx-dynamic-form/services/open-api.service.js +130 -130
  24. package/esm2015/public_api.js +18 -18
  25. package/esm2015/stemy-ngx-dynamic-form.js +8 -8
  26. package/fesm2015/stemy-ngx-dynamic-form.js +1690 -1690
  27. package/fesm2015/stemy-ngx-dynamic-form.js.map +1 -1
  28. package/ngx-dynamic-form/common-types.d.ts +307 -307
  29. package/ngx-dynamic-form/components/base/dynamic-form-base.component.d.ts +44 -44
  30. package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +21 -21
  31. package/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.d.ts +16 -16
  32. package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +6 -6
  33. package/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.d.ts +13 -13
  34. package/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.d.ts +6 -6
  35. package/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.d.ts +9 -9
  36. package/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.d.ts +5 -5
  37. package/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.d.ts +26 -26
  38. package/ngx-dynamic-form/directives/async-submit.directive.d.ts +23 -23
  39. package/ngx-dynamic-form/directives/dynamic-form-control.directive.d.ts +12 -12
  40. package/ngx-dynamic-form/directives/dynamic-form-group.directive.d.ts +14 -14
  41. package/ngx-dynamic-form/directives/dynamic-form-template.directive.d.ts +16 -16
  42. package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +20 -20
  43. package/ngx-dynamic-form/services/dynamic-form.service.d.ts +12 -12
  44. package/ngx-dynamic-form/services/form-utilities.d.ts +19 -19
  45. package/ngx-dynamic-form/services/open-api.service.d.ts +37 -37
  46. package/package.json +11 -11
  47. package/public_api.d.ts +17 -17
  48. package/stemy-ngx-dynamic-form.d.ts +7 -7
  49. package/stemy-ngx-dynamic-form.metadata.json +1 -1
@@ -1,591 +1,591 @@
1
- import { HostBinding, InjectionToken, Directive } from "@angular/core";
2
- import { FormControl, FormGroup } from "@angular/forms";
3
- import { ObjectUtils, ReflectUtils, TimerUtils, UniqueUtils } from "@stemy/ngx-utils";
4
- export const FORM_GROUP_TYPE = new InjectionToken("form-group-provider");
5
- export const FORM_CONTROL_PROVIDER = new InjectionToken("form-control-provider");
6
- export class FormControlComponent {
7
- get form() {
8
- return !this.control ? null : this.control.form;
9
- }
10
- get data() {
11
- return (!this.control ? {} : this.control.data);
12
- }
13
- get value() {
14
- return !this.control ? null : this.control.value;
15
- }
16
- get meta() {
17
- return !this.control ? null : this.control.meta;
18
- }
19
- get inputClass() {
20
- return true;
21
- }
22
- }
23
- FormControlComponent.decorators = [
24
- { type: Directive }
25
- ];
26
- FormControlComponent.propDecorators = {
27
- inputClass: [{ type: HostBinding, args: ["class.form-input",] }]
28
- };
29
- function createValidator(control) {
30
- const data = control.data || {};
31
- const validators = [data.validator].concat(data.validators || []).filter(ObjectUtils.isDefined).map(v => {
32
- return ReflectUtils.resolve(v, control.injector);
33
- });
34
- return (ctrl) => new Promise((resolve) => {
35
- const control = ctrl;
36
- control.shouldValidate().then(should => {
37
- if (!should) {
38
- resolve(null);
39
- return;
40
- }
41
- const validate = validators.map(v => v(control));
42
- const metaValidator = control.meta.validator;
43
- if (ObjectUtils.isFunction(metaValidator)) {
44
- validate.push(metaValidator(control));
45
- }
46
- Promise.all(validate).then(results => {
47
- results = results.filter(error => ObjectUtils.isObject(error) || ObjectUtils.isString(error));
48
- let result = null;
49
- if (results.length > 0) {
50
- result = {};
51
- results.forEach(error => {
52
- if (ObjectUtils.isString(error)) {
53
- result[error] = {};
54
- return;
55
- }
56
- result = Object.assign(result, error);
57
- });
58
- }
59
- resolve(result);
60
- });
61
- });
62
- });
63
- }
64
- class DynamicFormControlHelper {
65
- constructor(form, control = null) {
66
- this.form = form;
67
- this.control = control;
68
- this.formId = UniqueUtils.uuid();
69
- this.meta = {};
70
- this.hidden = false;
71
- this.dummyData = {};
72
- this.readonlyTester = this.createTester("readonly");
73
- this.hideTester = this.createTester("hidden");
74
- this.serializeTester = this.createTester("shouldSerialize", (control) => {
75
- return Promise.resolve(control.visible);
76
- });
77
- this.validateTester = this.createTester("shouldValidate", (control) => {
78
- return Promise.resolve(control.visible);
79
- });
80
- }
81
- get id() {
82
- return !this.control ? null : this.control.id;
83
- }
84
- get type() {
85
- return !this.control ? "" : this.control.type;
86
- }
87
- get data() {
88
- return !this.control ? this.dummyData : this.control.data || this.dummyData;
89
- }
90
- get visible() {
91
- return !this.hidden;
92
- }
93
- get provider() {
94
- return this.ctrlProvider;
95
- }
96
- load(control) {
97
- return !this.ctrlProvider ? Promise.resolve() : this.ctrlProvider.loader(control);
98
- }
99
- check(control) {
100
- return new Promise(resolve => {
101
- this.hideTester(control).then(hide => {
102
- this.hidden = hide;
103
- this.readonlyTester(control).then(readonly => {
104
- resolve(control.form.readonly || readonly);
105
- });
106
- });
107
- });
108
- }
109
- shouldSerialize(control) {
110
- return this.serializeTester(control);
111
- }
112
- shouldValidate(control) {
113
- return this.validateTester(control);
114
- }
115
- findProvider(control) {
116
- this.ctrlProvider = !this.control || !this.control.type ? null : this.form.findProvider(control);
117
- }
118
- createTester(test, defaultFunc = null) {
119
- const tester = this.data[test]
120
- ? ReflectUtils.resolve(this.data[test], this.form.injector)
121
- : (defaultFunc || (() => Promise.resolve(false)));
122
- return (control) => tester(control);
123
- }
124
- }
125
- export class DynamicFormGroup extends FormGroup {
126
- constructor(form, control = null) {
127
- super({}, { updateOn: ((!control || !control.data) ? null : control.data.updateOn) || form.updateOn || "blur" });
128
- this.form = form;
129
- this.mName = "";
130
- this.mModel = {};
131
- this.mControls = [];
132
- this.mSerializers = [];
133
- this.mFieldSets = {};
134
- this.helper = new DynamicFormControlHelper(form, control);
135
- this.helper.findProvider(this);
136
- this.initialized = false;
137
- this.loading = false;
138
- this.changeTimer = TimerUtils.createTimeout();
139
- this.statusChanges.subscribe(() => {
140
- const root = this.form.root;
141
- root.onStatusChange.emit(root);
142
- });
143
- this.setAsyncValidators(createValidator(this));
144
- }
145
- get id() {
146
- return this.helper.id;
147
- }
148
- get type() {
149
- return this.helper.type;
150
- }
151
- get data() {
152
- return this.helper.data;
153
- }
154
- get visible() {
155
- return this.helper.visible;
156
- }
157
- get meta() {
158
- return this.helper.meta;
159
- }
160
- get injector() {
161
- return this.form.injector;
162
- }
163
- get label() {
164
- return this.data.label !== "" ? `${this.prefix}${this.data.label}` : "";
165
- }
166
- get provider() {
167
- return this.helper.provider;
168
- }
169
- get model() {
170
- return this.mModel;
171
- }
172
- get formId() {
173
- return this.helper.formId;
174
- }
175
- get formControls() {
176
- return this.mControls || [];
177
- }
178
- get formFields() {
179
- return this.mFieldSets || {};
180
- }
181
- get prefix() {
182
- return !this.name ? "" : `${this.name}.`;
183
- }
184
- get name() {
185
- return this.mName;
186
- }
187
- get state() {
188
- return (this.loading ? "LOADING" : this.status);
189
- }
190
- static createFormControls(group, controls) {
191
- if (!controls && ObjectUtils.isObject(group.model)) {
192
- const props = Object.keys(group.model);
193
- controls = props.map(id => {
194
- return getFormControl(group.model, id);
195
- }).filter(ObjectUtils.isDefined);
196
- }
197
- if (!controls)
198
- return [];
199
- return controls.map(ctrl => {
200
- if (ctrl.type == "model") {
201
- const subGroup = new DynamicFormGroup(group.form, ctrl);
202
- const model = group.model[ctrl.id] || {};
203
- const data = subGroup.getData();
204
- data.name = data.name || group.name;
205
- subGroup.setup(model, data);
206
- group.model[ctrl.id] = model;
207
- group.addControl(subGroup.id, subGroup);
208
- return subGroup;
209
- }
210
- return new DynamicFormControl(ctrl, group);
211
- });
212
- }
213
- static createFormSerializers(group, serializers) {
214
- if (!serializers && ObjectUtils.isObject(group.model)) {
215
- const props = Object.keys(group.model);
216
- serializers = props.reduce((result, id) => {
217
- const serializer = getFormSerializer(group.model, id);
218
- if (!serializer)
219
- return result;
220
- result[id] = serializer;
221
- return result;
222
- }, {});
223
- }
224
- if (!serializers)
225
- return [];
226
- return Object.keys(serializers).map(id => {
227
- const serializer = serializers[id] || defaultSerializer;
228
- return !serializer ? null : {
229
- id: id,
230
- func: ReflectUtils.resolve(serializer, group.injector)
231
- };
232
- });
233
- }
234
- getData() {
235
- return this.data;
236
- }
237
- getControl(id) {
238
- return this.get(id);
239
- }
240
- load() {
241
- const promises = this.mControls.map(c => c.load());
242
- promises.push(this.helper.load(this));
243
- return Promise.all(promises);
244
- }
245
- check() {
246
- return new Promise(resolve => {
247
- this.helper.check(this).then(readonly => {
248
- if (readonly)
249
- this.disable({ emitEvent: false });
250
- else
251
- this.enable({ emitEvent: false });
252
- const promises = this.mControls.map(c => c.check());
253
- Promise.all(promises).then(resolve);
254
- });
255
- });
256
- }
257
- shouldSerialize() {
258
- return this.helper.shouldSerialize(this);
259
- }
260
- shouldValidate() {
261
- return this.helper.shouldValidate(this);
262
- }
263
- serialize() {
264
- return new Promise((resolve) => {
265
- const result = {};
266
- const serializers = this.mSerializers.map(s => {
267
- return new Promise(resolve => {
268
- s.func(s.id, this).then(res => {
269
- const ctrl = this.getControl(s.id);
270
- const promise = !ctrl ? Promise.resolve(true) : ctrl.shouldSerialize();
271
- promise.then(should => {
272
- if (should)
273
- result[s.id] = res;
274
- resolve();
275
- });
276
- });
277
- });
278
- });
279
- Promise.all(serializers).then(() => resolve(result));
280
- });
281
- }
282
- onFocus() {
283
- this.markAsUntouched({ onlySelf: true });
284
- }
285
- onBlur() {
286
- this.markAsTouched({ onlySelf: true });
287
- }
288
- showErrors() {
289
- this.markAsTouched({ onlySelf: true });
290
- this.mControls.forEach(ctrl => ctrl.showErrors());
291
- }
292
- reloadControls() {
293
- let callback = () => { };
294
- if (this.initialized === false) {
295
- this.initialized = true;
296
- this.loading = true;
297
- callback = () => {
298
- this.loading = false;
299
- // this.cdr.detectChanges();
300
- const root = this.form.root;
301
- root.onInit.emit(root);
302
- root.onStatusChange.emit(root);
303
- // https://github.com/angular/angular/issues/14542
304
- const statusTimer = TimerUtils.createInterval();
305
- statusTimer.set(() => {
306
- if (this.status == "PENDING")
307
- return;
308
- statusTimer.clear();
309
- root.onStatusChange.emit(root);
310
- }, 50);
311
- setTimeout(statusTimer.clear, 5000);
312
- };
313
- }
314
- const promise = new Promise(resolve => {
315
- this.load().then(() => this.check().then(resolve));
316
- });
317
- promise.then(callback, callback);
318
- return promise;
319
- }
320
- setup(model, info) {
321
- this.mName = info.name || "";
322
- this.mModel = model;
323
- this.mControls.forEach(ctrl => this.removeControl(ctrl.id));
324
- this.mControls = DynamicFormGroup.createFormControls(this, info.controls);
325
- this.mControls.forEach((ctrl) => this.addControl(ctrl.id, ctrl));
326
- this.mSerializers = DynamicFormGroup.createFormSerializers(this, info.serializers);
327
- this.mFieldSets = info.fieldSets ? info.fieldSets.reduce((result, fs) => {
328
- result[fs.id] = fs;
329
- return result;
330
- }, {}) : getFormFieldSets(Object.getPrototypeOf(model).constructor);
331
- }
332
- updateModel(control) {
333
- this.model[control.id] = control.value;
334
- this.changeTimer.clear();
335
- this.changeTimer.set(() => {
336
- this.check().then(() => this.reloadControlsFrom(control, new Set()).then(() => {
337
- this.form.root.onChange.emit(control);
338
- }));
339
- }, 250);
340
- }
341
- reloadControlsFrom(control, controls) {
342
- const data = control.data;
343
- if (!data || !data.reload)
344
- return Promise.resolve();
345
- const reload = ObjectUtils.isArray(data.reload) ? data.reload : [data.reload];
346
- return Promise.all(reload.map(id => {
347
- const nextControl = this.getControl(id);
348
- if (!nextControl || controls.has(nextControl))
349
- return Promise.resolve();
350
- controls.add(nextControl);
351
- return new Promise(resolve => {
352
- nextControl.load().then(() => {
353
- this.reloadControlsFrom(nextControl, controls).then(resolve);
354
- });
355
- });
356
- }));
357
- }
358
- }
359
- export class DynamicFormControl extends FormControl {
360
- constructor(control, group) {
361
- super(group.model[control.id], { updateOn: control.data.updateOn || group.updateOn });
362
- this.control = control;
363
- this.group = group;
364
- this.group.addControl(control.id, this);
365
- this.helper = new DynamicFormControlHelper(this.form, control);
366
- this.helper.findProvider(this);
367
- this.valueChanges.subscribe(() => this.group.updateModel(this));
368
- this.setAsyncValidators(createValidator(this));
369
- }
370
- get id() {
371
- return this.helper.id;
372
- }
373
- get type() {
374
- return this.helper.type;
375
- }
376
- get data() {
377
- return this.helper.data;
378
- }
379
- get visible() {
380
- return this.helper.visible;
381
- }
382
- get meta() {
383
- return this.helper.meta;
384
- }
385
- get form() {
386
- return this.group.form;
387
- }
388
- get injector() {
389
- return this.form.injector;
390
- }
391
- get label() {
392
- return this.data.label !== "" ? `${this.group.prefix}${this.data.label}` : "";
393
- }
394
- get provider() {
395
- return this.helper.provider;
396
- }
397
- get model() {
398
- return this.group.model;
399
- }
400
- get formId() {
401
- return this.helper.formId;
402
- }
403
- getData() {
404
- return this.data;
405
- }
406
- getControl(id) {
407
- return null;
408
- }
409
- load() {
410
- return this.helper.load(this);
411
- }
412
- check() {
413
- const check = this.helper.check(this);
414
- check.then(readonly => {
415
- if (readonly || this.group.disabled)
416
- this.disable({ emitEvent: false });
417
- else
418
- this.enable({ emitEvent: false });
419
- });
420
- return check;
421
- }
422
- shouldSerialize() {
423
- return this.helper.shouldSerialize(this);
424
- }
425
- shouldValidate() {
426
- return this.helper.shouldValidate(this);
427
- }
428
- serialize() {
429
- return Promise.resolve(this.value);
430
- }
431
- onFocus() {
432
- this.markAsUntouched({ onlySelf: true });
433
- }
434
- onBlur() {
435
- this.markAsTouched({ onlySelf: true });
436
- }
437
- showErrors() {
438
- this.markAsTouched({ onlySelf: true });
439
- }
440
- }
441
- // --- Decorator functions ---
442
- const emptyArray = [];
443
- const emptyTester = () => {
444
- return Promise.resolve(false);
445
- };
446
- const ɵ0 = emptyTester;
447
- export function defaultSerializer(id, parent) {
448
- const control = parent.getControl(id);
449
- return !control ? Promise.resolve(parent.model[id]) : control.serialize();
450
- }
451
- export function FormSerializable(serializer) {
452
- return (target, propertyKey) => {
453
- ReflectUtils.defineMetadata("dynamicFormSerializer", serializer || defaultSerializer, target, propertyKey);
454
- };
455
- }
456
- export function FormInput(data) {
457
- return (target, propertyKey) => {
458
- const meta = ReflectUtils.getOwnMetadata("design:type", target, propertyKey);
459
- const type = meta ? meta.name : "";
460
- let inputType = propertyKey.indexOf("password") < 0 ? "text" : "password";
461
- switch (type) {
462
- case "Number":
463
- inputType = "number";
464
- break;
465
- case "Boolean":
466
- inputType = "checkbox";
467
- break;
468
- }
469
- defineFormControl(target, propertyKey, createFormInput(propertyKey, data, inputType));
470
- };
471
- }
472
- export function FormSelect(data) {
473
- return (target, propertyKey) => {
474
- defineFormControl(target, propertyKey, createFormSelect(propertyKey, data));
475
- };
476
- }
477
- export function FormStatic(data) {
478
- return (target, propertyKey) => {
479
- defineFormControl(target, propertyKey, createFormStatic(propertyKey, data));
480
- };
481
- }
482
- export function FormModel(data) {
483
- return (target, propertyKey) => {
484
- defineFormControl(target, propertyKey, createFormModel(propertyKey, data));
485
- };
486
- }
487
- export function FormFile(data) {
488
- return (target, propertyKey) => {
489
- defineFormControl(target, propertyKey, createFormFile(propertyKey, data));
490
- };
491
- }
492
- export function FormFieldSet(data) {
493
- return (target) => {
494
- const sets = getFormFieldSets(target);
495
- data.classes = data.classes || "";
496
- sets[data.id] = data;
497
- ReflectUtils.defineMetadata("dynamicFormFieldSets", sets, target);
498
- };
499
- }
500
- export function provideFormGroup(component) {
501
- return {
502
- provide: FORM_GROUP_TYPE,
503
- useValue: component
504
- };
505
- }
506
- export function provideFormControl(component, acceptor, loader, priority = 0) {
507
- return {
508
- provide: FORM_CONTROL_PROVIDER,
509
- multi: true,
510
- useValue: {
511
- component: component,
512
- priority: priority,
513
- acceptor: acceptor,
514
- loader: loader
515
- }
516
- };
517
- }
518
- export function defineFormControl(target, propertyKey, control) {
519
- ReflectUtils.defineMetadata("dynamicFormControl", control, target, propertyKey);
520
- }
521
- export function getFormFieldSets(target) {
522
- return ReflectUtils.getMetadata("dynamicFormFieldSets", target) || {};
523
- }
524
- export function getFormControl(target, propertyKey) {
525
- return ReflectUtils.getMetadata("dynamicFormControl", target, propertyKey);
526
- }
527
- export function getFormSerializer(target, propertyKey) {
528
- return ReflectUtils.getMetadata("dynamicFormSerializer", target, propertyKey);
529
- }
530
- export function createFormControl(id, type, data) {
531
- data = data || {};
532
- data.label = ObjectUtils.isNullOrUndefined(data.label) ? id : data.label;
533
- data.labelAlign = data.labelAlign || "left";
534
- data.fieldSet = data.fieldSet || UniqueUtils.uuid();
535
- data.classes = data.classes || "";
536
- data.readonly = data.readonly || emptyTester;
537
- data.hidden = data.hidden || emptyTester;
538
- data.validators = data.validators || emptyArray;
539
- return {
540
- id: id,
541
- type: type,
542
- data: data
543
- };
544
- }
545
- export function createFormInput(id, data, type = "text") {
546
- const control = createFormControl(id, "input", data);
547
- data = control.data;
548
- data.type = data.type || type;
549
- data.classes = !data.classes ? `form-group-${data.type}` : `${data.classes} form-group-${data.type}`;
550
- data.placeholder = data.placeholder || (data.type == "mask" ? "_" : "");
551
- data.step = data.step || 1;
552
- data.mask = data.mask || [/\w*/gi];
553
- return control;
554
- }
555
- export function createFormSelect(id, data) {
556
- const control = createFormControl(id, "select", data);
557
- data = control.data;
558
- data.options = data.options || (() => Promise.resolve([]));
559
- data.type = data.type || "select";
560
- const classType = data.type == "select" ? "select" : `select-${data.type}`;
561
- data.classes = !data.classes ? `form-group-${classType}` : `${data.classes} form-group-${classType}`;
562
- return control;
563
- }
564
- export function createFormStatic(id, data) {
565
- const control = createFormControl(id, "static", data);
566
- data = control.data;
567
- data.style = data.style || "table";
568
- return control;
569
- }
570
- export function createFormModel(id, data) {
571
- const control = createFormControl(id, "model", data);
572
- data = control.data;
573
- data.name = data.name || "";
574
- return control;
575
- }
576
- export function createFormFile(id, data) {
577
- const control = createFormControl(id, "file", data);
578
- data = control.data;
579
- data.accept = data.accept || ".jpg,.jpeg,.png";
580
- data.multi = data.multi || false;
581
- data.baseUrl = ObjectUtils.isString(data.baseUrl) ? data.baseUrl : "assets/";
582
- data.uploadUrl = ObjectUtils.isString(data.uploadUrl) ? data.uploadUrl : "assets";
583
- data.createUploadData = data.createUploadData || ((file) => {
584
- const form = new FormData();
585
- form.append("file", file);
586
- return form;
587
- });
588
- return control;
589
- }
590
- export { ɵ0 };
591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3N0ZW1sZXIvV29yay9uZ3gtZHluYW1pYy1mb3JtL3NyYy8iLCJzb3VyY2VzIjpbIm5neC1keW5hbWljLWZvcm0vY29tbW9uLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUMsV0FBVyxFQUFFLGNBQWMsRUFBOEMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BKLE9BQU8sRUFBa0IsV0FBVyxFQUFFLFNBQVMsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBSUgsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUVkLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFnRCxJQUFJLGNBQWMsQ0FBOEIscUJBQXFCLENBQUMsQ0FBQztBQUNuSixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBeUMsSUFBSSxjQUFjLENBQXVCLHVCQUF1QixDQUFDLENBQUM7QUFhN0ksTUFBTSxPQUFnQixvQkFBb0I7SUFJdEMsSUFBSSxJQUFJO1FBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQUksSUFBSTtRQUNKLE9BQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksSUFBSTtR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Q2xGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFO1FBQzdELE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVGVtcGxhdGVSZWYsIFR5cGUsIFZhbHVlUHJvdmlkZXIsIERpcmVjdGl2ZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICAgIElSZXNvbHZlRmFjdG9yeSxcbiAgICBJVGltZXIsXG4gICAgSUFzeW5jTWVzc2FnZSxcbiAgICBPYmplY3RVdGlscyxcbiAgICBSZWZsZWN0VXRpbHMsXG4gICAgVGltZXJVdGlscyxcbiAgICBVbmlxdWVVdGlscyxcbiAgICBJUmVxdWVzdE9wdGlvbnNcbn0gZnJvbSBcIkBzdGVteS9uZ3gtdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IEZPUk1fR1JPVVBfVFlQRTogSW5qZWN0aW9uVG9rZW48VHlwZTxJRm9ybUNvbnRyb2xDb21wb25lbnQ+PiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUeXBlPElGb3JtQ29udHJvbENvbXBvbmVudD4+KFwiZm9ybS1ncm91cC1wcm92aWRlclwiKTtcbmV4cG9ydCBjb25zdCBGT1JNX0NPTlRST0xfUFJPVklERVI6IEluamVjdGlvblRva2VuPElGb3JtQ29udHJvbFByb3ZpZGVyPiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJRm9ybUNvbnRyb2xQcm92aWRlcj4oXCJmb3JtLWNvbnRyb2wtcHJvdmlkZXJcIik7XG5cbi8vIC0tLSBCYXNpYyBmb3JtIGNvbnRyb2wgaW50ZXJmYWNlcyAtLS1cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Db250cm9sQ29tcG9uZW50IHtcbiAgICBjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtR3JvdXBDb21wb25lbnQge1xuICAgIGZvcm06IElEeW5hbWljRm9ybTtcbiAgICBjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sO1xufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtQ29udHJvbENvbXBvbmVudDxUIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YT4gaW1wbGVtZW50cyBJRm9ybUNvbnRyb2xDb21wb25lbnQge1xuXG4gICAgY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbDtcblxuICAgIGdldCBmb3JtKCk6IElEeW5hbWljRm9ybUJhc2Uge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udHJvbCA/IG51bGw6IHRoaXMuY29udHJvbC5mb3JtO1xuICAgIH1cblxuICAgIGdldCBkYXRhKCk6IFQge1xuICAgICAgICByZXR1cm4gPFQ+KCF0aGlzLmNvbnRyb2wgPyB7fSA6IHRoaXMuY29udHJvbC5kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyBudWxsIDogdGhpcy5jb250cm9sLnZhbHVlO1xuICAgIH1cblxuICAgIGdldCBtZXRhKCk6IGFueSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250cm9sID8gbnVsbCA6IHRoaXMuY29udHJvbC5tZXRhO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLmZvcm0taW5wdXRcIilcbiAgICBnZXQgaW5wdXRDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBJRm9ybUNvbnRyb2xQcm92aWRlckFjY2VwdG9yID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBJRm9ybUNvbnRyb2xQcm92aWRlckxvYWRlciA9IChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBJRm9ybUNvbnRyb2xPcHRpb25zID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8SUZvcm1Db250cm9sT3B0aW9uW10+O1xuZXhwb3J0IHR5cGUgSUZvcm1Db250cm9sU2VyaWFsaXplciA9IChpZDogc3RyaW5nLCBwYXJlbnQ6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8YW55PjtcbmV4cG9ydCB0eXBlIElGb3JtSW5wdXRNYXNrID0gc3RyaW5nIHwgUmVnRXhwO1xuZXhwb3J0IHR5cGUgSUZvcm1JbnB1dE1hc2tGdW5jdGlvbiA9IChyYXc6IHN0cmluZykgPT4gSUZvcm1JbnB1dE1hc2tbXTtcbmV4cG9ydCB0eXBlIElGb3JtSW5wdXRVbk1hc2tGdW5jdGlvbiA9ICh2YWx1ZTogc3RyaW5nKSA9PiBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Db250cm9sUHJvdmlkZXIge1xuICAgIGNvbXBvbmVudDogVHlwZTxJRm9ybUNvbnRyb2xDb21wb25lbnQ+O1xuICAgIHByaW9yaXR5OiBudW1iZXI7XG4gICAgYWNjZXB0b3I6IElGb3JtQ29udHJvbFByb3ZpZGVyQWNjZXB0b3I7XG4gICAgbG9hZGVyOiBJRm9ybUNvbnRyb2xQcm92aWRlckxvYWRlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRm9ybVNlcmlhbGl6ZXIge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZnVuYzogSUZvcm1Db250cm9sU2VyaWFsaXplcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRm9ybVNlcmlhbGl6ZXJzIHtcbiAgICBbaWQ6IHN0cmluZ106IElGb3JtQ29udHJvbFNlcmlhbGl6ZXIgfCBJUmVzb2x2ZUZhY3RvcnkgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIER5bmFtaWNGb3JtU3RhdGUgPSBcIlZBTElEXCIgfCBcIklOVkFMSURcIiB8IFwiUEVORElOR1wiIHwgXCJESVNBQkxFRFwiIHwgXCJMT0FESU5HXCI7XG5leHBvcnQgdHlwZSBEeW5hbWljRm9ybVVwZGF0ZU9uID0gXCJjaGFuZ2VcIiB8IFwiYmx1clwiIHwgXCJzdWJtaXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY0Zvcm1Db250cm9sIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBkYXRhOiBJRm9ybUNvbnRyb2xEYXRhO1xuICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgbWV0YTogYW55O1xuICAgIGZvcm06IElEeW5hbWljRm9ybUJhc2U7XG4gICAgaW5qZWN0b3I6IEluamVjdG9yO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgcHJvdmlkZXI6IElGb3JtQ29udHJvbFByb3ZpZGVyO1xuICAgIG1vZGVsOiBhbnk7XG4gICAgZm9ybUlkOiBzdHJpbmc7XG5cbiAgICBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnM7XG4gICAgdmFsdWU6IGFueTtcbiAgICB0b3VjaGVkOiBib29sZWFuO1xuICAgIGRpc2FibGVkOiBib29sZWFuO1xuICAgIHVwZGF0ZU9uOiBEeW5hbWljRm9ybVVwZGF0ZU9uO1xuXG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQ7XG5cbiAgICBnZXREYXRhPFQgZXh0ZW5kcyBJRm9ybUNvbnRyb2xEYXRhPigpOiBUO1xuICAgIGdldENvbnRyb2woaWQ6IHN0cmluZyk6IElEeW5hbWljRm9ybUNvbnRyb2w7XG4gICAgbG9hZCgpOiBQcm9taXNlPGFueT47XG4gICAgY2hlY2soKTogUHJvbWlzZTxhbnk+O1xuICAgIHNob3VsZFNlcmlhbGl6ZSgpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIHNob3VsZFZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgc2VyaWFsaXplKCk6IFByb21pc2U8YW55PjtcbiAgICBvbkZvY3VzKCk6IHZvaWQ7XG4gICAgb25CbHVyKCk6IHZvaWQ7XG4gICAgc2hvd0Vycm9ycygpOiB2b2lkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWYWxpZGF0b3IoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycz4ge1xuICAgIGNvbnN0IGRhdGEgPSBjb250cm9sLmRhdGEgfHwge307XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtkYXRhLnZhbGlkYXRvcl0uY29uY2F0KGRhdGEudmFsaWRhdG9ycyB8fCBbXSkuZmlsdGVyKE9iamVjdFV0aWxzLmlzRGVmaW5lZCkubWFwKHYgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxzLnJlc29sdmU8Rm9ybUNvbnRyb2xWYWxpZGF0b3I+KHYsIGNvbnRyb2wuaW5qZWN0b3IpO1xuICAgIH0pO1xuICAgIHJldHVybiAoY3RybDogYW55KSA9PiBuZXcgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sID0gPElEeW5hbWljRm9ybUNvbnRyb2w+Y3RybDtcbiAgICAgICAgY29udHJvbC5zaG91bGRWYWxpZGF0ZSgpLnRoZW4oc2hvdWxkID0+IHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbGlkYXRvcnMubWFwKHYgPT4gdihjb250cm9sKSk7XG4gICAgICAgICAgICBjb25zdCBtZXRhVmFsaWRhdG9yID0gY29udHJvbC5tZXRhLnZhbGlkYXRvcjtcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKG1ldGFWYWxpZGF0b3IpKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGUucHVzaChtZXRhVmFsaWRhdG9yKGNvbnRyb2wpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHZhbGlkYXRlKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihlcnJvciA9PiBPYmplY3RVdGlscy5pc09iamVjdChlcnJvcikgfHwgT2JqZWN0VXRpbHMuaXNTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRXJyb3JzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzU3RyaW5nKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtlcnJvcl0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKHJlc3VsdCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5jbGFzcyBEeW5hbWljRm9ybUNvbnRyb2xIZWxwZXIge1xuXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250cm9sID8gbnVsbCA6IHRoaXMuY29udHJvbC5pZDtcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udHJvbCA/IFwiXCIgOiB0aGlzLmNvbnRyb2wudHlwZTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBJRm9ybUNvbnRyb2xEYXRhIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyB0aGlzLmR1bW15RGF0YSA6IHRoaXMuY29udHJvbC5kYXRhIHx8IHRoaXMuZHVtbXlEYXRhO1xuICAgIH1cblxuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGlkZGVuO1xuICAgIH1cblxuICAgIGdldCBwcm92aWRlcigpOiBJRm9ybUNvbnRyb2xQcm92aWRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0cmxQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybUlkOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IGFueTtcblxuICAgIHByaXZhdGUgaGlkZGVuOiBib29sZWFuO1xuICAgIHByaXZhdGUgY3RybFByb3ZpZGVyOiBJRm9ybUNvbnRyb2xQcm92aWRlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGR1bW15RGF0YTogSUZvcm1Db250cm9sRGF0YTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWRvbmx5VGVzdGVyOiAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZGVUZXN0ZXI6IChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VyaWFsaXplVGVzdGVyOiAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRlVGVzdGVyOiAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybTogSUR5bmFtaWNGb3JtQmFzZSwgcHJpdmF0ZSBjb250cm9sOiBJRm9ybUNvbnRyb2wgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZm9ybUlkID0gVW5pcXVlVXRpbHMudXVpZCgpO1xuICAgICAgICB0aGlzLm1ldGEgPSB7fTtcbiAgICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kdW1teURhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5yZWFkb25seVRlc3RlciA9IHRoaXMuY3JlYXRlVGVzdGVyKFwicmVhZG9ubHlcIik7XG4gICAgICAgIHRoaXMuaGlkZVRlc3RlciA9IHRoaXMuY3JlYXRlVGVzdGVyKFwiaGlkZGVuXCIpO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZVRlc3RlciA9IHRoaXMuY3JlYXRlVGVzdGVyKFwic2hvdWxkU2VyaWFsaXplXCIsIChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbnRyb2wudmlzaWJsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlVGVzdGVyID0gdGhpcy5jcmVhdGVUZXN0ZXIoXCJzaG91bGRWYWxpZGF0ZVwiLCAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb250cm9sLnZpc2libGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY3RybFByb3ZpZGVyID8gUHJvbWlzZS5yZXNvbHZlKCkgOiB0aGlzLmN0cmxQcm92aWRlci5sb2FkZXIoY29udHJvbCk7XG4gICAgfVxuXG4gICAgY2hlY2soY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRlc3Rlcihjb250cm9sKS50aGVuKGhpZGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZGVuID0gaGlkZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5VGVzdGVyKGNvbnRyb2wpLnRoZW4ocmVhZG9ubHkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbnRyb2wuZm9ybS5yZWFkb25seSB8fCByZWFkb25seSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvdWxkU2VyaWFsaXplKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVGVzdGVyKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHNob3VsZFZhbGlkYXRlKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUZXN0ZXIoY29udHJvbCk7XG4gICAgfVxuXG4gICAgZmluZFByb3ZpZGVyKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdHJsUHJvdmlkZXIgPSAhdGhpcy5jb250cm9sIHx8ICF0aGlzLmNvbnRyb2wudHlwZSA/IG51bGwgOiB0aGlzLmZvcm0uZmluZFByb3ZpZGVyKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVGVzdGVyKHRlc3Q6IHN0cmluZywgZGVmYXVsdEZ1bmM6IEZvcm1Db250cm9sVGVzdGVyID0gbnVsbCk6IChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGVzdGVyOiBGb3JtQ29udHJvbFRlc3RlciA9IHRoaXMuZGF0YVt0ZXN0XVxuICAgICAgICAgICAgPyBSZWZsZWN0VXRpbHMucmVzb2x2ZTxGb3JtQ29udHJvbFRlc3Rlcj4odGhpcy5kYXRhW3Rlc3RdLCB0aGlzLmZvcm0uaW5qZWN0b3IpXG4gICAgICAgICAgICA6IChkZWZhdWx0RnVuYyB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSkpO1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHRlc3Rlcihjb250cm9sKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUdyb3VwIGV4dGVuZHMgRm9ybUdyb3VwIGltcGxlbWVudHMgSUR5bmFtaWNGb3JtQ29udHJvbCB7XG5cbiAgICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmlkO1xuICAgIH1cblxuICAgIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci50eXBlO1xuICAgIH1cblxuICAgIGdldCBkYXRhKCk6IElGb3JtQ29udHJvbERhdGEge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuZGF0YTtcbiAgICB9XG5cbiAgICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLnZpc2libGU7XG4gICAgfVxuXG4gICAgZ2V0IG1ldGEoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLm1ldGE7XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdG9yKCk6IEluamVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5pbmplY3RvcjtcbiAgICB9XG5cbiAgICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sYWJlbCAhPT0gXCJcIiA/IGAke3RoaXMucHJlZml4fSR7dGhpcy5kYXRhLmxhYmVsfWAgOiBcIlwiO1xuICAgIH1cblxuICAgIGdldCBwcm92aWRlcigpOiBJRm9ybUNvbnRyb2xQcm92aWRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5wcm92aWRlcjtcbiAgICB9XG5cbiAgICBnZXQgbW9kZWwoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubU1vZGVsO1xuICAgIH1cblxuICAgIGdldCBmb3JtSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmZvcm1JZDtcbiAgICB9XG5cbiAgICBnZXQgZm9ybUNvbnRyb2xzKCk6IElEeW5hbWljRm9ybUNvbnRyb2xbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1Db250cm9scyB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybUZpZWxkcygpOiBJRHluYW1pY0Zvcm1GaWVsZFNldHMge1xuICAgICAgICByZXR1cm4gdGhpcy5tRmllbGRTZXRzIHx8IHt9O1xuICAgIH1cblxuICAgIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm5hbWUgPyBcIlwiIDogYCR7dGhpcy5uYW1lfS5gO1xuICAgIH1cblxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1OYW1lO1xuICAgIH1cblxuICAgIGdldCBzdGF0ZSgpOiBEeW5hbWljRm9ybVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIDxEeW5hbWljRm9ybVN0YXRlPih0aGlzLmxvYWRpbmcgPyBcIkxPQURJTkdcIiA6IHRoaXMuc3RhdHVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhlbHBlcjogRHluYW1pY0Zvcm1Db250cm9sSGVscGVyO1xuICAgIHByaXZhdGUgbU5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG1Nb2RlbDogYW55O1xuICAgIHByaXZhdGUgbUNvbnRyb2xzOiBJRHluYW1pY0Zvcm1Db250cm9sW107XG4gICAgcHJpdmF0ZSBtU2VyaWFsaXplcnM6IElGb3JtU2VyaWFsaXplcltdO1xuICAgIHByaXZhdGUgbUZpZWxkU2V0czogSUR5bmFtaWNGb3JtRmllbGRTZXRzO1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBsb2FkaW5nOiBib29sZWFuO1xuICAgIHByaXZhdGUgY2hhbmdlVGltZXI6IElUaW1lcjtcblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUZvcm1Db250cm9scyhncm91cDogRHluYW1pY0Zvcm1Hcm91cCwgY29udHJvbHM6IElGb3JtQ29udHJvbFtdKTogSUR5bmFtaWNGb3JtQ29udHJvbFtdIHtcbiAgICAgICAgaWYgKCFjb250cm9scyAmJiBPYmplY3RVdGlscy5pc09iamVjdChncm91cC5tb2RlbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoZ3JvdXAubW9kZWwpO1xuICAgICAgICAgICAgY29udHJvbHMgPSBwcm9wcy5tYXAoaWQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRGb3JtQ29udHJvbChncm91cC5tb2RlbCwgaWQpO1xuICAgICAgICAgICAgfSkuZmlsdGVyKE9iamVjdFV0aWxzLmlzRGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250cm9scykgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gY29udHJvbHMubWFwKGN0cmwgPT4ge1xuICAgICAgICAgICAgaWYgKGN0cmwudHlwZSA9PSBcIm1vZGVsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBEeW5hbWljRm9ybUdyb3VwKGdyb3VwLmZvcm0sIGN0cmwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gZ3JvdXAubW9kZWxbY3RybC5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHN1Ykdyb3VwLmdldERhdGE8SUZvcm1Nb2RlbERhdGE+KCk7XG4gICAgICAgICAgICAgICAgZGF0YS5uYW1lID0gZGF0YS5uYW1lIHx8IGdyb3VwLm5hbWU7XG4gICAgICAgICAgICAgICAgc3ViR3JvdXAuc2V0dXAobW9kZWwsIGRhdGEpO1xuICAgICAgICAgICAgICAgIGdyb3VwLm1vZGVsW2N0cmwuaWRdID0gbW9kZWw7XG4gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChzdWJHcm91cC5pZCwgc3ViR3JvdXApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJHcm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0Zvcm1Db250cm9sKGN0cmwsIGdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlRm9ybVNlcmlhbGl6ZXJzKGdyb3VwOiBEeW5hbWljRm9ybUdyb3VwLCBzZXJpYWxpemVyczogSUZvcm1TZXJpYWxpemVycyk6IElGb3JtU2VyaWFsaXplcltdIHtcbiAgICAgICAgaWYgKCFzZXJpYWxpemVycyAmJiBPYmplY3RVdGlscy5pc09iamVjdChncm91cC5tb2RlbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoZ3JvdXAubW9kZWwpO1xuICAgICAgICAgICAgc2VyaWFsaXplcnMgPSBwcm9wcy5yZWR1Y2UoKHJlc3VsdCwgaWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gZ2V0Rm9ybVNlcmlhbGl6ZXIoZ3JvdXAubW9kZWwsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZXIpIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkXSA9IHNlcmlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlcmlhbGl6ZXJzKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXJpYWxpemVycykubWFwKGlkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc1tpZF0gfHwgZGVmYXVsdFNlcmlhbGl6ZXI7XG4gICAgICAgICAgICByZXR1cm4gIXNlcmlhbGl6ZXIgPyBudWxsIDoge1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICBmdW5jOiBSZWZsZWN0VXRpbHMucmVzb2x2ZTxJRm9ybUNvbnRyb2xTZXJpYWxpemVyPihzZXJpYWxpemVyLCBncm91cC5pbmplY3RvcilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBmb3JtOiBJRHluYW1pY0Zvcm1CYXNlLCBjb250cm9sOiBJRm9ybUNvbnRyb2wgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKHt9LCB7dXBkYXRlT246ICgoIWNvbnRyb2wgfHwgIWNvbnRyb2wuZGF0YSkgPyBudWxsIDogY29udHJvbC5kYXRhLnVwZGF0ZU9uKSB8fCBmb3JtLnVwZGF0ZU9uIHx8IFwiYmx1clwifSk7XG4gICAgICAgIHRoaXMubU5hbWUgPSBcIlwiO1xuICAgICAgICB0aGlzLm1Nb2RlbCA9IHt9O1xuICAgICAgICB0aGlzLm1Db250cm9scyA9IFtdO1xuICAgICAgICB0aGlzLm1TZXJpYWxpemVycyA9IFtdO1xuICAgICAgICB0aGlzLm1GaWVsZFNldHMgPSB7fTtcbiAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgRHluYW1pY0Zvcm1Db250cm9sSGVscGVyKGZvcm0sIGNvbnRyb2wpO1xuICAgICAgICB0aGlzLmhlbHBlci5maW5kUHJvdmlkZXIodGhpcyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlVGltZXIgPSBUaW1lclV0aWxzLmNyZWF0ZVRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gdGhpcy5mb3JtLnJvb3Q7XG4gICAgICAgICAgICByb290Lm9uU3RhdHVzQ2hhbmdlLmVtaXQocm9vdCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldEFzeW5jVmFsaWRhdG9ycyhjcmVhdGVWYWxpZGF0b3IodGhpcykpO1xuICAgIH1cblxuICAgIGdldERhdGE8VCBleHRlbmRzIElGb3JtQ29udHJvbERhdGE+KCk6IFQge1xuICAgICAgICByZXR1cm4gPFQ+dGhpcy5kYXRhO1xuICAgIH1cblxuICAgIGdldENvbnRyb2woaWQ6IHN0cmluZyk6IElEeW5hbWljRm9ybUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gPGFueT50aGlzLmdldChpZCk7XG4gICAgfVxuXG4gICAgbG9hZCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMubUNvbnRyb2xzLm1hcChjID0+IGMubG9hZCgpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmhlbHBlci5sb2FkKHRoaXMpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB9XG5cbiAgICBjaGVjaygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGVscGVyLmNoZWNrKHRoaXMpLnRoZW4ocmVhZG9ubHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWFkb25seSkgdGhpcy5kaXNhYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSk7IGVsc2UgdGhpcy5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMubUNvbnRyb2xzLm1hcChjID0+IGMuY2hlY2soKSk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG91bGRTZXJpYWxpemUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRTZXJpYWxpemUodGhpcyk7XG4gICAgfVxuXG4gICAgc2hvdWxkVmFsaWRhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRWYWxpZGF0ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplcnMgPSB0aGlzLm1TZXJpYWxpemVycy5tYXAocyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHMuZnVuYyhzLmlkLCB0aGlzKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHJsID0gdGhpcy5nZXRDb250cm9sKHMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9ICFjdHJsID8gUHJvbWlzZS5yZXNvbHZlKHRydWUpIDogY3RybC5zaG91bGRTZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihzaG91bGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGQpIHJlc3VsdFtzLmlkXSA9IHJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHNlcmlhbGl6ZXJzKS50aGVuKCgpID0+IHJlc29sdmUocmVzdWx0KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya0FzVW50b3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgIH1cblxuICAgIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHNob3dFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgdGhpcy5tQ29udHJvbHMuZm9yRWFjaChjdHJsID0+IGN0cmwuc2hvd0Vycm9ycygpKTtcbiAgICB9XG5cbiAgICByZWxvYWRDb250cm9scygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsZXQgY2FsbGJhY2sgPSAoKSA9PiB7fTtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuZm9ybS5yb290O1xuICAgICAgICAgICAgICAgIHJvb3Qub25Jbml0LmVtaXQocm9vdCk7XG4gICAgICAgICAgICAgICAgcm9vdC5vblN0YXR1c0NoYW5nZS5lbWl0KHJvb3QpO1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0NTQyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzVGltZXIgPSBUaW1lclV0aWxzLmNyZWF0ZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgc3RhdHVzVGltZXIuc2V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09IFwiUEVORElOR1wiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RpbWVyLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJvb3Qub25TdGF0dXNDaGFuZ2UuZW1pdChyb290KTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChzdGF0dXNUaW1lci5jbGVhciwgNTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkKCkudGhlbigoKSA9PiB0aGlzLmNoZWNrKCkudGhlbihyZXNvbHZlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcm9taXNlLnRoZW4oY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgc2V0dXAobW9kZWw6IGFueSwgaW5mbzogSUR5bmFtaWNGb3JtSW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1OYW1lID0gaW5mby5uYW1lIHx8IFwiXCI7XG4gICAgICAgIHRoaXMubU1vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMubUNvbnRyb2xzLmZvckVhY2goY3RybCA9PiB0aGlzLnJlbW92ZUNvbnRyb2woY3RybC5pZCkpO1xuICAgICAgICB0aGlzLm1Db250cm9scyA9IER5bmFtaWNGb3JtR3JvdXAuY3JlYXRlRm9ybUNvbnRyb2xzKHRoaXMsIGluZm8uY29udHJvbHMpO1xuICAgICAgICB0aGlzLm1Db250cm9scy5mb3JFYWNoKChjdHJsOiBhbnkpID0+IHRoaXMuYWRkQ29udHJvbChjdHJsLmlkLCBjdHJsKSk7XG4gICAgICAgIHRoaXMubVNlcmlhbGl6ZXJzID0gRHluYW1pY0Zvcm1Hcm91cC5jcmVhdGVGb3JtU2VyaWFsaXplcnModGhpcywgaW5mby5zZXJpYWxpemVycyk7XG4gICAgICAgIHRoaXMubUZpZWxkU2V0cyA9IGluZm8uZmllbGRTZXRzID8gaW5mby5maWVsZFNldHMucmVkdWNlKChyZXN1bHQsIGZzKSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbZnMuaWRdID0gZnM7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LCB7fSkgOiBnZXRGb3JtRmllbGRTZXRzKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vZGVsKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RlbFtjb250cm9sLmlkXSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIHRoaXMuY2hhbmdlVGltZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VUaW1lci5zZXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVjaygpLnRoZW4oKCkgPT4gdGhpcy5yZWxvYWRDb250cm9sc0Zyb20oY29udHJvbCwgbmV3IFNldDxJRHluYW1pY0Zvcm1Db250cm9sPigpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucm9vdC5vbkNoYW5nZS5lbWl0KGNvbnRyb2wpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVsb2FkQ29udHJvbHNGcm9tKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wsIGNvbnRyb2xzPzogU2V0PElEeW5hbWljRm9ybUNvbnRyb2w+KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbnRyb2wuZGF0YTtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnJlbG9hZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZWxvYWQgPSBPYmplY3RVdGlscy5pc0FycmF5KGRhdGEucmVsb2FkKSA/IGRhdGEucmVsb2FkIDogW2RhdGEucmVsb2FkXTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlbG9hZC5tYXAoaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dENvbnRyb2wgPSB0aGlzLmdldENvbnRyb2woaWQpO1xuICAgICAgICAgICAgaWYgKCFuZXh0Q29udHJvbCB8fCBjb250cm9scy5oYXMobmV4dENvbnRyb2wpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICBjb250cm9scy5hZGQobmV4dENvbnRyb2wpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgbmV4dENvbnRyb2wubG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZENvbnRyb2xzRnJvbShuZXh0Q29udHJvbCwgY29udHJvbHMpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbnRyb2wgZXh0ZW5kcyBGb3JtQ29udHJvbCBpbXBsZW1lbnRzIElEeW5hbWljRm9ybUNvbnRyb2wge1xuXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5pZDtcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIudHlwZTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBJRm9ybUNvbnRyb2xEYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmRhdGE7XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci52aXNpYmxlO1xuICAgIH1cblxuICAgIGdldCBtZXRhKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5tZXRhO1xuICAgIH1cblxuICAgIGdldCBmb3JtKCk6IElEeW5hbWljRm9ybUJhc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cC5mb3JtO1xuICAgIH1cblxuICAgIGdldCBpbmplY3RvcigpOiBJbmplY3RvciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uaW5qZWN0b3I7XG4gICAgfVxuXG4gICAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGFiZWwgIT09IFwiXCIgPyBgJHt0aGlzLmdyb3VwLnByZWZpeH0ke3RoaXMuZGF0YS5sYWJlbH1gIDogXCJcIjtcbiAgICB9XG5cbiAgICBnZXQgcHJvdmlkZXIoKTogSUZvcm1Db250cm9sUHJvdmlkZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIucHJvdmlkZXI7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwLm1vZGVsO1xuICAgIH1cblxuICAgIGdldCBmb3JtSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmZvcm1JZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhlbHBlcjogRHluYW1pY0Zvcm1Db250cm9sSGVscGVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250cm9sOiBJRm9ybUNvbnRyb2wsIHB1YmxpYyByZWFkb25seSBncm91cDogRHluYW1pY0Zvcm1Hcm91cCkge1xuICAgICAgICBzdXBlcihncm91cC5tb2RlbFtjb250cm9sLmlkXSwge3VwZGF0ZU9uOiBjb250cm9sLmRhdGEudXBkYXRlT24gfHwgZ3JvdXAudXBkYXRlT259KTtcbiAgICAgICAgdGhpcy5ncm91cC5hZGRDb250cm9sKGNvbnRyb2wuaWQsIHRoaXMpO1xuICAgICAgICB0aGlzLmhlbHBlciA9IG5ldyBEeW5hbWljRm9ybUNvbnRyb2xIZWxwZXIodGhpcy5mb3JtLCBjb250cm9sKTtcbiAgICAgICAgdGhpcy5oZWxwZXIuZmluZFByb3ZpZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ncm91cC51cGRhdGVNb2RlbCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc2V0QXN5bmNWYWxpZGF0b3JzKGNyZWF0ZVZhbGlkYXRvcih0aGlzKSk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YTxUIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YT4oKTogVCB7XG4gICAgICAgIHJldHVybiA8VD50aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgZ2V0Q29udHJvbChpZDogc3RyaW5nKTogSUR5bmFtaWNGb3JtQ29udHJvbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxvYWQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmxvYWQodGhpcyk7XG4gICAgfVxuXG4gICAgY2hlY2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSB0aGlzLmhlbHBlci5jaGVjayh0aGlzKTtcbiAgICAgICAgY2hlY2sudGhlbihyZWFkb25seSA9PiB7XG4gICAgICAgICAgICBpZiAocmVhZG9ubHkgfHwgdGhpcy5ncm91cC5kaXNhYmxlZCkgdGhpcy5kaXNhYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSk7IGVsc2UgdGhpcy5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjaGVjaztcbiAgICB9XG5cbiAgICBzaG91bGRTZXJpYWxpemUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRTZXJpYWxpemUodGhpcyk7XG4gICAgfVxuXG4gICAgc2hvdWxkVmFsaWRhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRWYWxpZGF0ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBvbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtBc1VudG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICB9XG5cbiAgICBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICB9XG5cbiAgICBzaG93RXJyb3JzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtQ29udHJvbCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdmlzaWJsZT86IGJvb2xlYW47XG4gICAgZGF0YT86IElGb3JtQ29udHJvbERhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Db250cm9sRGF0YSB7XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgbGFiZWxBbGlnbj86IHN0cmluZztcbiAgICBmaWVsZFNldD86IHN0cmluZztcbiAgICBjbGFzc2VzPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5PzogRm9ybUNvbnRyb2xUZXN0ZXJGYWN0b3J5O1xuICAgIGhpZGRlbj86IEZvcm1Db250cm9sVGVzdGVyRmFjdG9yeTtcbiAgICBzaG91bGRTZXJpYWxpemU/OiBGb3JtQ29udHJvbFRlc3RlckZhY3Rvcnk7XG4gICAgc2hvdWxkVmFsaWRhdGU/OiBGb3JtQ29udHJvbFRlc3RlckZhY3Rvcnk7XG4gICAgdmFsaWRhdG9yPzogRm9ybUNvbnRyb2xWYWxpZGF0b3JGYWN0b3J5O1xuICAgIHZhbGlkYXRvcnM/OiBGb3JtQ29udHJvbFZhbGlkYXRvckZhY3RvcnlbXTtcbiAgICB1cGRhdGVPbj86IER5bmFtaWNGb3JtVXBkYXRlT247XG4gICAgcmVsb2FkPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1JbnB1dERhdGEgZXh0ZW5kcyBJRm9ybUNvbnRyb2xEYXRhIHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIGF1dG9jb21wbGV0ZT86IHN0cmluZztcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICB1c2VMYW5ndWFnZT86IGJvb2xlYW47XG4gICAgbWFzaz86IElGb3JtSW5wdXRNYXNrRnVuY3Rpb24gfCBJRm9ybUlucHV0TWFza1tdO1xuICAgIHVubWFzaz86IElGb3JtSW5wdXRVbk1hc2tGdW5jdGlvbjtcbiAgICBzdGVwPzogbnVtYmVyO1xuICAgIG1pbj86IG51bWJlcjtcbiAgICBtYXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1TZWxlY3REYXRhIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YSB7XG4gICAgb3B0aW9ucz86IElGb3JtQ29udHJvbE9wdGlvbnMgfCBJUmVzb2x2ZUZhY3Rvcnk7XG4gICAgZW1wdHlPcHRpb24/OiBib29sZWFuO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgbXVsdGk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtU3RhdGljRGF0YSBleHRlbmRzIElGb3JtQ29udHJvbERhdGEge1xuICAgIHByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbiAgICBzdHlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRm9ybUZpbGVEYXRhIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YSB7XG4gICAgYWNjZXB0Pzogc3RyaW5nO1xuICAgIG11bHRpPzogYm9vbGVhbjtcbiAgICBiYXNlVXJsPzogc3RyaW5nO1xuICAgIGFzRmlsZT86IGJvb2xlYW47XG4gICAgYXNEYXRhVXJsPzogYm9vbGVhbjtcbiAgICB1cGxvYWRVcmw/OiBzdHJpbmc7XG4gICAgdXBsb2FkT3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucztcbiAgICBjcmVhdGVVcGxvYWREYXRhPzogKGZpbGU6IEZpbGUpID0+IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRm9ybU1vZGVsRGF0YSBleHRlbmRzIElGb3JtQ29udHJvbERhdGEsIElEeW5hbWljRm9ybUluZm8ge1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1GaWVsZFNldCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjbGFzc2VzPzogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHRpdGxlQ2xhc3Nlcz86IHN0cmluZztcbiAgICBzZXRDbGFzc2VzPzogc3RyaW5nO1xuICAgIGNvbnRyb2xDbGFzc2VzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtQ29udHJvbE9wdGlvbiB7XG4gICAgaWQ6IGFueTtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHNlbGVjdGFibGU/OiBib29sZWFuO1xufVxuXG4vLyAtLS0gQmFzaWMgZm9ybSBpbnRlcmZhY2VzIC0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybVRlbXBsYXRlcyB7XG4gICAgW2lkOiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybUNvbmZpZyB7XG4gICAgcGF0aD86IHN0cmluZyB8IG51bWJlciB8IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjbGFzc2VzPzogc3RyaW5nO1xuICAgIGZvcm1DbGFzc2VzPzogc3RyaW5nO1xuICAgIGlubmVyRm9ybUNsYXNzZXM/OiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY1NpbmdsZUZvcm1Db25maWcgZXh0ZW5kcyBJRHluYW1pY0Zvcm1Db25maWcsIElEeW5hbWljRm9ybUluZm8ge1xuICAgIGRhdGE6IGFueTtcbiAgICBjb250cm9sRGF0YT86IElGb3JtQ29udHJvbERhdGE7XG4gICAgbXVsdGk/OiBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY011bHRpRm9ybUNvbmZpZyBleHRlbmRzIElEeW5hbWljRm9ybUNvbmZpZyB7XG4gICAgZGF0YTogSUR5bmFtaWNGb3Jtc0NvbmZpZ3M7XG4gICAgbXVsdGk6IHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIElEeW5hbWljRm9ybXNDb25maWdzID0gQXJyYXk8SUR5bmFtaWNTaW5nbGVGb3JtQ29uZmlnIHwgSUR5bmFtaWNNdWx0aUZvcm1Db25maWc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybUJhc2Uge1xuXG4gICAgbmFtZT86IHN0cmluZztcbiAgICByZWFkb25seT86IGJvb2xlYW47XG4gICAgdXBkYXRlT24/OiBcImNoYW5nZVwiIHwgXCJibHVyXCIgfCBcInN1Ym1pdFwiO1xuICAgIGNsYXNzZXM6IHN0cmluZztcbiAgICBwYXJlbnQ6IElEeW5hbWljRm9ybUJhc2U7XG5cbiAgICB3cmFwcGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgZmllbGRTZXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBjb250cm9sVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBjb250cm9sVGVtcGxhdGVzOiBJRHluYW1pY0Zvcm1UZW1wbGF0ZXM7XG4gICAgbGFiZWxUZW1wbGF0ZXM6IElEeW5hbWljRm9ybVRlbXBsYXRlcztcbiAgICBpbnB1dFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xuICAgIHByZWZpeFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xuICAgIHN1ZmZpeFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xuICAgIHNldFByZWZpeFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xuICAgIHNldFN1ZmZpeFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xuXG4gICAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm1Db250cm9sPjtcbiAgICBvblN0YXR1c0NoYW5nZTogRXZlbnRFbWl0dGVyPElEeW5hbWljRm9ybUJhc2U+O1xuICAgIG9uSW5pdDogRXZlbnRFbWl0dGVyPElEeW5hbWljRm9ybUJhc2U+O1xuICAgIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8SUR5bmFtaWNGb3JtQmFzZT47XG5cbiAgICByb290PzogSUR5bmFtaWNGb3JtQmFzZTtcbiAgICBzdGF0dXM6IER5bmFtaWNGb3JtU3RhdGU7XG4gICAgaW5qZWN0b3I/OiBJbmplY3RvcjtcbiAgICBjZHI/OiBDaGFuZ2VEZXRlY3RvclJlZjtcblxuICAgIHZhbGlkYXRlKHNob3dFcnJvcnM/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+O1xuXG4gICAgc2VyaWFsaXplKHZhbGlkYXRlPzogYm9vbGVhbik6IFByb21pc2U8YW55PjtcblxuICAgIGNoZWNrKCk6IFByb21pc2U8YW55PjtcblxuICAgIGdldENvbnRyb2woaWQ6IHN0cmluZyk6IElEeW5hbWljRm9ybUNvbnRyb2w7XG5cbiAgICBmaW5kUHJvdmlkZXIoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IElGb3JtQ29udHJvbFByb3ZpZGVyO1xufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEFzeW5jU3VibWl0TWV0aG9kID0gKGZvcm06IElEeW5hbWljRm9ybUJhc2UpID0+IFByb21pc2U8SUFzeW5jTWVzc2FnZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNGb3JtSW5mbyB7XG4gICAgZ3JvdXA/OiBEeW5hbWljRm9ybUdyb3VwO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29udHJvbHM/OiBJRm9ybUNvbnRyb2xbXTtcbiAgICBzZXJpYWxpemVycz86IElGb3JtU2VyaWFsaXplcnM7XG4gICAgZmllbGRTZXRzPzogSUZvcm1GaWVsZFNldFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybSBleHRlbmRzIElEeW5hbWljRm9ybUJhc2UsIElEeW5hbWljRm9ybUluZm8ge1xuICAgIGRhdGE6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY0Zvcm1GaWVsZFNldHMge1xuICAgIFtpZDogc3RyaW5nXTogSUZvcm1GaWVsZFNldFxufVxuXG4vLyAtLS0gQmFzaWMgZm9ybSB0eXBlcyAtLS1cbmV4cG9ydCB0eXBlIEZvcm1Db250cm9sVGVzdGVyID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8Ym9vbGVhbj47XG5leHBvcnQgdHlwZSBGb3JtQ29udHJvbFRlc3RlckZhY3RvcnkgPSBGb3JtQ29udHJvbFRlc3RlciB8IElSZXNvbHZlRmFjdG9yeTtcbmV4cG9ydCB0eXBlIEZvcm1Db250cm9sVmFsaWRhdG9yID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8c3RyaW5nIHwgVmFsaWRhdGlvbkVycm9ycz47XG5leHBvcnQgdHlwZSBGb3JtQ29udHJvbFZhbGlkYXRvckZhY3RvcnkgPSBGb3JtQ29udHJvbFZhbGlkYXRvciB8IElSZXNvbHZlRmFjdG9yeTtcblxuLy8gLS0tIERlY29yYXRvciBmdW5jdGlvbnMgLS0tXG5jb25zdCBlbXB0eUFycmF5OiBhbnkgPSBbXTtcbmNvbnN0IGVtcHR5VGVzdGVyOiBGb3JtQ29udHJvbFRlc3RlciA9ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2VyaWFsaXplcihpZDogc3RyaW5nLCBwYXJlbnQ6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBwYXJlbnQuZ2V0Q29udHJvbChpZCk7XG4gICAgcmV0dXJuICFjb250cm9sID8gUHJvbWlzZS5yZXNvbHZlKHBhcmVudC5tb2RlbFtpZF0pIDogY29udHJvbC5zZXJpYWxpemUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1TZXJpYWxpemFibGUoc2VyaWFsaXplcj86IElGb3JtQ29udHJvbFNlcmlhbGl6ZXIgfCBJUmVzb2x2ZUZhY3RvcnkpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBSZWZsZWN0VXRpbHMuZGVmaW5lTWV0YWRhdGEoXCJkeW5hbWljRm9ybVNlcmlhbGl6ZXJcIiwgc2VyaWFsaXplciB8fCBkZWZhdWx0U2VyaWFsaXplciwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1JbnB1dChkYXRhPzogSUZvcm1JbnB1dERhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtZXRhID0gUmVmbGVjdFV0aWxzLmdldE93bk1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBtZXRhID8gbWV0YS5uYW1lIDogXCJcIjtcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IHByb3BlcnR5S2V5LmluZGV4T2YoXCJwYXNzd29yZFwiKSA8IDAgPyBcInRleHRcIiA6IFwicGFzc3dvcmRcIjtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJudW1iZXJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJCb29sZWFuXCI6XG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZUZvcm1Db250cm9sKHRhcmdldCwgcHJvcGVydHlLZXksIGNyZWF0ZUZvcm1JbnB1dChwcm9wZXJ0eUtleSwgZGF0YSwgaW5wdXRUeXBlKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1TZWxlY3QoZGF0YT86IElGb3JtU2VsZWN0RGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGRlZmluZUZvcm1Db250cm9sKHRhcmdldCwgcHJvcGVydHlLZXksIGNyZWF0ZUZvcm1TZWxlY3QocHJvcGVydHlLZXksIGRhdGEpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybVN0YXRpYyhkYXRhPzogSUZvcm1TdGF0aWNEYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybVN0YXRpYyhwcm9wZXJ0eUtleSwgZGF0YSkpO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtTW9kZWwoZGF0YT86IElGb3JtTW9kZWxEYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybU1vZGVsKHByb3BlcnR5S2V5LCBkYXRhKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1GaWxlKGRhdGE/OiBJRm9ybUZpbGVEYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybUZpbGUocHJvcGVydHlLZXksIGRhdGEpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybUZpZWxkU2V0KGRhdGE6IElGb3JtRmllbGRTZXQpOiBDbGFzc0RlY29yYXRvciB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBzZXRzID0gZ2V0Rm9ybUZpZWxkU2V0cyh0YXJnZXQpO1xuICAgICAgICBkYXRhLmNsYXNzZXMgPSBkYXRhLmNsYXNzZXMgfHwgXCJcIjtcbiAgICAgICAgc2V0c1tkYXRhLmlkXSA9IGRhdGE7XG4gICAgICAgIFJlZmxlY3RVdGlscy5kZWZpbmVNZXRhZGF0YShcImR5bmFtaWNGb3JtRmllbGRTZXRzXCIsIHNldHMsIHRhcmdldCk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBQcm92aWRlciBleHRlbmRzIFZhbHVlUHJvdmlkZXIge1xuICAgIHByb3ZpZGU6IEluamVjdGlvblRva2VuPFR5cGU8SUZvcm1Hcm91cENvbXBvbmVudD4+O1xuICAgIG11bHRpPzogYm9vbGVhbjtcbiAgICB1c2VWYWx1ZTogVHlwZTxJRm9ybUdyb3VwQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVGb3JtR3JvdXAoY29tcG9uZW50OiBUeXBlPElGb3JtR3JvdXBDb21wb25lbnQ+KTogRm9ybUdyb3VwUHJvdmlkZXIge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb3ZpZGU6IEZPUk1fR1JPVVBfVFlQRSxcbiAgICAgICAgdXNlVmFsdWU6IGNvbXBvbmVudFxuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbnRyb2xQcm92aWRlciB7XG4gICAgcHJvdmlkZTogSW5qZWN0aW9uVG9rZW48SUZvcm1Db250cm9sUHJvdmlkZXI+O1xuICAgIG11bHRpPzogYm9vbGVhbjtcbiAgICB1c2VWYWx1ZTogSUZvcm1Db250cm9sUHJvdmlkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRm9ybUNvbnRyb2woY29tcG9uZW50OiBUeXBlPElGb3JtQ29udHJvbENvbXBvbmVudD4sIGFjY2VwdG9yOiBJRm9ybUNvbnRyb2xQcm92aWRlckFjY2VwdG9yLCBsb2FkZXI6IElGb3JtQ29udHJvbFByb3ZpZGVyTG9hZGVyLCBwcmlvcml0eTogbnVtYmVyID0gMCk6IEZvcm1Db250cm9sUHJvdmlkZXIge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb3ZpZGU6IEZPUk1fQ09OVFJPTF9QUk9WSURFUixcbiAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSxcbiAgICAgICAgICAgIGFjY2VwdG9yOiBhY2NlcHRvcixcbiAgICAgICAgICAgIGxvYWRlcjogbG9hZGVyXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIGNvbnRyb2w6IElGb3JtQ29udHJvbCk6IHZvaWQge1xuICAgIFJlZmxlY3RVdGlscy5kZWZpbmVNZXRhZGF0YShcImR5bmFtaWNGb3JtQ29udHJvbFwiLCBjb250cm9sLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1GaWVsZFNldHModGFyZ2V0OiBhbnkpOiBJRHluYW1pY0Zvcm1GaWVsZFNldHMge1xuICAgIHJldHVybiBSZWZsZWN0VXRpbHMuZ2V0TWV0YWRhdGEoXCJkeW5hbWljRm9ybUZpZWxkU2V0c1wiLCB0YXJnZXQpIHx8IHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybUNvbnRyb2wodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBJRm9ybUNvbnRyb2wge1xuICAgIHJldHVybiBSZWZsZWN0VXRpbHMuZ2V0TWV0YWRhdGEoXCJkeW5hbWljRm9ybUNvbnRyb2xcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtU2VyaWFsaXplcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IElGb3JtQ29udHJvbFNlcmlhbGl6ZXIgfCBJUmVzb2x2ZUZhY3Rvcnkge1xuICAgIHJldHVybiBSZWZsZWN0VXRpbHMuZ2V0TWV0YWRhdGEoXCJkeW5hbWljRm9ybVNlcmlhbGl6ZXJcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtQ29udHJvbChpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGRhdGE/OiBJRm9ybUNvbnRyb2xEYXRhKTogSUZvcm1Db250cm9sIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLmxhYmVsID0gT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoZGF0YS5sYWJlbCkgPyBpZCA6IGRhdGEubGFiZWw7XG4gICAgZGF0YS5sYWJlbEFsaWduID0gZGF0YS5sYWJlbEFsaWduIHx8IFwibGVmdFwiO1xuICAgIGRhdGEuZmllbGRTZXQgPSBkYXRhLmZpZWxkU2V0IHx8IFVuaXF1ZVV0aWxzLnV1aWQoKTtcbiAgICBkYXRhLmNsYXNzZXMgPSBkYXRhLmNsYXNzZXMgfHwgXCJcIjtcbiAgICBkYXRhLnJlYWRvbmx5ID0gZGF0YS5yZWFkb25seSB8fCBlbXB0eVRlc3RlcjtcbiAgICBkYXRhLmhpZGRlbiA9IGRhdGEuaGlkZGVuIHx8IGVtcHR5VGVzdGVyO1xuICAgIGRhdGEudmFsaWRhdG9ycyA9IGRhdGEudmFsaWRhdG9ycyB8fCBlbXB0eUFycmF5O1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtSW5wdXQoaWQ6IHN0cmluZywgZGF0YTogSUZvcm1JbnB1dERhdGEsIHR5cGU6IHN0cmluZyA9IFwidGV4dFwiKTogSUZvcm1Db250cm9sIHtcbiAgICBjb25zdCBjb250cm9sID0gY3JlYXRlRm9ybUNvbnRyb2woaWQsIFwiaW5wdXRcIiwgZGF0YSk7XG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcbiAgICBkYXRhLnR5cGUgPSBkYXRhLnR5cGUgfHwgdHlwZTtcbiAgICBkYXRhLmNsYXNzZXMgPSAhZGF0YS5jbGFzc2VzID8gYGZvcm0tZ3JvdXAtJHtkYXRhLnR5cGV9YCA6IGAke2RhdGEuY2xhc3Nlc30gZm9ybS1ncm91cC0ke2RhdGEudHlwZX1gO1xuICAgIGRhdGEucGxhY2Vob2xkZXIgPSBkYXRhLnBsYWNlaG9sZGVyIHx8IChkYXRhLnR5cGUgPT0gXCJtYXNrXCIgPyBcIl9cIiA6IFwiXCIpO1xuICAgIGRhdGEuc3RlcCA9IGRhdGEuc3RlcCB8fCAxO1xuICAgIGRhdGEubWFzayA9IGRhdGEubWFzayB8fCBbL1xcdyovZ2ldO1xuICAgIHJldHVybiBjb250cm9sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybVNlbGVjdChpZDogc3RyaW5nLCBkYXRhOiBJRm9ybVNlbGVjdERhdGEpOiBJRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChpZCwgXCJzZWxlY3RcIiwgZGF0YSk7XG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcbiAgICBkYXRhLm9wdGlvbnMgPSBkYXRhLm9wdGlvbnMgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZShbXSkpO1xuICAgIGRhdGEudHlwZSA9IGRhdGEudHlwZSB8fCBcInNlbGVjdFwiO1xuICAgIGNvbnN0IGNsYXNzVHlwZSA9IGRhdGEudHlwZSA9PSBcInNlbGVjdFwiID8gXCJzZWxlY3RcIiA6IGBzZWxlY3QtJHtkYXRhLnR5cGV9YDtcbiAgICBkYXRhLmNsYXNzZXMgPSAhZGF0YS5jbGFzc2VzID8gYGZvcm0tZ3JvdXAtJHtjbGFzc1R5cGV9YCA6IGAke2RhdGEuY2xhc3Nlc30gZm9ybS1ncm91cC0ke2NsYXNzVHlwZX1gO1xuICAgIHJldHVybiBjb250cm9sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybVN0YXRpYyhpZDogc3RyaW5nLCBkYXRhOiBJRm9ybVN0YXRpY0RhdGEpOiBJRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChpZCwgXCJzdGF0aWNcIiwgZGF0YSk7XG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcbiAgICBkYXRhLnN0eWxlID0gZGF0YS5zdHlsZSB8fCBcInRhYmxlXCI7XG4gICAgcmV0dXJuIGNvbnRyb2w7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtTW9kZWwoaWQ6IHN0cmluZywgZGF0YTogSUZvcm1Nb2RlbERhdGEpOiBJRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChpZCwgXCJtb2RlbFwiLCBkYXRhKTtcbiAgICBkYXRhID0gY29udHJvbC5kYXRhO1xuICAgIGRhdGEubmFtZSA9IGRhdGEubmFtZSB8fCBcIlwiO1xuICAgIHJldHVybiBjb250cm9sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybUZpbGUoaWQ6IHN0cmluZywgZGF0YTogSUZvcm1GaWxlRGF0YSk6IElGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgY29udHJvbCA9IGNyZWF0ZUZvcm1Db250cm9sKGlkLCBcImZpbGVcIiwgZGF0YSk7XG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcbiAgICBkYXRhLmFjY2VwdCA9IGRhdGEuYWNjZXB0IHx8IFwiLmpwZywuanBlZywucG5nXCI7XG4gICAgZGF0YS5tdWx0aSA9IGRhdGEubXVsdGkgfHwgZmFsc2U7XG4gICAgZGF0YS5iYXNlVXJsID0gT2JqZWN0VXRpbHMuaXNTdHJpbmcoZGF0YS5iYXNlVXJsKSA/IGRhdGEuYmFzZVVybCA6IFwiYXNzZXRzL1wiO1xuICAgIGRhdGEudXBsb2FkVXJsID0gT2JqZWN0VXRpbHMuaXNTdHJpbmcoZGF0YS51cGxvYWRVcmwpID8gZGF0YS51cGxvYWRVcmwgOiBcImFzc2V0c1wiO1xuICAgIGRhdGEuY3JlYXRlVXBsb2FkRGF0YSA9IGRhdGEuY3JlYXRlVXBsb2FkRGF0YSB8fCAoKGZpbGU6IEZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtLmFwcGVuZChcImZpbGVcIiwgZmlsZSk7XG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgIH0pO1xuICAgIHJldHVybiBjb250cm9sO1xufVxuIl19
1
+ import { HostBinding, InjectionToken, Directive } from "@angular/core";
2
+ import { FormControl, FormGroup } from "@angular/forms";
3
+ import { ObjectUtils, ReflectUtils, TimerUtils, UniqueUtils } from "@stemy/ngx-utils";
4
+ export const FORM_GROUP_TYPE = new InjectionToken("form-group-provider");
5
+ export const FORM_CONTROL_PROVIDER = new InjectionToken("form-control-provider");
6
+ export class FormControlComponent {
7
+ get form() {
8
+ return !this.control ? null : this.control.form;
9
+ }
10
+ get data() {
11
+ return (!this.control ? {} : this.control.data);
12
+ }
13
+ get value() {
14
+ return !this.control ? null : this.control.value;
15
+ }
16
+ get meta() {
17
+ return !this.control ? null : this.control.meta;
18
+ }
19
+ get inputClass() {
20
+ return true;
21
+ }
22
+ }
23
+ FormControlComponent.decorators = [
24
+ { type: Directive }
25
+ ];
26
+ FormControlComponent.propDecorators = {
27
+ inputClass: [{ type: HostBinding, args: ["class.form-input",] }]
28
+ };
29
+ function createValidator(control) {
30
+ const data = control.data || {};
31
+ const validators = [data.validator].concat(data.validators || []).filter(ObjectUtils.isDefined).map(v => {
32
+ return ReflectUtils.resolve(v, control.injector);
33
+ });
34
+ return (ctrl) => new Promise((resolve) => {
35
+ const control = ctrl;
36
+ control.shouldValidate().then(should => {
37
+ if (!should) {
38
+ resolve(null);
39
+ return;
40
+ }
41
+ const validate = validators.map(v => v(control));
42
+ const metaValidator = control.meta.validator;
43
+ if (ObjectUtils.isFunction(metaValidator)) {
44
+ validate.push(metaValidator(control));
45
+ }
46
+ Promise.all(validate).then(results => {
47
+ results = results.filter(error => ObjectUtils.isObject(error) || ObjectUtils.isString(error));
48
+ let result = null;
49
+ if (results.length > 0) {
50
+ result = {};
51
+ results.forEach(error => {
52
+ if (ObjectUtils.isString(error)) {
53
+ result[error] = {};
54
+ return;
55
+ }
56
+ result = Object.assign(result, error);
57
+ });
58
+ }
59
+ resolve(result);
60
+ });
61
+ });
62
+ });
63
+ }
64
+ class DynamicFormControlHelper {
65
+ constructor(form, control = null) {
66
+ this.form = form;
67
+ this.control = control;
68
+ this.formId = UniqueUtils.uuid();
69
+ this.meta = {};
70
+ this.hidden = false;
71
+ this.dummyData = {};
72
+ this.readonlyTester = this.createTester("readonly");
73
+ this.hideTester = this.createTester("hidden");
74
+ this.serializeTester = this.createTester("shouldSerialize", (control) => {
75
+ return Promise.resolve(control.visible);
76
+ });
77
+ this.validateTester = this.createTester("shouldValidate", (control) => {
78
+ return Promise.resolve(control.visible);
79
+ });
80
+ }
81
+ get id() {
82
+ return !this.control ? null : this.control.id;
83
+ }
84
+ get type() {
85
+ return !this.control ? "" : this.control.type;
86
+ }
87
+ get data() {
88
+ return !this.control ? this.dummyData : this.control.data || this.dummyData;
89
+ }
90
+ get visible() {
91
+ return !this.hidden;
92
+ }
93
+ get provider() {
94
+ return this.ctrlProvider;
95
+ }
96
+ load(control) {
97
+ return !this.ctrlProvider ? Promise.resolve() : this.ctrlProvider.loader(control);
98
+ }
99
+ check(control) {
100
+ return new Promise(resolve => {
101
+ this.hideTester(control).then(hide => {
102
+ this.hidden = hide;
103
+ this.readonlyTester(control).then(readonly => {
104
+ resolve(control.form.readonly || readonly);
105
+ });
106
+ });
107
+ });
108
+ }
109
+ shouldSerialize(control) {
110
+ return this.serializeTester(control);
111
+ }
112
+ shouldValidate(control) {
113
+ return this.validateTester(control);
114
+ }
115
+ findProvider(control) {
116
+ this.ctrlProvider = !this.control || !this.control.type ? null : this.form.findProvider(control);
117
+ }
118
+ createTester(test, defaultFunc = null) {
119
+ const tester = this.data[test]
120
+ ? ReflectUtils.resolve(this.data[test], this.form.injector)
121
+ : (defaultFunc || (() => Promise.resolve(false)));
122
+ return (control) => tester(control);
123
+ }
124
+ }
125
+ export class DynamicFormGroup extends FormGroup {
126
+ constructor(form, control = null) {
127
+ super({}, { updateOn: ((!control || !control.data) ? null : control.data.updateOn) || form.updateOn || "blur" });
128
+ this.form = form;
129
+ this.mName = "";
130
+ this.mModel = {};
131
+ this.mControls = [];
132
+ this.mSerializers = [];
133
+ this.mFieldSets = {};
134
+ this.helper = new DynamicFormControlHelper(form, control);
135
+ this.helper.findProvider(this);
136
+ this.initialized = false;
137
+ this.loading = false;
138
+ this.changeTimer = TimerUtils.createTimeout();
139
+ this.statusChanges.subscribe(() => {
140
+ const root = this.form.root;
141
+ root.onStatusChange.emit(root);
142
+ });
143
+ this.setAsyncValidators(createValidator(this));
144
+ }
145
+ get id() {
146
+ return this.helper.id;
147
+ }
148
+ get type() {
149
+ return this.helper.type;
150
+ }
151
+ get data() {
152
+ return this.helper.data;
153
+ }
154
+ get visible() {
155
+ return this.helper.visible;
156
+ }
157
+ get meta() {
158
+ return this.helper.meta;
159
+ }
160
+ get injector() {
161
+ return this.form.injector;
162
+ }
163
+ get label() {
164
+ return this.data.label !== "" ? `${this.prefix}${this.data.label}` : "";
165
+ }
166
+ get provider() {
167
+ return this.helper.provider;
168
+ }
169
+ get model() {
170
+ return this.mModel;
171
+ }
172
+ get formId() {
173
+ return this.helper.formId;
174
+ }
175
+ get formControls() {
176
+ return this.mControls || [];
177
+ }
178
+ get formFields() {
179
+ return this.mFieldSets || {};
180
+ }
181
+ get prefix() {
182
+ return !this.name ? "" : `${this.name}.`;
183
+ }
184
+ get name() {
185
+ return this.mName;
186
+ }
187
+ get state() {
188
+ return (this.loading ? "LOADING" : this.status);
189
+ }
190
+ static createFormControls(group, controls) {
191
+ if (!controls && ObjectUtils.isObject(group.model)) {
192
+ const props = Object.keys(group.model);
193
+ controls = props.map(id => {
194
+ return getFormControl(group.model, id);
195
+ }).filter(ObjectUtils.isDefined);
196
+ }
197
+ if (!controls)
198
+ return [];
199
+ return controls.map(ctrl => {
200
+ if (ctrl.type == "model") {
201
+ const subGroup = new DynamicFormGroup(group.form, ctrl);
202
+ const model = group.model[ctrl.id] || {};
203
+ const data = subGroup.getData();
204
+ data.name = data.name || group.name;
205
+ subGroup.setup(model, data);
206
+ group.model[ctrl.id] = model;
207
+ group.addControl(subGroup.id, subGroup);
208
+ return subGroup;
209
+ }
210
+ return new DynamicFormControl(ctrl, group);
211
+ });
212
+ }
213
+ static createFormSerializers(group, serializers) {
214
+ if (!serializers && ObjectUtils.isObject(group.model)) {
215
+ const props = Object.keys(group.model);
216
+ serializers = props.reduce((result, id) => {
217
+ const serializer = getFormSerializer(group.model, id);
218
+ if (!serializer)
219
+ return result;
220
+ result[id] = serializer;
221
+ return result;
222
+ }, {});
223
+ }
224
+ if (!serializers)
225
+ return [];
226
+ return Object.keys(serializers).map(id => {
227
+ const serializer = serializers[id] || defaultSerializer;
228
+ return !serializer ? null : {
229
+ id: id,
230
+ func: ReflectUtils.resolve(serializer, group.injector)
231
+ };
232
+ });
233
+ }
234
+ getData() {
235
+ return this.data;
236
+ }
237
+ getControl(id) {
238
+ return this.get(id);
239
+ }
240
+ load() {
241
+ const promises = this.mControls.map(c => c.load());
242
+ promises.push(this.helper.load(this));
243
+ return Promise.all(promises);
244
+ }
245
+ check() {
246
+ return new Promise(resolve => {
247
+ this.helper.check(this).then(readonly => {
248
+ if (readonly)
249
+ this.disable({ emitEvent: false });
250
+ else
251
+ this.enable({ emitEvent: false });
252
+ const promises = this.mControls.map(c => c.check());
253
+ Promise.all(promises).then(resolve);
254
+ });
255
+ });
256
+ }
257
+ shouldSerialize() {
258
+ return this.helper.shouldSerialize(this);
259
+ }
260
+ shouldValidate() {
261
+ return this.helper.shouldValidate(this);
262
+ }
263
+ serialize() {
264
+ return new Promise((resolve) => {
265
+ const result = {};
266
+ const serializers = this.mSerializers.map(s => {
267
+ return new Promise(resolve => {
268
+ s.func(s.id, this).then(res => {
269
+ const ctrl = this.getControl(s.id);
270
+ const promise = !ctrl ? Promise.resolve(true) : ctrl.shouldSerialize();
271
+ promise.then(should => {
272
+ if (should)
273
+ result[s.id] = res;
274
+ resolve();
275
+ });
276
+ });
277
+ });
278
+ });
279
+ Promise.all(serializers).then(() => resolve(result));
280
+ });
281
+ }
282
+ onFocus() {
283
+ this.markAsUntouched({ onlySelf: true });
284
+ }
285
+ onBlur() {
286
+ this.markAsTouched({ onlySelf: true });
287
+ }
288
+ showErrors() {
289
+ this.markAsTouched({ onlySelf: true });
290
+ this.mControls.forEach(ctrl => ctrl.showErrors());
291
+ }
292
+ reloadControls() {
293
+ let callback = () => { };
294
+ if (this.initialized === false) {
295
+ this.initialized = true;
296
+ this.loading = true;
297
+ callback = () => {
298
+ this.loading = false;
299
+ // this.cdr.detectChanges();
300
+ const root = this.form.root;
301
+ root.onInit.emit(root);
302
+ root.onStatusChange.emit(root);
303
+ // https://github.com/angular/angular/issues/14542
304
+ const statusTimer = TimerUtils.createInterval();
305
+ statusTimer.set(() => {
306
+ if (this.status == "PENDING")
307
+ return;
308
+ statusTimer.clear();
309
+ root.onStatusChange.emit(root);
310
+ }, 50);
311
+ setTimeout(statusTimer.clear, 5000);
312
+ };
313
+ }
314
+ const promise = new Promise(resolve => {
315
+ this.load().then(() => this.check().then(resolve));
316
+ });
317
+ promise.then(callback, callback);
318
+ return promise;
319
+ }
320
+ setup(model, info) {
321
+ this.mName = info.name || "";
322
+ this.mModel = model;
323
+ this.mControls.forEach(ctrl => this.removeControl(ctrl.id));
324
+ this.mControls = DynamicFormGroup.createFormControls(this, info.controls);
325
+ this.mControls.forEach((ctrl) => this.addControl(ctrl.id, ctrl));
326
+ this.mSerializers = DynamicFormGroup.createFormSerializers(this, info.serializers);
327
+ this.mFieldSets = info.fieldSets ? info.fieldSets.reduce((result, fs) => {
328
+ result[fs.id] = fs;
329
+ return result;
330
+ }, {}) : getFormFieldSets(Object.getPrototypeOf(model).constructor);
331
+ }
332
+ updateModel(control) {
333
+ this.model[control.id] = control.value;
334
+ this.changeTimer.clear();
335
+ this.changeTimer.set(() => {
336
+ this.check().then(() => this.reloadControlsFrom(control, new Set()).then(() => {
337
+ this.form.root.onChange.emit(control);
338
+ }));
339
+ }, 250);
340
+ }
341
+ reloadControlsFrom(control, controls) {
342
+ const data = control.data;
343
+ if (!data || !data.reload)
344
+ return Promise.resolve();
345
+ const reload = ObjectUtils.isArray(data.reload) ? data.reload : [data.reload];
346
+ return Promise.all(reload.map(id => {
347
+ const nextControl = this.getControl(id);
348
+ if (!nextControl || controls.has(nextControl))
349
+ return Promise.resolve();
350
+ controls.add(nextControl);
351
+ return new Promise(resolve => {
352
+ nextControl.load().then(() => {
353
+ this.reloadControlsFrom(nextControl, controls).then(resolve);
354
+ });
355
+ });
356
+ }));
357
+ }
358
+ }
359
+ export class DynamicFormControl extends FormControl {
360
+ constructor(control, group) {
361
+ super(group.model[control.id], { updateOn: control.data.updateOn || group.updateOn });
362
+ this.control = control;
363
+ this.group = group;
364
+ this.group.addControl(control.id, this);
365
+ this.helper = new DynamicFormControlHelper(this.form, control);
366
+ this.helper.findProvider(this);
367
+ this.valueChanges.subscribe(() => this.group.updateModel(this));
368
+ this.setAsyncValidators(createValidator(this));
369
+ }
370
+ get id() {
371
+ return this.helper.id;
372
+ }
373
+ get type() {
374
+ return this.helper.type;
375
+ }
376
+ get data() {
377
+ return this.helper.data;
378
+ }
379
+ get visible() {
380
+ return this.helper.visible;
381
+ }
382
+ get meta() {
383
+ return this.helper.meta;
384
+ }
385
+ get form() {
386
+ return this.group.form;
387
+ }
388
+ get injector() {
389
+ return this.form.injector;
390
+ }
391
+ get label() {
392
+ return this.data.label !== "" ? `${this.group.prefix}${this.data.label}` : "";
393
+ }
394
+ get provider() {
395
+ return this.helper.provider;
396
+ }
397
+ get model() {
398
+ return this.group.model;
399
+ }
400
+ get formId() {
401
+ return this.helper.formId;
402
+ }
403
+ getData() {
404
+ return this.data;
405
+ }
406
+ getControl(id) {
407
+ return null;
408
+ }
409
+ load() {
410
+ return this.helper.load(this);
411
+ }
412
+ check() {
413
+ const check = this.helper.check(this);
414
+ check.then(readonly => {
415
+ if (readonly || this.group.disabled)
416
+ this.disable({ emitEvent: false });
417
+ else
418
+ this.enable({ emitEvent: false });
419
+ });
420
+ return check;
421
+ }
422
+ shouldSerialize() {
423
+ return this.helper.shouldSerialize(this);
424
+ }
425
+ shouldValidate() {
426
+ return this.helper.shouldValidate(this);
427
+ }
428
+ serialize() {
429
+ return Promise.resolve(this.value);
430
+ }
431
+ onFocus() {
432
+ this.markAsUntouched({ onlySelf: true });
433
+ }
434
+ onBlur() {
435
+ this.markAsTouched({ onlySelf: true });
436
+ }
437
+ showErrors() {
438
+ this.markAsTouched({ onlySelf: true });
439
+ }
440
+ }
441
+ // --- Decorator functions ---
442
+ const emptyArray = [];
443
+ const emptyTester = () => {
444
+ return Promise.resolve(false);
445
+ };
446
+ const ɵ0 = emptyTester;
447
+ export function defaultSerializer(id, parent) {
448
+ const control = parent.getControl(id);
449
+ return !control ? Promise.resolve(parent.model[id]) : control.serialize();
450
+ }
451
+ export function FormSerializable(serializer) {
452
+ return (target, propertyKey) => {
453
+ ReflectUtils.defineMetadata("dynamicFormSerializer", serializer || defaultSerializer, target, propertyKey);
454
+ };
455
+ }
456
+ export function FormInput(data) {
457
+ return (target, propertyKey) => {
458
+ const meta = ReflectUtils.getOwnMetadata("design:type", target, propertyKey);
459
+ const type = meta ? meta.name : "";
460
+ let inputType = propertyKey.indexOf("password") < 0 ? "text" : "password";
461
+ switch (type) {
462
+ case "Number":
463
+ inputType = "number";
464
+ break;
465
+ case "Boolean":
466
+ inputType = "checkbox";
467
+ break;
468
+ }
469
+ defineFormControl(target, propertyKey, createFormInput(propertyKey, data, inputType));
470
+ };
471
+ }
472
+ export function FormSelect(data) {
473
+ return (target, propertyKey) => {
474
+ defineFormControl(target, propertyKey, createFormSelect(propertyKey, data));
475
+ };
476
+ }
477
+ export function FormStatic(data) {
478
+ return (target, propertyKey) => {
479
+ defineFormControl(target, propertyKey, createFormStatic(propertyKey, data));
480
+ };
481
+ }
482
+ export function FormModel(data) {
483
+ return (target, propertyKey) => {
484
+ defineFormControl(target, propertyKey, createFormModel(propertyKey, data));
485
+ };
486
+ }
487
+ export function FormFile(data) {
488
+ return (target, propertyKey) => {
489
+ defineFormControl(target, propertyKey, createFormFile(propertyKey, data));
490
+ };
491
+ }
492
+ export function FormFieldSet(data) {
493
+ return (target) => {
494
+ const sets = getFormFieldSets(target);
495
+ data.classes = data.classes || "";
496
+ sets[data.id] = data;
497
+ ReflectUtils.defineMetadata("dynamicFormFieldSets", sets, target);
498
+ };
499
+ }
500
+ export function provideFormGroup(component) {
501
+ return {
502
+ provide: FORM_GROUP_TYPE,
503
+ useValue: component
504
+ };
505
+ }
506
+ export function provideFormControl(component, acceptor, loader, priority = 0) {
507
+ return {
508
+ provide: FORM_CONTROL_PROVIDER,
509
+ multi: true,
510
+ useValue: {
511
+ component: component,
512
+ priority: priority,
513
+ acceptor: acceptor,
514
+ loader: loader
515
+ }
516
+ };
517
+ }
518
+ export function defineFormControl(target, propertyKey, control) {
519
+ ReflectUtils.defineMetadata("dynamicFormControl", control, target, propertyKey);
520
+ }
521
+ export function getFormFieldSets(target) {
522
+ return ReflectUtils.getMetadata("dynamicFormFieldSets", target) || {};
523
+ }
524
+ export function getFormControl(target, propertyKey) {
525
+ return ReflectUtils.getMetadata("dynamicFormControl", target, propertyKey);
526
+ }
527
+ export function getFormSerializer(target, propertyKey) {
528
+ return ReflectUtils.getMetadata("dynamicFormSerializer", target, propertyKey);
529
+ }
530
+ export function createFormControl(id, type, data) {
531
+ data = data || {};
532
+ data.label = ObjectUtils.isNullOrUndefined(data.label) ? id : data.label;
533
+ data.labelAlign = data.labelAlign || "left";
534
+ data.fieldSet = data.fieldSet || UniqueUtils.uuid();
535
+ data.classes = data.classes || "";
536
+ data.readonly = data.readonly || emptyTester;
537
+ data.hidden = data.hidden || emptyTester;
538
+ data.validators = data.validators || emptyArray;
539
+ return {
540
+ id: id,
541
+ type: type,
542
+ data: data
543
+ };
544
+ }
545
+ export function createFormInput(id, data, type = "text") {
546
+ const control = createFormControl(id, "input", data);
547
+ data = control.data;
548
+ data.type = data.type || type;
549
+ data.classes = !data.classes ? `form-group-${data.type}` : `${data.classes} form-group-${data.type}`;
550
+ data.placeholder = data.placeholder || (data.type == "mask" ? "_" : "");
551
+ data.step = data.step || 1;
552
+ data.mask = data.mask || [/\w*/gi];
553
+ return control;
554
+ }
555
+ export function createFormSelect(id, data) {
556
+ const control = createFormControl(id, "select", data);
557
+ data = control.data;
558
+ data.options = data.options || (() => Promise.resolve([]));
559
+ data.type = data.type || "select";
560
+ const classType = data.type == "select" ? "select" : `select-${data.type}`;
561
+ data.classes = !data.classes ? `form-group-${classType}` : `${data.classes} form-group-${classType}`;
562
+ return control;
563
+ }
564
+ export function createFormStatic(id, data) {
565
+ const control = createFormControl(id, "static", data);
566
+ data = control.data;
567
+ data.style = data.style || "table";
568
+ return control;
569
+ }
570
+ export function createFormModel(id, data) {
571
+ const control = createFormControl(id, "model", data);
572
+ data = control.data;
573
+ data.name = data.name || "";
574
+ return control;
575
+ }
576
+ export function createFormFile(id, data) {
577
+ const control = createFormControl(id, "file", data);
578
+ data = control.data;
579
+ data.accept = data.accept || ".jpg,.jpeg,.png";
580
+ data.multi = data.multi || false;
581
+ data.baseUrl = ObjectUtils.isString(data.baseUrl) ? data.baseUrl : "assets/";
582
+ data.uploadUrl = ObjectUtils.isString(data.uploadUrl) ? data.uploadUrl : "assets";
583
+ data.createUploadData = data.createUploadData || ((file) => {
584
+ const form = new FormData();
585
+ form.append("file", file);
586
+ return form;
587
+ });
588
+ return control;
589
+ }
590
+ export { ɵ0 };
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IkQ6L1dvcmsvbmd4LWR5bmFtaWMtZm9ybS9zcmMvIiwic291cmNlcyI6WyJuZ3gtZHluYW1pYy1mb3JtL2NvbW1vbi10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFdBQVcsRUFBRSxjQUFjLEVBQThDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQWtCLFdBQVcsRUFBRSxTQUFTLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUlILFdBQVcsRUFDWCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFFZCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBZ0QsSUFBSSxjQUFjLENBQThCLHFCQUFxQixDQUFDLENBQUM7QUFDbkosTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXlDLElBQUksY0FBYyxDQUF1Qix1QkFBdUIsQ0FBQyxDQUFDO0FBYTdJLE1BQU0sT0FBZ0Isb0JBQW9CO0lBSXRDLElBQUksSUFBSTtRQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLENB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QUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxJQUFVLEVBQUUsRUFBRTtRQUM3RCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IsIFRlbXBsYXRlUmVmLCBUeXBlLCBWYWx1ZVByb3ZpZGVyLCBEaXJlY3RpdmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJUmVzb2x2ZUZhY3RvcnksXHJcbiAgICBJVGltZXIsXHJcbiAgICBJQXN5bmNNZXNzYWdlLFxyXG4gICAgT2JqZWN0VXRpbHMsXHJcbiAgICBSZWZsZWN0VXRpbHMsXHJcbiAgICBUaW1lclV0aWxzLFxyXG4gICAgVW5pcXVlVXRpbHMsXHJcbiAgICBJUmVxdWVzdE9wdGlvbnNcclxufSBmcm9tIFwiQHN0ZW15L25neC11dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IEZPUk1fR1JPVVBfVFlQRTogSW5qZWN0aW9uVG9rZW48VHlwZTxJRm9ybUNvbnRyb2xDb21wb25lbnQ+PiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUeXBlPElGb3JtQ29udHJvbENvbXBvbmVudD4+KFwiZm9ybS1ncm91cC1wcm92aWRlclwiKTtcclxuZXhwb3J0IGNvbnN0IEZPUk1fQ09OVFJPTF9QUk9WSURFUjogSW5qZWN0aW9uVG9rZW48SUZvcm1Db250cm9sUHJvdmlkZXI+ID0gbmV3IEluamVjdGlvblRva2VuPElGb3JtQ29udHJvbFByb3ZpZGVyPihcImZvcm0tY29udHJvbC1wcm92aWRlclwiKTtcclxuXHJcbi8vIC0tLSBCYXNpYyBmb3JtIGNvbnRyb2wgaW50ZXJmYWNlcyAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybUNvbnRyb2xDb21wb25lbnQge1xyXG4gICAgY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybUdyb3VwQ29tcG9uZW50IHtcclxuICAgIGZvcm06IElEeW5hbWljRm9ybTtcclxuICAgIGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2w7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUNvbnRyb2xDb21wb25lbnQ8VCBleHRlbmRzIElGb3JtQ29udHJvbERhdGE+IGltcGxlbWVudHMgSUZvcm1Db250cm9sQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sO1xyXG5cclxuICAgIGdldCBmb3JtKCk6IElEeW5hbWljRm9ybUJhc2Uge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5jb250cm9sID8gbnVsbDogdGhpcy5jb250cm9sLmZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGEoKTogVCB7XHJcbiAgICAgICAgcmV0dXJuIDxUPighdGhpcy5jb250cm9sID8ge30gOiB0aGlzLmNvbnRyb2wuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyBudWxsIDogdGhpcy5jb250cm9sLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtZXRhKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyBudWxsIDogdGhpcy5jb250cm9sLm1ldGE7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuZm9ybS1pbnB1dFwiKVxyXG4gICAgZ2V0IGlucHV0Q2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElGb3JtQ29udHJvbFByb3ZpZGVyQWNjZXB0b3IgPSAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gYm9vbGVhbjtcclxuZXhwb3J0IHR5cGUgSUZvcm1Db250cm9sUHJvdmlkZXJMb2FkZXIgPSAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxhbnk+O1xyXG5leHBvcnQgdHlwZSBJRm9ybUNvbnRyb2xPcHRpb25zID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8SUZvcm1Db250cm9sT3B0aW9uW10+O1xyXG5leHBvcnQgdHlwZSBJRm9ybUNvbnRyb2xTZXJpYWxpemVyID0gKGlkOiBzdHJpbmcsIHBhcmVudDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxhbnk+O1xyXG5leHBvcnQgdHlwZSBJRm9ybUlucHV0TWFzayA9IHN0cmluZyB8IFJlZ0V4cDtcclxuZXhwb3J0IHR5cGUgSUZvcm1JbnB1dE1hc2tGdW5jdGlvbiA9IChyYXc6IHN0cmluZykgPT4gSUZvcm1JbnB1dE1hc2tbXTtcclxuZXhwb3J0IHR5cGUgSUZvcm1JbnB1dFVuTWFza0Z1bmN0aW9uID0gKHZhbHVlOiBzdHJpbmcpID0+IGFueTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Db250cm9sUHJvdmlkZXIge1xyXG4gICAgY29tcG9uZW50OiBUeXBlPElGb3JtQ29udHJvbENvbXBvbmVudD47XHJcbiAgICBwcmlvcml0eTogbnVtYmVyO1xyXG4gICAgYWNjZXB0b3I6IElGb3JtQ29udHJvbFByb3ZpZGVyQWNjZXB0b3I7XHJcbiAgICBsb2FkZXI6IElGb3JtQ29udHJvbFByb3ZpZGVyTG9hZGVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtU2VyaWFsaXplciB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgZnVuYzogSUZvcm1Db250cm9sU2VyaWFsaXplcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybVNlcmlhbGl6ZXJzIHtcclxuICAgIFtpZDogc3RyaW5nXTogSUZvcm1Db250cm9sU2VyaWFsaXplciB8IElSZXNvbHZlRmFjdG9yeSB8IG51bGxcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRHluYW1pY0Zvcm1TdGF0ZSA9IFwiVkFMSURcIiB8IFwiSU5WQUxJRFwiIHwgXCJQRU5ESU5HXCIgfCBcIkRJU0FCTEVEXCIgfCBcIkxPQURJTkdcIjtcclxuZXhwb3J0IHR5cGUgRHluYW1pY0Zvcm1VcGRhdGVPbiA9IFwiY2hhbmdlXCIgfCBcImJsdXJcIiB8IFwic3VibWl0XCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybUNvbnRyb2wge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIGRhdGE6IElGb3JtQ29udHJvbERhdGE7XHJcbiAgICB2aXNpYmxlOiBib29sZWFuO1xyXG4gICAgbWV0YTogYW55O1xyXG4gICAgZm9ybTogSUR5bmFtaWNGb3JtQmFzZTtcclxuICAgIGluamVjdG9yOiBJbmplY3RvcjtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICBwcm92aWRlcjogSUZvcm1Db250cm9sUHJvdmlkZXI7XHJcbiAgICBtb2RlbDogYW55O1xyXG4gICAgZm9ybUlkOiBzdHJpbmc7XHJcblxyXG4gICAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xyXG4gICAgdmFsdWU6IGFueTtcclxuICAgIHRvdWNoZWQ6IGJvb2xlYW47XHJcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAgIHVwZGF0ZU9uOiBEeW5hbWljRm9ybVVwZGF0ZU9uO1xyXG5cclxuICAgIHNldFZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkO1xyXG5cclxuICAgIGdldERhdGE8VCBleHRlbmRzIElGb3JtQ29udHJvbERhdGE+KCk6IFQ7XHJcbiAgICBnZXRDb250cm9sKGlkOiBzdHJpbmcpOiBJRHluYW1pY0Zvcm1Db250cm9sO1xyXG4gICAgbG9hZCgpOiBQcm9taXNlPGFueT47XHJcbiAgICBjaGVjaygpOiBQcm9taXNlPGFueT47XHJcbiAgICBzaG91bGRTZXJpYWxpemUoKTogUHJvbWlzZTxib29sZWFuPjtcclxuICAgIHNob3VsZFZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgICBzZXJpYWxpemUoKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgb25Gb2N1cygpOiB2b2lkO1xyXG4gICAgb25CbHVyKCk6IHZvaWQ7XHJcbiAgICBzaG93RXJyb3JzKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVZhbGlkYXRvcihjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKTogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzPiB7XHJcbiAgICBjb25zdCBkYXRhID0gY29udHJvbC5kYXRhIHx8IHt9O1xyXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtkYXRhLnZhbGlkYXRvcl0uY29uY2F0KGRhdGEudmFsaWRhdG9ycyB8fCBbXSkuZmlsdGVyKE9iamVjdFV0aWxzLmlzRGVmaW5lZCkubWFwKHYgPT4ge1xyXG4gICAgICAgIHJldHVybiBSZWZsZWN0VXRpbHMucmVzb2x2ZTxGb3JtQ29udHJvbFZhbGlkYXRvcj4odiwgY29udHJvbC5pbmplY3Rvcik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAoY3RybDogYW55KSA9PiBuZXcgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8SUR5bmFtaWNGb3JtQ29udHJvbD5jdHJsO1xyXG4gICAgICAgIGNvbnRyb2wuc2hvdWxkVmFsaWRhdGUoKS50aGVuKHNob3VsZCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlID0gdmFsaWRhdG9ycy5tYXAodiA9PiB2KGNvbnRyb2wpKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YVZhbGlkYXRvciA9IGNvbnRyb2wubWV0YS52YWxpZGF0b3I7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKG1ldGFWYWxpZGF0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZS5wdXNoKG1ldGFWYWxpZGF0b3IoY29udHJvbCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHZhbGlkYXRlKS50aGVuKHJlc3VsdHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKGVycm9yID0+IE9iamVjdFV0aWxzLmlzT2JqZWN0KGVycm9yKSB8fCBPYmplY3RVdGlscy5pc1N0cmluZyhlcnJvcikpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogVmFsaWRhdGlvbkVycm9ycyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzU3RyaW5nKGVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2Vycm9yXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24ocmVzdWx0LCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmNsYXNzIER5bmFtaWNGb3JtQ29udHJvbEhlbHBlciB7XHJcblxyXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyBudWxsIDogdGhpcy5jb250cm9sLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyBcIlwiIDogdGhpcy5jb250cm9sLnR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGEoKTogSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRyb2wgPyB0aGlzLmR1bW15RGF0YSA6IHRoaXMuY29udHJvbC5kYXRhIHx8IHRoaXMuZHVtbXlEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5oaWRkZW47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb3ZpZGVyKCk6IElGb3JtQ29udHJvbFByb3ZpZGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHJsUHJvdmlkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm1JZDogc3RyaW5nO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG1ldGE6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIGhpZGRlbjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgY3RybFByb3ZpZGVyOiBJRm9ybUNvbnRyb2xQcm92aWRlcjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHVtbXlEYXRhOiBJRm9ybUNvbnRyb2xEYXRhO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkb25seVRlc3RlcjogKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZGVUZXN0ZXI6IChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemVUZXN0ZXI6IChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0ZVRlc3RlcjogKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8Ym9vbGVhbj47XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtOiBJRHluYW1pY0Zvcm1CYXNlLCBwcml2YXRlIGNvbnRyb2w6IElGb3JtQ29udHJvbCA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmZvcm1JZCA9IFVuaXF1ZVV0aWxzLnV1aWQoKTtcclxuICAgICAgICB0aGlzLm1ldGEgPSB7fTtcclxuICAgICAgICB0aGlzLmhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZHVtbXlEYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5yZWFkb25seVRlc3RlciA9IHRoaXMuY3JlYXRlVGVzdGVyKFwicmVhZG9ubHlcIik7XHJcbiAgICAgICAgdGhpcy5oaWRlVGVzdGVyID0gdGhpcy5jcmVhdGVUZXN0ZXIoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgdGhpcy5zZXJpYWxpemVUZXN0ZXIgPSB0aGlzLmNyZWF0ZVRlc3RlcihcInNob3VsZFNlcmlhbGl6ZVwiLCAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbnRyb2wudmlzaWJsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZVRlc3RlciA9IHRoaXMuY3JlYXRlVGVzdGVyKFwic2hvdWxkVmFsaWRhdGVcIiwgKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb250cm9sLnZpc2libGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWQoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmN0cmxQcm92aWRlciA/IFByb21pc2UucmVzb2x2ZSgpIDogdGhpcy5jdHJsUHJvdmlkZXIubG9hZGVyKGNvbnRyb2wpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlVGVzdGVyKGNvbnRyb2wpLnRoZW4oaGlkZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGhpZGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5VGVzdGVyKGNvbnRyb2wpLnRoZW4ocmVhZG9ubHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29udHJvbC5mb3JtLnJlYWRvbmx5IHx8IHJlYWRvbmx5KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRTZXJpYWxpemUoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVRlc3Rlcihjb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRWYWxpZGF0ZShjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUZXN0ZXIoY29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmluZFByb3ZpZGVyKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN0cmxQcm92aWRlciA9ICF0aGlzLmNvbnRyb2wgfHwgIXRoaXMuY29udHJvbC50eXBlID8gbnVsbCA6IHRoaXMuZm9ybS5maW5kUHJvdmlkZXIoY29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVUZXN0ZXIodGVzdDogc3RyaW5nLCBkZWZhdWx0RnVuYzogRm9ybUNvbnRyb2xUZXN0ZXIgPSBudWxsKTogKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHRlc3RlcjogRm9ybUNvbnRyb2xUZXN0ZXIgPSB0aGlzLmRhdGFbdGVzdF1cclxuICAgICAgICAgICAgPyBSZWZsZWN0VXRpbHMucmVzb2x2ZTxGb3JtQ29udHJvbFRlc3Rlcj4odGhpcy5kYXRhW3Rlc3RdLCB0aGlzLmZvcm0uaW5qZWN0b3IpXHJcbiAgICAgICAgICAgIDogKGRlZmF1bHRGdW5jIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKSk7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKTogUHJvbWlzZTxib29sZWFuPiA9PiB0ZXN0ZXIoY29udHJvbCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUdyb3VwIGV4dGVuZHMgRm9ybUdyb3VwIGltcGxlbWVudHMgSUR5bmFtaWNGb3JtQ29udHJvbCB7XHJcblxyXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLnR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGEoKTogSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLnZpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1ldGEoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIubWV0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3Ige1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uaW5qZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sYWJlbCAhPT0gXCJcIiA/IGAke3RoaXMucHJlZml4fSR7dGhpcy5kYXRhLmxhYmVsfWAgOiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm92aWRlcigpOiBJRm9ybUNvbnRyb2xQcm92aWRlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLnByb3ZpZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2RlbCgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1Nb2RlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9ybUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmZvcm1JZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9ybUNvbnRyb2xzKCk6IElEeW5hbWljRm9ybUNvbnRyb2xbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubUNvbnRyb2xzIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb3JtRmllbGRzKCk6IElEeW5hbWljRm9ybUZpZWxkU2V0cyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubUZpZWxkU2V0cyB8fCB7fTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJlZml4KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5hbWUgPyBcIlwiIDogYCR7dGhpcy5uYW1lfS5gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubU5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHN0YXRlKCk6IER5bmFtaWNGb3JtU3RhdGUge1xyXG4gICAgICAgIHJldHVybiA8RHluYW1pY0Zvcm1TdGF0ZT4odGhpcy5sb2FkaW5nID8gXCJMT0FESU5HXCIgOiB0aGlzLnN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoZWxwZXI6IER5bmFtaWNGb3JtQ29udHJvbEhlbHBlcjtcclxuICAgIHByaXZhdGUgbU5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgbU1vZGVsOiBhbnk7XHJcbiAgICBwcml2YXRlIG1Db250cm9sczogSUR5bmFtaWNGb3JtQ29udHJvbFtdO1xyXG4gICAgcHJpdmF0ZSBtU2VyaWFsaXplcnM6IElGb3JtU2VyaWFsaXplcltdO1xyXG4gICAgcHJpdmF0ZSBtRmllbGRTZXRzOiBJRHluYW1pY0Zvcm1GaWVsZFNldHM7XHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBsb2FkaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2VUaW1lcjogSVRpbWVyO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUZvcm1Db250cm9scyhncm91cDogRHluYW1pY0Zvcm1Hcm91cCwgY29udHJvbHM6IElGb3JtQ29udHJvbFtdKTogSUR5bmFtaWNGb3JtQ29udHJvbFtdIHtcclxuICAgICAgICBpZiAoIWNvbnRyb2xzICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KGdyb3VwLm1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGdyb3VwLm1vZGVsKTtcclxuICAgICAgICAgICAgY29udHJvbHMgPSBwcm9wcy5tYXAoaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1Db250cm9sKGdyb3VwLm1vZGVsLCBpZCk7XHJcbiAgICAgICAgICAgIH0pLmZpbHRlcihPYmplY3RVdGlscy5pc0RlZmluZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbnRyb2xzKSByZXR1cm4gW107XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzLm1hcChjdHJsID0+IHtcclxuICAgICAgICAgICAgaWYgKGN0cmwudHlwZSA9PSBcIm1vZGVsXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IER5bmFtaWNGb3JtR3JvdXAoZ3JvdXAuZm9ybSwgY3RybCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGdyb3VwLm1vZGVsW2N0cmwuaWRdIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHN1Ykdyb3VwLmdldERhdGE8SUZvcm1Nb2RlbERhdGE+KCk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5hbWUgPSBkYXRhLm5hbWUgfHwgZ3JvdXAubmFtZTtcclxuICAgICAgICAgICAgICAgIHN1Ykdyb3VwLnNldHVwKG1vZGVsLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIGdyb3VwLm1vZGVsW2N0cmwuaWRdID0gbW9kZWw7XHJcbiAgICAgICAgICAgICAgICBncm91cC5hZGRDb250cm9sKHN1Ykdyb3VwLmlkLCBzdWJHcm91cCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViR3JvdXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUNvbnRyb2woY3RybCwgZ3JvdXApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUZvcm1TZXJpYWxpemVycyhncm91cDogRHluYW1pY0Zvcm1Hcm91cCwgc2VyaWFsaXplcnM6IElGb3JtU2VyaWFsaXplcnMpOiBJRm9ybVNlcmlhbGl6ZXJbXSB7XHJcbiAgICAgICAgaWYgKCFzZXJpYWxpemVycyAmJiBPYmplY3RVdGlscy5pc09iamVjdChncm91cC5tb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhncm91cC5tb2RlbCk7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6ZXJzID0gcHJvcHMucmVkdWNlKChyZXN1bHQsIGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gZ2V0Rm9ybVNlcmlhbGl6ZXIoZ3JvdXAubW9kZWwsIGlkKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VyaWFsaXplcikgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpZF0gPSBzZXJpYWxpemVyO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlcmlhbGl6ZXJzKSByZXR1cm4gW107XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlcmlhbGl6ZXJzKS5tYXAoaWQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gc2VyaWFsaXplcnNbaWRdIHx8IGRlZmF1bHRTZXJpYWxpemVyO1xyXG4gICAgICAgICAgICByZXR1cm4gIXNlcmlhbGl6ZXIgPyBudWxsIDoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogUmVmbGVjdFV0aWxzLnJlc29sdmU8SUZvcm1Db250cm9sU2VyaWFsaXplcj4oc2VyaWFsaXplciwgZ3JvdXAuaW5qZWN0b3IpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGZvcm06IElEeW5hbWljRm9ybUJhc2UsIGNvbnRyb2w6IElGb3JtQ29udHJvbCA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcih7fSwge3VwZGF0ZU9uOiAoKCFjb250cm9sIHx8ICFjb250cm9sLmRhdGEpID8gbnVsbCA6IGNvbnRyb2wuZGF0YS51cGRhdGVPbikgfHwgZm9ybS51cGRhdGVPbiB8fCBcImJsdXJcIn0pO1xyXG4gICAgICAgIHRoaXMubU5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMubU1vZGVsID0ge307XHJcbiAgICAgICAgdGhpcy5tQ29udHJvbHMgPSBbXTtcclxuICAgICAgICB0aGlzLm1TZXJpYWxpemVycyA9IFtdO1xyXG4gICAgICAgIHRoaXMubUZpZWxkU2V0cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaGVscGVyID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEhlbHBlcihmb3JtLCBjb250cm9sKTtcclxuICAgICAgICB0aGlzLmhlbHBlci5maW5kUHJvdmlkZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVGltZXIgPSBUaW1lclV0aWxzLmNyZWF0ZVRpbWVvdXQoKTtcclxuICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuZm9ybS5yb290O1xyXG4gICAgICAgICAgICByb290Lm9uU3RhdHVzQ2hhbmdlLmVtaXQocm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zZXRBc3luY1ZhbGlkYXRvcnMoY3JlYXRlVmFsaWRhdG9yKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhPFQgZXh0ZW5kcyBJRm9ybUNvbnRyb2xEYXRhPigpOiBUIHtcclxuICAgICAgICByZXR1cm4gPFQ+dGhpcy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbnRyb2woaWQ6IHN0cmluZyk6IElEeW5hbWljRm9ybUNvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiA8YW55PnRoaXMuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLm1Db250cm9scy5tYXAoYyA9PiBjLmxvYWQoKSk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmhlbHBlci5sb2FkKHRoaXMpKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVscGVyLmNoZWNrKHRoaXMpLnRoZW4ocmVhZG9ubHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRvbmx5KSB0aGlzLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTsgZWxzZSB0aGlzLmVuYWJsZSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLm1Db250cm9scy5tYXAoYyA9PiBjLmNoZWNrKCkpO1xyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkU2VyaWFsaXplKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRTZXJpYWxpemUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkVmFsaWRhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLnNob3VsZFZhbGlkYXRlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlcmlhbGl6ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVycyA9IHRoaXMubVNlcmlhbGl6ZXJzLm1hcChzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHMuZnVuYyhzLmlkLCB0aGlzKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmdldENvbnRyb2wocy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSAhY3RybCA/IFByb21pc2UucmVzb2x2ZSh0cnVlKSA6IGN0cmwuc2hvdWxkU2VyaWFsaXplKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihzaG91bGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZCkgcmVzdWx0W3MuaWRdID0gcmVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoc2VyaWFsaXplcnMpLnRoZW4oKCkgPT4gcmVzb2x2ZShyZXN1bHQpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWFya0FzVW50b3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmx1cigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9ycygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICAgICAgdGhpcy5tQ29udHJvbHMuZm9yRWFjaChjdHJsID0+IGN0cmwuc2hvd0Vycm9ycygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWRDb250cm9scygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGxldCBjYWxsYmFjayA9ICgpID0+IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZvcm0ucm9vdDtcclxuICAgICAgICAgICAgICAgIHJvb3Qub25Jbml0LmVtaXQocm9vdCk7XHJcbiAgICAgICAgICAgICAgICByb290Lm9uU3RhdHVzQ2hhbmdlLmVtaXQocm9vdCk7XHJcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDU0MlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzVGltZXIgPSBUaW1lclV0aWxzLmNyZWF0ZUludGVydmFsKCk7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNUaW1lci5zZXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSBcIlBFTkRJTkdcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RpbWVyLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5vblN0YXR1c0NoYW5nZS5lbWl0KHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChzdGF0dXNUaW1lci5jbGVhciwgNTAwMCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCgpID0+IHRoaXMuY2hlY2soKS50aGVuKHJlc29sdmUpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLnRoZW4oY2FsbGJhY2ssIGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cChtb2RlbDogYW55LCBpbmZvOiBJRHluYW1pY0Zvcm1JbmZvKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tTmFtZSA9IGluZm8ubmFtZSB8fCBcIlwiO1xyXG4gICAgICAgIHRoaXMubU1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5tQ29udHJvbHMuZm9yRWFjaChjdHJsID0+IHRoaXMucmVtb3ZlQ29udHJvbChjdHJsLmlkKSk7XHJcbiAgICAgICAgdGhpcy5tQ29udHJvbHMgPSBEeW5hbWljRm9ybUdyb3VwLmNyZWF0ZUZvcm1Db250cm9scyh0aGlzLCBpbmZvLmNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLm1Db250cm9scy5mb3JFYWNoKChjdHJsOiBhbnkpID0+IHRoaXMuYWRkQ29udHJvbChjdHJsLmlkLCBjdHJsKSk7XHJcbiAgICAgICAgdGhpcy5tU2VyaWFsaXplcnMgPSBEeW5hbWljRm9ybUdyb3VwLmNyZWF0ZUZvcm1TZXJpYWxpemVycyh0aGlzLCBpbmZvLnNlcmlhbGl6ZXJzKTtcclxuICAgICAgICB0aGlzLm1GaWVsZFNldHMgPSBpbmZvLmZpZWxkU2V0cyA/IGluZm8uZmllbGRTZXRzLnJlZHVjZSgocmVzdWx0LCBmcykgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRbZnMuaWRdID0gZnM7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSwge30pIDogZ2V0Rm9ybUZpZWxkU2V0cyhPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpLmNvbnN0cnVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVNb2RlbChjb250cm9sOiBJRHluYW1pY0Zvcm1Db250cm9sKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tb2RlbFtjb250cm9sLmlkXSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUaW1lci5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVGltZXIuc2V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jaGVjaygpLnRoZW4oKCkgPT4gdGhpcy5yZWxvYWRDb250cm9sc0Zyb20oY29udHJvbCwgbmV3IFNldDxJRHluYW1pY0Zvcm1Db250cm9sPigpKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yb290Lm9uQ2hhbmdlLmVtaXQoY29udHJvbCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVsb2FkQ29udHJvbHNGcm9tKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wsIGNvbnRyb2xzPzogU2V0PElEeW5hbWljRm9ybUNvbnRyb2w+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gY29udHJvbC5kYXRhO1xyXG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5yZWxvYWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBjb25zdCByZWxvYWQgPSBPYmplY3RVdGlscy5pc0FycmF5KGRhdGEucmVsb2FkKSA/IGRhdGEucmVsb2FkIDogW2RhdGEucmVsb2FkXTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVsb2FkLm1hcChpZCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb250cm9sID0gdGhpcy5nZXRDb250cm9sKGlkKTtcclxuICAgICAgICAgICAgaWYgKCFuZXh0Q29udHJvbCB8fCBjb250cm9scy5oYXMobmV4dENvbnRyb2wpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIGNvbnRyb2xzLmFkZChuZXh0Q29udHJvbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgbmV4dENvbnRyb2wubG9hZCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkQ29udHJvbHNGcm9tKG5leHRDb250cm9sLCBjb250cm9scykudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db250cm9sIGV4dGVuZHMgRm9ybUNvbnRyb2wgaW1wbGVtZW50cyBJRHluYW1pY0Zvcm1Db250cm9sIHtcclxuXHJcbiAgICBnZXQgaWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIudHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGF0YSgpOiBJRm9ybUNvbnRyb2xEYXRhIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIudmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YSgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5tZXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb3JtKCk6IElEeW5hbWljRm9ybUJhc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwLmZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGluamVjdG9yKCk6IEluamVjdG9yIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmluamVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGFiZWwgIT09IFwiXCIgPyBgJHt0aGlzLmdyb3VwLnByZWZpeH0ke3RoaXMuZGF0YS5sYWJlbH1gIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvdmlkZXIoKTogSUZvcm1Db250cm9sUHJvdmlkZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5wcm92aWRlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZWwoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cC5tb2RlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9ybUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVyLmZvcm1JZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhlbHBlcjogRHluYW1pY0Zvcm1Db250cm9sSGVscGVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udHJvbDogSUZvcm1Db250cm9sLCBwdWJsaWMgcmVhZG9ubHkgZ3JvdXA6IER5bmFtaWNGb3JtR3JvdXApIHtcclxuICAgICAgICBzdXBlcihncm91cC5tb2RlbFtjb250cm9sLmlkXSwge3VwZGF0ZU9uOiBjb250cm9sLmRhdGEudXBkYXRlT24gfHwgZ3JvdXAudXBkYXRlT259KTtcclxuICAgICAgICB0aGlzLmdyb3VwLmFkZENvbnRyb2woY29udHJvbC5pZCwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgRHluYW1pY0Zvcm1Db250cm9sSGVscGVyKHRoaXMuZm9ybSwgY29udHJvbCk7XHJcbiAgICAgICAgdGhpcy5oZWxwZXIuZmluZFByb3ZpZGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmdyb3VwLnVwZGF0ZU1vZGVsKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnNldEFzeW5jVmFsaWRhdG9ycyhjcmVhdGVWYWxpZGF0b3IodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGE8VCBleHRlbmRzIElGb3JtQ29udHJvbERhdGE+KCk6IFQge1xyXG4gICAgICAgIHJldHVybiA8VD50aGlzLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udHJvbChpZDogc3RyaW5nKTogSUR5bmFtaWNGb3JtQ29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5sb2FkKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2sgPSB0aGlzLmhlbHBlci5jaGVjayh0aGlzKTtcclxuICAgICAgICBjaGVjay50aGVuKHJlYWRvbmx5ID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlYWRvbmx5IHx8IHRoaXMuZ3JvdXAuZGlzYWJsZWQpIHRoaXMuZGlzYWJsZSh7ZW1pdEV2ZW50OiBmYWxzZX0pOyBlbHNlIHRoaXMuZW5hYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZFNlcmlhbGl6ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXIuc2hvdWxkU2VyaWFsaXplKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZFZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhlbHBlci5zaG91bGRWYWxpZGF0ZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tYXJrQXNVbnRvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RXJyb3JzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybUNvbnRyb2wge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIHZpc2libGU/OiBib29sZWFuO1xyXG4gICAgZGF0YT86IElGb3JtQ29udHJvbERhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICBsYWJlbD86IHN0cmluZztcclxuICAgIGxhYmVsQWxpZ24/OiBzdHJpbmc7XHJcbiAgICBmaWVsZFNldD86IHN0cmluZztcclxuICAgIGNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICByZWFkb25seT86IEZvcm1Db250cm9sVGVzdGVyRmFjdG9yeTtcclxuICAgIGhpZGRlbj86IEZvcm1Db250cm9sVGVzdGVyRmFjdG9yeTtcclxuICAgIHNob3VsZFNlcmlhbGl6ZT86IEZvcm1Db250cm9sVGVzdGVyRmFjdG9yeTtcclxuICAgIHNob3VsZFZhbGlkYXRlPzogRm9ybUNvbnRyb2xUZXN0ZXJGYWN0b3J5O1xyXG4gICAgdmFsaWRhdG9yPzogRm9ybUNvbnRyb2xWYWxpZGF0b3JGYWN0b3J5O1xyXG4gICAgdmFsaWRhdG9ycz86IEZvcm1Db250cm9sVmFsaWRhdG9yRmFjdG9yeVtdO1xyXG4gICAgdXBkYXRlT24/OiBEeW5hbWljRm9ybVVwZGF0ZU9uO1xyXG4gICAgcmVsb2FkPzogc3RyaW5nIHwgc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1JbnB1dERhdGEgZXh0ZW5kcyBJRm9ybUNvbnRyb2xEYXRhIHtcclxuICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICBhdXRvY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICAgIHVzZUxhbmd1YWdlPzogYm9vbGVhbjtcclxuICAgIG1hc2s/OiBJRm9ybUlucHV0TWFza0Z1bmN0aW9uIHwgSUZvcm1JbnB1dE1hc2tbXTtcclxuICAgIHVubWFzaz86IElGb3JtSW5wdXRVbk1hc2tGdW5jdGlvbjtcclxuICAgIHN0ZXA/OiBudW1iZXI7XHJcbiAgICBtaW4/OiBudW1iZXI7XHJcbiAgICBtYXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1TZWxlY3REYXRhIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICBvcHRpb25zPzogSUZvcm1Db250cm9sT3B0aW9ucyB8IElSZXNvbHZlRmFjdG9yeTtcclxuICAgIGVtcHR5T3B0aW9uPzogYm9vbGVhbjtcclxuICAgIHR5cGU/OiBzdHJpbmc7XHJcbiAgICBtdWx0aT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1TdGF0aWNEYXRhIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW107XHJcbiAgICBzdHlsZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybUZpbGVEYXRhIGV4dGVuZHMgSUZvcm1Db250cm9sRGF0YSB7XHJcbiAgICBhY2NlcHQ/OiBzdHJpbmc7XHJcbiAgICBtdWx0aT86IGJvb2xlYW47XHJcbiAgICBiYXNlVXJsPzogc3RyaW5nO1xyXG4gICAgYXNGaWxlPzogYm9vbGVhbjtcclxuICAgIGFzRGF0YVVybD86IGJvb2xlYW47XHJcbiAgICB1cGxvYWRVcmw/OiBzdHJpbmc7XHJcbiAgICB1cGxvYWRPcHRpb25zPzogSVJlcXVlc3RPcHRpb25zO1xyXG4gICAgY3JlYXRlVXBsb2FkRGF0YT86IChmaWxlOiBGaWxlKSA9PiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1Nb2RlbERhdGEgZXh0ZW5kcyBJRm9ybUNvbnRyb2xEYXRhLCBJRHluYW1pY0Zvcm1JbmZvIHtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1GaWVsZFNldCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgY2xhc3Nlcz86IHN0cmluZztcclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgdGl0bGVDbGFzc2VzPzogc3RyaW5nO1xyXG4gICAgc2V0Q2xhc3Nlcz86IHN0cmluZztcclxuICAgIGNvbnRyb2xDbGFzc2VzPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb3JtQ29udHJvbE9wdGlvbiB7XHJcbiAgICBpZDogYW55O1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHNlbGVjdGFibGU/OiBib29sZWFuO1xyXG59XHJcblxyXG4vLyAtLS0gQmFzaWMgZm9ybSBpbnRlcmZhY2VzIC0tLVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY0Zvcm1UZW1wbGF0ZXMge1xyXG4gICAgW2lkOiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybUNvbmZpZyB7XHJcbiAgICBwYXRoPzogc3RyaW5nIHwgbnVtYmVyIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBjbGFzc2VzPzogc3RyaW5nO1xyXG4gICAgZm9ybUNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICBpbm5lckZvcm1DbGFzc2VzPzogc3RyaW5nO1xyXG4gICAgaWQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY1NpbmdsZUZvcm1Db25maWcgZXh0ZW5kcyBJRHluYW1pY0Zvcm1Db25maWcsIElEeW5hbWljRm9ybUluZm8ge1xyXG4gICAgZGF0YTogYW55O1xyXG4gICAgY29udHJvbERhdGE/OiBJRm9ybUNvbnRyb2xEYXRhO1xyXG4gICAgbXVsdGk/OiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRHluYW1pY011bHRpRm9ybUNvbmZpZyBleHRlbmRzIElEeW5hbWljRm9ybUNvbmZpZyB7XHJcbiAgICBkYXRhOiBJRHluYW1pY0Zvcm1zQ29uZmlncztcclxuICAgIG11bHRpOiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRHluYW1pY0Zvcm1zQ29uZmlncyA9IEFycmF5PElEeW5hbWljU2luZ2xlRm9ybUNvbmZpZyB8IElEeW5hbWljTXVsdGlGb3JtQ29uZmlnPjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNGb3JtQmFzZSB7XHJcblxyXG4gICAgbmFtZT86IHN0cmluZztcclxuICAgIHJlYWRvbmx5PzogYm9vbGVhbjtcclxuICAgIHVwZGF0ZU9uPzogXCJjaGFuZ2VcIiB8IFwiYmx1clwiIHwgXCJzdWJtaXRcIjtcclxuICAgIGNsYXNzZXM6IHN0cmluZztcclxuICAgIHBhcmVudDogSUR5bmFtaWNGb3JtQmFzZTtcclxuXHJcbiAgICB3cmFwcGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBmaWVsZFNldFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgY29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIGNvbnRyb2xUZW1wbGF0ZXM6IElEeW5hbWljRm9ybVRlbXBsYXRlcztcclxuICAgIGxhYmVsVGVtcGxhdGVzOiBJRHluYW1pY0Zvcm1UZW1wbGF0ZXM7XHJcbiAgICBpbnB1dFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xyXG4gICAgcHJlZml4VGVtcGxhdGVzOiBJRHluYW1pY0Zvcm1UZW1wbGF0ZXM7XHJcbiAgICBzdWZmaXhUZW1wbGF0ZXM6IElEeW5hbWljRm9ybVRlbXBsYXRlcztcclxuICAgIHNldFByZWZpeFRlbXBsYXRlczogSUR5bmFtaWNGb3JtVGVtcGxhdGVzO1xyXG4gICAgc2V0U3VmZml4VGVtcGxhdGVzOiBJRHluYW1pY0Zvcm1UZW1wbGF0ZXM7XHJcblxyXG4gICAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm1Db250cm9sPjtcclxuICAgIG9uU3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SUR5bmFtaWNGb3JtQmFzZT47XHJcbiAgICBvbkluaXQ6IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm1CYXNlPjtcclxuICAgIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8SUR5bmFtaWNGb3JtQmFzZT47XHJcblxyXG4gICAgcm9vdD86IElEeW5hbWljRm9ybUJhc2U7XHJcbiAgICBzdGF0dXM6IER5bmFtaWNGb3JtU3RhdGU7XHJcbiAgICBpbmplY3Rvcj86IEluamVjdG9yO1xyXG4gICAgY2RyPzogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gICAgdmFsaWRhdGUoc2hvd0Vycm9ycz86IGJvb2xlYW4pOiBQcm9taXNlPGFueT47XHJcblxyXG4gICAgc2VyaWFsaXplKHZhbGlkYXRlPzogYm9vbGVhbik6IFByb21pc2U8YW55PjtcclxuXHJcbiAgICBjaGVjaygpOiBQcm9taXNlPGFueT47XHJcblxyXG4gICAgZ2V0Q29udHJvbChpZDogc3RyaW5nKTogSUR5bmFtaWNGb3JtQ29udHJvbDtcclxuXHJcbiAgICBmaW5kUHJvdmlkZXIoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCk6IElGb3JtQ29udHJvbFByb3ZpZGVyO1xyXG59XHJcblxyXG5leHBvcnQgZGVjbGFyZSB0eXBlIEFzeW5jU3VibWl0TWV0aG9kID0gKGZvcm06IElEeW5hbWljRm9ybUJhc2UpID0+IFByb21pc2U8SUFzeW5jTWVzc2FnZT47XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljRm9ybUluZm8ge1xyXG4gICAgZ3JvdXA/OiBEeW5hbWljRm9ybUdyb3VwO1xyXG4gICAgbmFtZT86IHN0cmluZztcclxuICAgIGNvbnRyb2xzPzogSUZvcm1Db250cm9sW107XHJcbiAgICBzZXJpYWxpemVycz86IElGb3JtU2VyaWFsaXplcnM7XHJcbiAgICBmaWVsZFNldHM/OiBJRm9ybUZpZWxkU2V0W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNGb3JtIGV4dGVuZHMgSUR5bmFtaWNGb3JtQmFzZSwgSUR5bmFtaWNGb3JtSW5mbyB7XHJcbiAgICBkYXRhOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNGb3JtRmllbGRTZXRzIHtcclxuICAgIFtpZDogc3RyaW5nXTogSUZvcm1GaWVsZFNldFxyXG59XHJcblxyXG4vLyAtLS0gQmFzaWMgZm9ybSB0eXBlcyAtLS1cclxuZXhwb3J0IHR5cGUgRm9ybUNvbnRyb2xUZXN0ZXIgPSAoY29udHJvbDogSUR5bmFtaWNGb3JtQ29udHJvbCkgPT4gUHJvbWlzZTxib29sZWFuPjtcclxuZXhwb3J0IHR5cGUgRm9ybUNvbnRyb2xUZXN0ZXJGYWN0b3J5ID0gRm9ybUNvbnRyb2xUZXN0ZXIgfCBJUmVzb2x2ZUZhY3Rvcnk7XHJcbmV4cG9ydCB0eXBlIEZvcm1Db250cm9sVmFsaWRhdG9yID0gKGNvbnRyb2w6IElEeW5hbWljRm9ybUNvbnRyb2wpID0+IFByb21pc2U8c3RyaW5nIHwgVmFsaWRhdGlvbkVycm9ycz47XHJcbmV4cG9ydCB0eXBlIEZvcm1Db250cm9sVmFsaWRhdG9yRmFjdG9yeSA9IEZvcm1Db250cm9sVmFsaWRhdG9yIHwgSVJlc29sdmVGYWN0b3J5O1xyXG5cclxuLy8gLS0tIERlY29yYXRvciBmdW5jdGlvbnMgLS0tXHJcbmNvbnN0IGVtcHR5QXJyYXk6IGFueSA9IFtdO1xyXG5jb25zdCBlbXB0eVRlc3RlcjogRm9ybUNvbnRyb2xUZXN0ZXIgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2VyaWFsaXplcihpZDogc3RyaW5nLCBwYXJlbnQ6IElEeW5hbWljRm9ybUNvbnRyb2wpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHBhcmVudC5nZXRDb250cm9sKGlkKTtcclxuICAgIHJldHVybiAhY29udHJvbCA/IFByb21pc2UucmVzb2x2ZShwYXJlbnQubW9kZWxbaWRdKSA6IGNvbnRyb2wuc2VyaWFsaXplKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBGb3JtU2VyaWFsaXphYmxlKHNlcmlhbGl6ZXI/OiBJRm9ybUNvbnRyb2xTZXJpYWxpemVyIHwgSVJlc29sdmVGYWN0b3J5KTogUHJvcGVydHlEZWNvcmF0b3Ige1xyXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIFJlZmxlY3RVdGlscy5kZWZpbmVNZXRhZGF0YShcImR5bmFtaWNGb3JtU2VyaWFsaXplclwiLCBzZXJpYWxpemVyIHx8IGRlZmF1bHRTZXJpYWxpemVyLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBGb3JtSW5wdXQoZGF0YT86IElGb3JtSW5wdXREYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xyXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBSZWZsZWN0VXRpbHMuZ2V0T3duTWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxuICAgICAgICBjb25zdCB0eXBlID0gbWV0YSA/IG1ldGEubmFtZSA6IFwiXCI7XHJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IHByb3BlcnR5S2V5LmluZGV4T2YoXCJwYXNzd29yZFwiKSA8IDAgPyBcInRleHRcIiA6IFwicGFzc3dvcmRcIjtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmluZUZvcm1Db250cm9sKHRhcmdldCwgcHJvcGVydHlLZXksIGNyZWF0ZUZvcm1JbnB1dChwcm9wZXJ0eUtleSwgZGF0YSwgaW5wdXRUeXBlKSk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRm9ybVNlbGVjdChkYXRhPzogSUZvcm1TZWxlY3REYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xyXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGRlZmluZUZvcm1Db250cm9sKHRhcmdldCwgcHJvcGVydHlLZXksIGNyZWF0ZUZvcm1TZWxlY3QocHJvcGVydHlLZXksIGRhdGEpKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBGb3JtU3RhdGljKGRhdGE/OiBJRm9ybVN0YXRpY0RhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XHJcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybVN0YXRpYyhwcm9wZXJ0eUtleSwgZGF0YSkpO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1Nb2RlbChkYXRhPzogSUZvcm1Nb2RlbERhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XHJcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybU1vZGVsKHByb3BlcnR5S2V5LCBkYXRhKSk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRm9ybUZpbGUoZGF0YT86IElGb3JtRmlsZURhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XHJcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0LCBwcm9wZXJ0eUtleSwgY3JlYXRlRm9ybUZpbGUocHJvcGVydHlLZXksIGRhdGEpKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBGb3JtRmllbGRTZXQoZGF0YTogSUZvcm1GaWVsZFNldCk6IENsYXNzRGVjb3JhdG9yIHtcclxuICAgIHJldHVybiAodGFyZ2V0OiBhbnkpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCBzZXRzID0gZ2V0Rm9ybUZpZWxkU2V0cyh0YXJnZXQpO1xyXG4gICAgICAgIGRhdGEuY2xhc3NlcyA9IGRhdGEuY2xhc3NlcyB8fCBcIlwiO1xyXG4gICAgICAgIHNldHNbZGF0YS5pZF0gPSBkYXRhO1xyXG4gICAgICAgIFJlZmxlY3RVdGlscy5kZWZpbmVNZXRhZGF0YShcImR5bmFtaWNGb3JtRmllbGRTZXRzXCIsIHNldHMsIHRhcmdldCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cFByb3ZpZGVyIGV4dGVuZHMgVmFsdWVQcm92aWRlciB7XHJcbiAgICBwcm92aWRlOiBJbmplY3Rpb25Ub2tlbjxUeXBlPElGb3JtR3JvdXBDb21wb25lbnQ+PjtcclxuICAgIG11bHRpPzogYm9vbGVhbjtcclxuICAgIHVzZVZhbHVlOiBUeXBlPElGb3JtR3JvdXBDb21wb25lbnQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZvcm1Hcm91cChjb21wb25lbnQ6IFR5cGU8SUZvcm1Hcm91cENvbXBvbmVudD4pOiBGb3JtR3JvdXBQcm92aWRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHByb3ZpZGU6IEZPUk1fR1JPVVBfVFlQRSxcclxuICAgICAgICB1c2VWYWx1ZTogY29tcG9uZW50XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250cm9sUHJvdmlkZXIge1xyXG4gICAgcHJvdmlkZTogSW5qZWN0aW9uVG9rZW48SUZvcm1Db250cm9sUHJvdmlkZXI+O1xyXG4gICAgbXVsdGk/OiBib29sZWFuO1xyXG4gICAgdXNlVmFsdWU6IElGb3JtQ29udHJvbFByb3ZpZGVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZvcm1Db250cm9sKGNvbXBvbmVudDogVHlwZTxJRm9ybUNvbnRyb2xDb21wb25lbnQ+LCBhY2NlcHRvcjogSUZvcm1Db250cm9sUHJvdmlkZXJBY2NlcHRvciwgbG9hZGVyOiBJRm9ybUNvbnRyb2xQcm92aWRlckxvYWRlciwgcHJpb3JpdHk6IG51bWJlciA9IDApOiBGb3JtQ29udHJvbFByb3ZpZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJvdmlkZTogRk9STV9DT05UUk9MX1BST1ZJREVSLFxyXG4gICAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICAgIHVzZVZhbHVlOiB7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxyXG4gICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHksXHJcbiAgICAgICAgICAgIGFjY2VwdG9yOiBhY2NlcHRvcixcclxuICAgICAgICAgICAgbG9hZGVyOiBsb2FkZXJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRm9ybUNvbnRyb2wodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcsIGNvbnRyb2w6IElGb3JtQ29udHJvbCk6IHZvaWQge1xyXG4gICAgUmVmbGVjdFV0aWxzLmRlZmluZU1ldGFkYXRhKFwiZHluYW1pY0Zvcm1Db250cm9sXCIsIGNvbnRyb2wsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybUZpZWxkU2V0cyh0YXJnZXQ6IGFueSk6IElEeW5hbWljRm9ybUZpZWxkU2V0cyB7XHJcbiAgICByZXR1cm4gUmVmbGVjdFV0aWxzLmdldE1ldGFkYXRhKFwiZHluYW1pY0Zvcm1GaWVsZFNldHNcIiwgdGFyZ2V0KSB8fCB7fTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1Db250cm9sKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogSUZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiBSZWZsZWN0VXRpbHMuZ2V0TWV0YWRhdGEoXCJkeW5hbWljRm9ybUNvbnRyb2xcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtU2VyaWFsaXplcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IElGb3JtQ29udHJvbFNlcmlhbGl6ZXIgfCBJUmVzb2x2ZUZhY3Rvcnkge1xyXG4gICAgcmV0dXJuIFJlZmxlY3RVdGlscy5nZXRNZXRhZGF0YShcImR5bmFtaWNGb3JtU2VyaWFsaXplclwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1Db250cm9sKGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgZGF0YT86IElGb3JtQ29udHJvbERhdGEpOiBJRm9ybUNvbnRyb2wge1xyXG4gICAgZGF0YSA9IGRhdGEgfHwge307XHJcbiAgICBkYXRhLmxhYmVsID0gT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoZGF0YS5sYWJlbCkgPyBpZCA6IGRhdGEubGFiZWw7XHJcbiAgICBkYXRhLmxhYmVsQWxpZ24gPSBkYXRhLmxhYmVsQWxpZ24gfHwgXCJsZWZ0XCI7XHJcbiAgICBkYXRhLmZpZWxkU2V0ID0gZGF0YS5maWVsZFNldCB8fCBVbmlxdWVVdGlscy51dWlkKCk7XHJcbiAgICBkYXRhLmNsYXNzZXMgPSBkYXRhLmNsYXNzZXMgfHwgXCJcIjtcclxuICAgIGRhdGEucmVhZG9ubHkgPSBkYXRhLnJlYWRvbmx5IHx8IGVtcHR5VGVzdGVyO1xyXG4gICAgZGF0YS5oaWRkZW4gPSBkYXRhLmhpZGRlbiB8fCBlbXB0eVRlc3RlcjtcclxuICAgIGRhdGEudmFsaWRhdG9ycyA9IGRhdGEudmFsaWRhdG9ycyB8fCBlbXB0eUFycmF5O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybUlucHV0KGlkOiBzdHJpbmcsIGRhdGE6IElGb3JtSW5wdXREYXRhLCB0eXBlOiBzdHJpbmcgPSBcInRleHRcIik6IElGb3JtQ29udHJvbCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gY3JlYXRlRm9ybUNvbnRyb2woaWQsIFwiaW5wdXRcIiwgZGF0YSk7XHJcbiAgICBkYXRhID0gY29udHJvbC5kYXRhO1xyXG4gICAgZGF0YS50eXBlID0gZGF0YS50eXBlIHx8IHR5cGU7XHJcbiAgICBkYXRhLmNsYXNzZXMgPSAhZGF0YS5jbGFzc2VzID8gYGZvcm0tZ3JvdXAtJHtkYXRhLnR5cGV9YCA6IGAke2RhdGEuY2xhc3Nlc30gZm9ybS1ncm91cC0ke2RhdGEudHlwZX1gO1xyXG4gICAgZGF0YS5wbGFjZWhvbGRlciA9IGRhdGEucGxhY2Vob2xkZXIgfHwgKGRhdGEudHlwZSA9PSBcIm1hc2tcIiA/IFwiX1wiIDogXCJcIik7XHJcbiAgICBkYXRhLnN0ZXAgPSBkYXRhLnN0ZXAgfHwgMTtcclxuICAgIGRhdGEubWFzayA9IGRhdGEubWFzayB8fCBbL1xcdyovZ2ldO1xyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtU2VsZWN0KGlkOiBzdHJpbmcsIGRhdGE6IElGb3JtU2VsZWN0RGF0YSk6IElGb3JtQ29udHJvbCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gY3JlYXRlRm9ybUNvbnRyb2woaWQsIFwic2VsZWN0XCIsIGRhdGEpO1xyXG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcclxuICAgIGRhdGEub3B0aW9ucyA9IGRhdGEub3B0aW9ucyB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKFtdKSk7XHJcbiAgICBkYXRhLnR5cGUgPSBkYXRhLnR5cGUgfHwgXCJzZWxlY3RcIjtcclxuICAgIGNvbnN0IGNsYXNzVHlwZSA9IGRhdGEudHlwZSA9PSBcInNlbGVjdFwiID8gXCJzZWxlY3RcIiA6IGBzZWxlY3QtJHtkYXRhLnR5cGV9YDtcclxuICAgIGRhdGEuY2xhc3NlcyA9ICFkYXRhLmNsYXNzZXMgPyBgZm9ybS1ncm91cC0ke2NsYXNzVHlwZX1gIDogYCR7ZGF0YS5jbGFzc2VzfSBmb3JtLWdyb3VwLSR7Y2xhc3NUeXBlfWA7XHJcbiAgICByZXR1cm4gY29udHJvbDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1TdGF0aWMoaWQ6IHN0cmluZywgZGF0YTogSUZvcm1TdGF0aWNEYXRhKTogSUZvcm1Db250cm9sIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChpZCwgXCJzdGF0aWNcIiwgZGF0YSk7XHJcbiAgICBkYXRhID0gY29udHJvbC5kYXRhO1xyXG4gICAgZGF0YS5zdHlsZSA9IGRhdGEuc3R5bGUgfHwgXCJ0YWJsZVwiO1xyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtTW9kZWwoaWQ6IHN0cmluZywgZGF0YTogSUZvcm1Nb2RlbERhdGEpOiBJRm9ybUNvbnRyb2wge1xyXG4gICAgY29uc3QgY29udHJvbCA9IGNyZWF0ZUZvcm1Db250cm9sKGlkLCBcIm1vZGVsXCIsIGRhdGEpO1xyXG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcclxuICAgIGRhdGEubmFtZSA9IGRhdGEubmFtZSB8fCBcIlwiO1xyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtRmlsZShpZDogc3RyaW5nLCBkYXRhOiBJRm9ybUZpbGVEYXRhKTogSUZvcm1Db250cm9sIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChpZCwgXCJmaWxlXCIsIGRhdGEpO1xyXG4gICAgZGF0YSA9IGNvbnRyb2wuZGF0YTtcclxuICAgIGRhdGEuYWNjZXB0ID0gZGF0YS5hY2NlcHQgfHwgXCIuanBnLC5qcGVnLC5wbmdcIjtcclxuICAgIGRhdGEubXVsdGkgPSBkYXRhLm11bHRpIHx8IGZhbHNlO1xyXG4gICAgZGF0YS5iYXNlVXJsID0gT2JqZWN0VXRpbHMuaXNTdHJpbmcoZGF0YS5iYXNlVXJsKSA/IGRhdGEuYmFzZVVybCA6IFwiYXNzZXRzL1wiO1xyXG4gICAgZGF0YS51cGxvYWRVcmwgPSBPYmplY3RVdGlscy5pc1N0cmluZyhkYXRhLnVwbG9hZFVybCkgPyBkYXRhLnVwbG9hZFVybCA6IFwiYXNzZXRzXCI7XHJcbiAgICBkYXRhLmNyZWF0ZVVwbG9hZERhdGEgPSBkYXRhLmNyZWF0ZVVwbG9hZERhdGEgfHwgKChmaWxlOiBGaWxlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgIGZvcm0uYXBwZW5kKFwiZmlsZVwiLCBmaWxlKTtcclxuICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbn1cclxuIl19