@stemy/ngx-dynamic-form 10.2.18 → 10.2.22

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 (32) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-dynamic-form.umd.js +1400 -1390
  3. package/bundles/stemy-ngx-dynamic-form.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-dynamic-form.umd.min.js +1 -1
  5. package/bundles/stemy-ngx-dynamic-form.umd.min.js.map +1 -1
  6. package/esm2015/ngx-dynamic-form/common-types.js +134 -134
  7. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.js +91 -91
  8. package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form.component.js +129 -129
  9. package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +100 -100
  10. package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +82 -82
  11. package/esm2015/ngx-dynamic-form/services/dynamic-form-validation.service.js +11 -11
  12. package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +393 -383
  13. package/esm2015/ngx-dynamic-form/utils/dynamic-form-array.model.js +8 -8
  14. package/esm2015/ngx-dynamic-form/utils/form-subject.js +18 -18
  15. package/esm2015/ngx-dynamic-form/utils/validators.js +28 -28
  16. package/esm2015/public_api.js +9 -9
  17. package/esm2015/stemy-ngx-dynamic-form.js +6 -6
  18. package/fesm2015/stemy-ngx-dynamic-form.js +936 -926
  19. package/fesm2015/stemy-ngx-dynamic-form.js.map +1 -1
  20. package/ngx-dynamic-form/common-types.d.ts +148 -148
  21. package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +37 -37
  22. package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +37 -37
  23. package/ngx-dynamic-form/directives/async-submit.directive.d.ts +27 -27
  24. package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +10 -10
  25. package/ngx-dynamic-form/services/dynamic-form-validation.service.d.ts +5 -5
  26. package/ngx-dynamic-form/services/dynamic-form.service.d.ts +40 -40
  27. package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +12 -12
  28. package/ngx-dynamic-form/utils/form-subject.d.ts +8 -8
  29. package/ngx-dynamic-form/utils/validators.d.ts +4 -4
  30. package/package.json +12 -12
  31. package/public_api.d.ts +8 -8
  32. package/stemy-ngx-dynamic-form.d.ts +6 -6
@@ -1,383 +1,393 @@
1
- import { __awaiter } from "tslib";
2
- import { EventEmitter, Injectable } from "@angular/core";
3
- import { FormArray, FormGroup } from "@angular/forms";
4
- import { Subject } from "rxjs";
5
- import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormComponentService, DynamicFormGroupModel, DynamicFormService as Base, DynamicFormValidationService, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel, DynamicFormArrayModel as DynamicFormArrayModelBase } from "@ng-dynamic-forms/core";
6
- import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
7
- import { FormSubject } from "../utils/form-subject";
8
- import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
9
- export class DynamicFormService extends Base {
10
- constructor(cs, vs, openApi) {
11
- super(cs, vs);
12
- this.openApi = openApi;
13
- this.onDetectChanges = new EventEmitter();
14
- }
15
- get api() {
16
- return this.openApi.api;
17
- }
18
- get language() {
19
- return this.api.language;
20
- }
21
- patchGroup(value, formModel, formGroup) {
22
- this.patchValueRecursive(value, formModel, formGroup);
23
- this.detectChanges();
24
- formGroup.patchValue(ObjectUtils.copy(value));
25
- }
26
- patchForm(value, component) {
27
- this.patchValueRecursive(value, component.model, component.group);
28
- this.detectChanges(component);
29
- component.group.patchValue(value);
30
- }
31
- serialize(formModel, formGroup) {
32
- return this.serializeRecursive(formModel, formGroup);
33
- }
34
- notifyChanges(formModel, formGroup) {
35
- this.notifyChangesRecursive(formModel, formGroup);
36
- }
37
- updateSelectOptions(formControlModel, formControl) {
38
- if (formControlModel instanceof DynamicSelectModel) {
39
- let options = formControlModel.options$;
40
- if (options instanceof FormSubject) {
41
- options.notify(formControlModel, formControl);
42
- return;
43
- }
44
- while (options instanceof Subject && options.source) {
45
- options = options.source;
46
- if (options instanceof FormSubject) {
47
- options.notify(formControlModel, formControl);
48
- }
49
- }
50
- }
51
- }
52
- showErrors(form) {
53
- this.showErrorsForGroup(form.group);
54
- this.detectChanges(form);
55
- }
56
- detectChanges(formComponent) {
57
- super.detectChanges(formComponent);
58
- this.onDetectChanges.emit(formComponent);
59
- }
60
- patchValueRecursive(value, formModel, formGroup) {
61
- Object.keys(value).forEach(key => {
62
- const subModel = this.findModelById(key, formModel);
63
- const subValue = value[key];
64
- if (!subModel)
65
- return;
66
- const subControl = this.findControlByModel(subModel, formGroup);
67
- if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
68
- value[key] = subValue.id || subValue._id || subValue;
69
- return;
70
- }
71
- if (subModel instanceof DynamicFormArrayModelBase) {
72
- const length = Array.isArray(subValue) ? subValue.length : 0;
73
- const subArray = subControl;
74
- while (subModel.size > length) {
75
- this.removeFormArrayGroup(0, subArray, subModel);
76
- }
77
- while (subModel.size < length) {
78
- this.insertFormArrayGroup(subModel.size, subArray, subModel);
79
- }
80
- for (let i = 0; i < length; i++) {
81
- const itemModel = subModel.get(i);
82
- this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
83
- }
84
- return;
85
- }
86
- if (subModel instanceof DynamicFormGroupModel) {
87
- this.patchValueRecursive(subValue, subModel.group, subControl);
88
- }
89
- });
90
- }
91
- serializeRecursive(formModel, formGroup) {
92
- var _a;
93
- return __awaiter(this, void 0, void 0, function* () {
94
- const result = {};
95
- if (!formModel || !formGroup || !formGroup.value)
96
- return result;
97
- for (const i in formModel) {
98
- const subModel = formModel[i];
99
- const subControl = this.findControlByModel(subModel, formGroup);
100
- const serializer = (_a = subModel.additional) === null || _a === void 0 ? void 0 : _a.serializer;
101
- if (ObjectUtils.isFunction(serializer)) {
102
- result[subModel.id] = yield serializer(subModel, subControl);
103
- continue;
104
- }
105
- if (subModel instanceof DynamicFormArrayModelBase) {
106
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
107
- const subArray = subControl;
108
- const resArray = [];
109
- for (let i = 0; i < length; i++) {
110
- const itemModel = subModel.get(i);
111
- resArray.push(yield this.serializeRecursive(itemModel.group, subArray.at(i)));
112
- }
113
- result[subModel.id] = resArray;
114
- continue;
115
- }
116
- if (subModel instanceof DynamicFormGroupModel) {
117
- result[subModel.id] = yield this.serializeRecursive(subModel.group, subControl);
118
- continue;
119
- }
120
- result[subModel.id] = subControl.value;
121
- }
122
- return result;
123
- });
124
- }
125
- notifyChangesRecursive(formModel, formGroup) {
126
- if (!formModel || !formGroup)
127
- return;
128
- for (const i in formModel) {
129
- const subModel = formModel[i];
130
- const subControl = this.findControlByModel(subModel, formGroup);
131
- if (subModel instanceof DynamicFormArrayModelBase) {
132
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
133
- const subArray = subControl;
134
- for (let i = 0; i < length; i++) {
135
- const itemModel = subModel.get(i);
136
- this.notifyChangesRecursive(itemModel.group, subArray.at(i));
137
- }
138
- continue;
139
- }
140
- if (subModel instanceof DynamicFormGroupModel) {
141
- this.notifyChangesRecursive(subModel.group, subControl);
142
- continue;
143
- }
144
- this.updateSelectOptions(subModel, subControl);
145
- }
146
- }
147
- showErrorsForGroup(formGroup) {
148
- if (!formGroup)
149
- return;
150
- formGroup.markAsTouched({ onlySelf: true });
151
- const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
152
- this.showErrorsForControls(controls);
153
- }
154
- showErrorsForControls(controls) {
155
- controls.forEach(control => {
156
- if (control instanceof FormGroup) {
157
- this.showErrorsForGroup(control);
158
- return;
159
- }
160
- control.markAsTouched({ onlySelf: true });
161
- if (control instanceof FormArray) {
162
- this.showErrorsForControls(control.controls);
163
- }
164
- });
165
- }
166
- getFormModelForSchema(name) {
167
- return __awaiter(this, void 0, void 0, function* () {
168
- this.api.cache = {};
169
- this.schemas = yield this.openApi.getSchemas();
170
- return this.getFormModelForSchemaDef(this.schemas[name]);
171
- });
172
- }
173
- getFormModelForSchemaDef(schema) {
174
- if (!schema)
175
- return [];
176
- return Object.keys(schema.properties || {}).map(p => {
177
- const property = schema.properties[p];
178
- return this.getFormControlModel(property, schema);
179
- }).filter(t => null !== t);
180
- }
181
- getFormControlModel(property, schema) {
182
- var _a, _b;
183
- if (Array.isArray(property.enum) || ObjectUtils.isString(property.optionsPath)) {
184
- return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
185
- }
186
- switch (property.type) {
187
- case "string":
188
- case "number":
189
- return new DynamicInputModel(this.getFormInputConfig(property, schema));
190
- case "textarea":
191
- return new DynamicTextAreaModel(this.getFormTextareaConfig(property, schema));
192
- case "boolean":
193
- return new DynamicCheckboxModel(this.getFormCheckboxConfig(property, schema));
194
- case "list":
195
- return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
196
- case "array":
197
- if (((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref) {
198
- return new DynamicFormArrayModel(this.getFormArrayConfig(property, schema));
199
- }
200
- else if (((_b = property.items) === null || _b === void 0 ? void 0 : _b.enum) || property.enum) {
201
- return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
202
- }
203
- else {
204
- return new DynamicInputModel(this.getFormInputConfig(property, schema));
205
- }
206
- case "file":
207
- return new DynamicFileUploadModel(this.getFormUploadConfig(property, schema));
208
- }
209
- if (property.$ref) {
210
- return new DynamicFormGroupModel(this.getFormGroupConfig(property, schema));
211
- }
212
- return null;
213
- }
214
- getFormControlConfig(property, schema) {
215
- const validators = this.getValidators(property, schema);
216
- const errorMessages = Object.keys(validators).reduce((res, key) => {
217
- res[key] = `error.${key}`;
218
- return res;
219
- }, {});
220
- return {
221
- id: property.id,
222
- label: ObjectUtils.isString(property.label) ? property.label : property.id,
223
- hidden: property.hidden,
224
- disabled: property.disabled,
225
- validators,
226
- errorMessages,
227
- additional: Object.assign({}, property)
228
- };
229
- }
230
- getFormArrayConfig(property, schema) {
231
- var _a;
232
- const ref = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref || "";
233
- const subSchema = this.schemas[ref.split("/").pop()];
234
- return Object.assign(this.getFormControlConfig(property, schema), { groupFactory: () => this.getFormModelForSchemaDef(subSchema) });
235
- }
236
- getFormGroupConfig(property, schema) {
237
- const ref = property.$ref || "";
238
- const subSchema = this.schemas[ref.split("/").pop()];
239
- return Object.assign(this.getFormControlConfig(property, schema), { group: this.getFormModelForSchemaDef(subSchema) });
240
- }
241
- getFormInputConfig(property, schema) {
242
- var _a;
243
- let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (((_a = property.items) === null || _a === void 0 ? void 0 : _a.type) || property.type);
244
- switch (inputType) {
245
- case "boolean":
246
- inputType = "checkbox";
247
- break;
248
- case "textarea":
249
- inputType = "textarea";
250
- break;
251
- }
252
- return Object.assign(this.getFormControlConfig(property, schema), {
253
- inputType,
254
- autoComplete: property.autoComplete || "off",
255
- multiple: property.type == "array",
256
- accept: ObjectUtils.isString(property.accept) ? property.accept : null,
257
- mask: ObjectUtils.isString(property.mask) ? property.mask : null,
258
- pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
259
- step: isNaN(property.step) ? 1 : property.step,
260
- min: isNaN(property.min) ? Number.MIN_SAFE_INTEGER : property.min,
261
- max: isNaN(property.max) ? Number.MAX_SAFE_INTEGER : property.max,
262
- });
263
- }
264
- getFormTextareaConfig(property, schema) {
265
- return Object.assign(this.getFormControlConfig(property, schema), {
266
- cols: property.cols || null,
267
- rows: property.rows || 10,
268
- wrap: property.wrap || false,
269
- autoComplete: property.autoComplete || "off",
270
- multiple: property.type == "array"
271
- });
272
- }
273
- getFormSelectConfig(property, schema) {
274
- return Object.assign(this.getFormControlConfig(property, schema), {
275
- options: this.getFormSelectOptions(property, schema),
276
- multiple: property.type == "array"
277
- });
278
- }
279
- getFormCheckboxConfig(property, schema) {
280
- return Object.assign(this.getFormControlConfig(property, schema), {
281
- indeterminate: property.indeterminate === true
282
- });
283
- }
284
- translateOptions(options) {
285
- return __awaiter(this, void 0, void 0, function* () {
286
- if (!options)
287
- return [];
288
- for (const option of options) {
289
- option.label = yield this.language.getTranslation(option.label);
290
- }
291
- return options;
292
- });
293
- }
294
- getFormSelectOptions(property, schema) {
295
- var _a;
296
- const $enum = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.enum) || property.enum;
297
- if (property.optionsPath) {
298
- return new FormSubject((formModel, control) => {
299
- let path = property.optionsPath;
300
- let target = control;
301
- if (path.startsWith("$root")) {
302
- path = path.substr(5);
303
- while (target.parent) {
304
- target = target.parent;
305
- }
306
- }
307
- while (path.startsWith(".")) {
308
- path = path.substr(1);
309
- if (target.parent) {
310
- target = target.parent;
311
- }
312
- }
313
- const value = ObjectUtils.getValue(target.value, path);
314
- const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => ({ value, label: value }));
315
- return this.translateOptions(options);
316
- });
317
- }
318
- if (ObjectUtils.isArray($enum)) {
319
- return new FormSubject(() => {
320
- const options = $enum.map(value => {
321
- const label = property.translatable ? `${property.id}.${value}` : value;
322
- return { value, label };
323
- });
324
- return this.translateOptions(options);
325
- });
326
- }
327
- return new FormSubject(() => __awaiter(this, void 0, void 0, function* () {
328
- this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {
329
- return result.items.map(i => {
330
- return { value: i.id || i._id, label: i[property.labelField] || i.label || i.id || i._id };
331
- });
332
- });
333
- const options = (yield this.api.cache[property.endpoint]).map(t => Object.assign({}, t));
334
- return this.translateOptions(options);
335
- }));
336
- }
337
- getFormUploadConfig(property, schema) {
338
- const url = this.api.url(property.url || "assets");
339
- const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
340
- return Object.assign(this.getFormControlConfig(property, schema), {
341
- url,
342
- accept,
343
- autoUpload,
344
- maxSize,
345
- minSize,
346
- removeUrl,
347
- showFileList
348
- });
349
- }
350
- getValidators(property, schema) {
351
- const validators = {};
352
- if (schema.required.indexOf(property.id) >= 0) {
353
- validators.required = null;
354
- }
355
- if (property.minLength) {
356
- validators.minLength = property.minLength;
357
- }
358
- if (property.maxLength) {
359
- validators.maxLength = property.maxLength;
360
- }
361
- if (property.min) {
362
- validators.min = property.min;
363
- }
364
- if (property.max) {
365
- validators.max = property.max;
366
- }
367
- switch (property.format) {
368
- case "email":
369
- validators.email = null;
370
- break;
371
- }
372
- return validators;
373
- }
374
- }
375
- DynamicFormService.decorators = [
376
- { type: Injectable }
377
- ];
378
- DynamicFormService.ctorParameters = () => [
379
- { type: DynamicFormComponentService },
380
- { type: DynamicFormValidationService },
381
- { type: OpenApiService }
382
- ];
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0gsb0JBQW9CLEVBRXBCLHNCQUFzQixFQUd0QiwyQkFBMkIsRUFFM0IscUJBQXFCLEVBSXJCLGtCQUFrQixJQUFJLElBQUksRUFDMUIsNEJBQTRCLEVBRzVCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3BCLHFCQUFxQixJQUFJLHlCQUF5QixFQUNyRCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFNSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLFdBQVcsRUFDZCxNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQThCLE1BQU0sbUNBQW1DLENBQUM7QUFHckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFheEMsWUFBWSxFQUErQixFQUFFLEVBQWdDLEVBQVcsT0FBdUI7UUFDM0csS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQURzRSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUUzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO0lBQ3BFLENBQUM7SUFkRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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LENBQUM7UUFDL0MsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3BCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUNELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQixVQUFVLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDN0M7UUFDRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDZCxVQUFVLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDZCxVQUFVLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFDRCxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDckIsS0FBSyxPQUFPO2dCQUNSLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixNQUFNO1NBQ2I7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOzs7WUF4WUosVUFBVTs7O1lBbkNQLDJCQUEyQjtZQU8zQiw0QkFBNEI7WUFtQjVCLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICAgIER5bmFtaWNDaGVja2JveE1vZGVsLFxuICAgIER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsXG4gICAgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbENvbmZpZyxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudCxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLFxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyxcbiAgICBEeW5hbWljRm9ybU1vZGVsLFxuICAgIER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnLFxuICAgIER5bmFtaWNGb3JtU2VydmljZSBhcyBCYXNlLFxuICAgIER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbCxcbiAgICBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNJbnB1dE1vZGVsLFxuICAgIER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNTZWxlY3RNb2RlbCxcbiAgICBEeW5hbWljU2VsZWN0TW9kZWxDb25maWcsXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWwsXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcsXG4gICAgRHluYW1pY1ZhbGlkYXRvcnNDb25maWcsXG4gICAgRHluYW1pY0Zvcm1BcnJheU1vZGVsIGFzIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2Vcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgSUFwaVNlcnZpY2UsXG4gICAgSUxhbmd1YWdlU2VydmljZSxcbiAgICBJT3BlbkFwaVNjaGVtYSxcbiAgICBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LFxuICAgIElPcGVuQXBpU2NoZW1hcyxcbiAgICBPYmplY3RVdGlscyxcbiAgICBPcGVuQXBpU2VydmljZSxcbiAgICBTdHJpbmdVdGlsc1xufSBmcm9tIFwiQHN0ZW15L25neC11dGlsc1wiO1xuXG5pbXBvcnQge0lGb3JtQ29udHJvbFNlcmlhbGl6ZXJ9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcblxuaW1wb3J0IHtGb3JtU3ViamVjdH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm0tc3ViamVjdFwiO1xuaW1wb3J0IHtEeW5hbWljRm9ybUFycmF5TW9kZWwsIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1hcnJheS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICBnZXQgYXBpKCk6IElBcGlTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XG4gICAgfVxuXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGkubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgb25EZXRlY3RDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db21wb25lbnQ+O1xuICAgIHByb3RlY3RlZCBzY2hlbWFzOiBJT3BlbkFwaVNjaGVtYXM7XG5cbiAgICBjb25zdHJ1Y3RvcihjczogRHluYW1pY0Zvcm1Db21wb25lbnRTZXJ2aWNlLCB2czogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSwgcmVhZG9ubHkgb3BlbkFwaTogT3BlbkFwaVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoY3MsIHZzKTtcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29tcG9uZW50PigpO1xuICAgIH1cblxuICAgIHBhdGNoR3JvdXAodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWUsIGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKE9iamVjdFV0aWxzLmNvcHkodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWUsIGNvbXBvbmVudC5tb2RlbCwgY29tcG9uZW50Lmdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGNvbXBvbmVudCk7XG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShmb3JtTW9kZWwsIGZvcm1Hcm91cCk7XG4gICAgfVxuXG4gICAgbm90aWZ5Q2hhbmdlcyhmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWwsIGZvcm1Hcm91cCk7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VsZWN0T3B0aW9ucyhmb3JtQ29udHJvbE1vZGVsOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAoZm9ybUNvbnRyb2xNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBmb3JtQ29udHJvbE1vZGVsLm9wdGlvbnMkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob3B0aW9ucyBpbnN0YW5jZW9mIFN1YmplY3QgJiYgb3B0aW9ucy5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmeShmb3JtQ29udHJvbE1vZGVsLCBmb3JtQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChmb3JtLmdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGZvcm0pO1xuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudD86IER5bmFtaWNGb3JtQ29tcG9uZW50KSB7XG4gICAgICAgIHN1cGVyLmRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMub25EZXRlY3RDaGFuZ2VzLmVtaXQoZm9ybUNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5SWQoa2V5LCBmb3JtTW9kZWwpO1xuICAgICAgICAgICAgY29uc3Qgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICAgICAgaWYgKCFzdWJNb2RlbCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY1NlbGVjdE1vZGVsICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KHN1YlZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW2tleV0gPSBzdWJWYWx1ZS5pZCB8fCBzdWJWYWx1ZS5faWQgfHwgc3ViVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJBcnJheSA9IHN1YkNvbnRyb2wgYXMgRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN1Yk1vZGVsLnNpemUgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHN1YlZhbHVlW2ldLCBpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZSwgc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlcmlhbGl6ZVJlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXAgfHwgIWZvcm1Hcm91cC52YWx1ZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHN1Yk1vZGVsLmFkZGl0aW9uYWw/LnNlcmlhbGl6ZXIgYXMgSUZvcm1Db250cm9sU2VyaWFsaXplcjtcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKHNlcmlhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IGF3YWl0IHNlcmlhbGl6ZXIoc3ViTW9kZWwsIHN1YkNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xuICAgICAgICAgICAgICAgICAgICByZXNBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSByZXNBcnJheTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1YkNvbnRyb2wudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXApIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0T3B0aW9ucyhzdWJNb2RlbCwgc3ViQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybUdyb3VwKSByZXR1cm47XG4gICAgICAgIGZvcm1Hcm91cC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBjb25zdCBjb250cm9scyA9IE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykubWFwKGlkID0+IGZvcm1Hcm91cC5jb250cm9sc1tpZF0pO1xuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9scyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sczogQWJzdHJhY3RDb250cm9sW10pOiB2b2lkIHtcbiAgICAgICAgY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yR3JvdXAoY29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sLmNvbnRyb2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RHluYW1pY0Zvcm1Nb2RlbD4ge1xuICAgICAgICB0aGlzLmFwaS5jYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLnNjaGVtYXMgPSBhd2FpdCB0aGlzLm9wZW5BcGkuZ2V0U2NoZW1hcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYodGhpcy5zY2hlbWFzW25hbWVdKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybU1vZGVsIHtcbiAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSkubWFwKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzY2hlbWEucHJvcGVydGllc1twXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1Db250cm9sTW9kZWwocHJvcGVydHksIHNjaGVtYSk7XG4gICAgICAgIH0pLmZpbHRlcih0ID0+IG51bGwgIT09IHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbE1vZGVsKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eS5lbnVtKSB8fCBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5vcHRpb25zUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1NlbGVjdE1vZGVsPGFueT4odGhpcy5nZXRGb3JtU2VsZWN0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RleHRBcmVhTW9kZWwodGhpcy5nZXRGb3JtVGV4dGFyZWFDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNDaGVja2JveE1vZGVsKHRoaXMuZ2V0Rm9ybUNoZWNrYm94Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUFycmF5TW9kZWwodGhpcy5nZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNTZWxlY3RNb2RlbDxhbnk+KHRoaXMuZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljSW5wdXRNb2RlbCh0aGlzLmdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNGaWxlVXBsb2FkTW9kZWwodGhpcy5nZXRGb3JtVXBsb2FkQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkuJHJlZikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUdyb3VwTW9kZWwodGhpcy5nZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWc8YW55PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldFZhbGlkYXRvcnMocHJvcGVydHksIHNjaGVtYSk7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBPYmplY3Qua2V5cyh2YWxpZGF0b3JzKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XG4gICAgICAgICAgICByZXNba2V5XSA9IGBlcnJvci4ke2tleX1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwge30pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb3BlcnR5LmlkLFxuICAgICAgICAgICAgbGFiZWw6IE9iamVjdFV0aWxzLmlzU3RyaW5nKHByb3BlcnR5LmxhYmVsKSA/IHByb3BlcnR5LmxhYmVsIDogcHJvcGVydHkuaWQsXG4gICAgICAgICAgICBoaWRkZW46IHByb3BlcnR5LmhpZGRlbixcbiAgICAgICAgICAgIGRpc2FibGVkOiBwcm9wZXJ0eS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLFxuICAgICAgICAgICAgYWRkaXRpb25hbDogT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydHkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1BcnJheUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZyB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgc3ViU2NoZW1hID0gdGhpcy5zY2hlbWFzW3JlZi5zcGxpdChcIi9cIikucG9wKCldO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLCB7Z3JvdXBGYWN0b3J5OiAoKSA9PiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEpfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgc3ViU2NoZW1hID0gdGhpcy5zY2hlbWFzW3JlZi5zcGxpdChcIi9cIikucG9wKCldO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLCB7Z3JvdXA6IHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHN1YlNjaGVtYSl9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0lucHV0TW9kZWxDb25maWcge1xuICAgICAgICBsZXQgaW5wdXRUeXBlID0gU3RyaW5nVXRpbHMuaGFzKHByb3BlcnR5LmlkLCBcInBhc3N3b3JkXCIsIFwiUGFzc3dvcmRcIikgPyBcInBhc3N3b3JkXCIgOiAocHJvcGVydHkuaXRlbXM/LnR5cGUgfHwgcHJvcGVydHkudHlwZSk7XG4gICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwidGV4dGFyZWFcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZTogcHJvcGVydHkuYXV0b0NvbXBsZXRlIHx8IFwib2ZmXCIsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWFzazogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkubWFzaykgPyBwcm9wZXJ0eS5tYXNrIDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5wYXR0ZXJuKSA/IHByb3BlcnR5LnBhdHRlcm4gOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHByb3BlcnR5LnN0ZXApID8gMSA6IHByb3BlcnR5LnN0ZXAsXG4gICAgICAgICAgICAgICAgbWluOiBpc05hTihwcm9wZXJ0eS5taW4pID8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgOiBwcm9wZXJ0eS5taW4sXG4gICAgICAgICAgICAgICAgbWF4OiBpc05hTihwcm9wZXJ0eS5tYXgpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBwcm9wZXJ0eS5tYXgsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNUZXh0QXJlYU1vZGVsQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbHM6IHByb3BlcnR5LmNvbHMgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICByb3dzOiBwcm9wZXJ0eS5yb3dzIHx8IDEwLFxuICAgICAgICAgICAgICAgIHdyYXA6IHByb3BlcnR5LndyYXAgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZzxhbnk+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IHByb3BlcnR5LmluZGV0ZXJtaW5hdGUgPT09IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zOiBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZzxhbnk+W10pOiBQcm9taXNlPER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4ge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9uLmxhYmVsID0gYXdhaXQgdGhpcy5sYW5ndWFnZS5nZXRUcmFuc2xhdGlvbihvcHRpb24ubGFiZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSkge1xuICAgICAgICBjb25zdCAkZW51bSA9IHByb3BlcnR5Lml0ZW1zPy5lbnVtIHx8IHByb3BlcnR5LmVudW07XG4gICAgICAgIGlmIChwcm9wZXJ0eS5vcHRpb25zUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdCgoZm9ybU1vZGVsLCBjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aDtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gY29udHJvbDtcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiJHJvb3RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDUpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0LnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUodGFyZ2V0LnZhbHVlLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKCFPYmplY3RVdGlscy5pc0FycmF5KHZhbHVlKSA/IFtdOiB2YWx1ZSkubWFwKHZhbHVlID0+ICh7dmFsdWUsIGxhYmVsOiB2YWx1ZX0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoJGVudW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1TdWJqZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBwcm9wZXJ0eS50cmFuc2xhdGFibGUgPyBgJHtwcm9wZXJ0eS5pZH0uJHt2YWx1ZX1gIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0gPSB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0gfHwgdGhpcy5hcGkubGlzdChwcm9wZXJ0eS5lbmRwb2ludCwgdGhpcy5hcGkubWFrZUxpc3RQYXJhbXMoMSwgLTEpKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IGkuaWQgfHwgaS5faWQsIGxhYmVsOiBpW3Byb3BlcnR5LmxhYmVsRmllbGRdIHx8IGkubGFiZWwgfHwgaS5pZCB8fCBpLl9pZH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXdhaXQgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdKS5tYXAodCA9PiBPYmplY3QuYXNzaWduKHt9LCB0KSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmFwaS51cmwocHJvcGVydHkudXJsIHx8IFwiYXNzZXRzXCIpO1xuICAgICAgICBjb25zdCB7YWNjZXB0LCBhdXRvVXBsb2FkLCBtYXhTaXplLCBtaW5TaXplLCByZW1vdmVVcmwsIHNob3dGaWxlTGlzdH0gPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgYWNjZXB0LFxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcbiAgICAgICAgICAgIG1heFNpemUsXG4gICAgICAgICAgICBtaW5TaXplLFxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxuICAgICAgICAgICAgc2hvd0ZpbGVMaXN0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRWYWxpZGF0b3JzKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1ZhbGlkYXRvcnNDb25maWcge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xuICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucmVxdWlyZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluTGVuZ3RoID0gcHJvcGVydHkubWluTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4TGVuZ3RoID0gcHJvcGVydHkubWF4TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW4pIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluID0gcHJvcGVydHkubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4ID0gcHJvcGVydHkubWF4O1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkuZm9ybWF0KSB7XG4gICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgICB9XG59XG4iXX0=
1
+ import { __awaiter } from "tslib";
2
+ import { EventEmitter, Injectable } from "@angular/core";
3
+ import { FormArray, FormGroup } from "@angular/forms";
4
+ import { Subject } from "rxjs";
5
+ import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormComponentService, DynamicFormGroupModel, DynamicFormService as Base, DynamicFormValidationService, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel, DynamicFormArrayModel as DynamicFormArrayModelBase } from "@ng-dynamic-forms/core";
6
+ import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
7
+ import { FormSubject } from "../utils/form-subject";
8
+ import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
9
+ export class DynamicFormService extends Base {
10
+ constructor(cs, vs, openApi) {
11
+ super(cs, vs);
12
+ this.openApi = openApi;
13
+ this.onDetectChanges = new EventEmitter();
14
+ }
15
+ get api() {
16
+ return this.openApi.api;
17
+ }
18
+ get language() {
19
+ return this.api.language;
20
+ }
21
+ patchGroup(value, formModel, formGroup) {
22
+ this.patchValueRecursive(value, formModel, formGroup);
23
+ this.detectChanges();
24
+ formGroup.patchValue(ObjectUtils.copy(value));
25
+ }
26
+ patchForm(value, component) {
27
+ this.patchValueRecursive(value, component.model, component.group);
28
+ this.detectChanges(component);
29
+ component.group.patchValue(value);
30
+ }
31
+ serialize(formModel, formGroup) {
32
+ return this.serializeRecursive(formModel, formGroup);
33
+ }
34
+ notifyChanges(formModel, formGroup) {
35
+ this.notifyChangesRecursive(formModel, formGroup);
36
+ }
37
+ updateSelectOptions(formControlModel, formControl) {
38
+ if (formControlModel instanceof DynamicSelectModel) {
39
+ let options = formControlModel.options$;
40
+ if (options instanceof FormSubject) {
41
+ options.notify(formControlModel, formControl);
42
+ return;
43
+ }
44
+ while (options instanceof Subject && options.source) {
45
+ options = options.source;
46
+ if (options instanceof FormSubject) {
47
+ options.notify(formControlModel, formControl);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ showErrors(form) {
53
+ this.showErrorsForGroup(form.group);
54
+ this.detectChanges(form);
55
+ }
56
+ detectChanges(formComponent) {
57
+ super.detectChanges(formComponent);
58
+ this.onDetectChanges.emit(formComponent);
59
+ }
60
+ patchValueRecursive(value, formModel, formGroup) {
61
+ Object.keys(value).forEach(key => {
62
+ const subModel = this.findModelById(key, formModel);
63
+ const subValue = value[key];
64
+ if (!subModel)
65
+ return;
66
+ const subControl = this.findControlByModel(subModel, formGroup);
67
+ if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
68
+ value[key] = subValue.id || subValue._id || subValue;
69
+ return;
70
+ }
71
+ if (subModel instanceof DynamicFormArrayModelBase) {
72
+ const length = Array.isArray(subValue) ? subValue.length : 0;
73
+ const subArray = subControl;
74
+ while (subModel.size > length) {
75
+ this.removeFormArrayGroup(0, subArray, subModel);
76
+ }
77
+ while (subModel.size < length) {
78
+ this.insertFormArrayGroup(subModel.size, subArray, subModel);
79
+ }
80
+ for (let i = 0; i < length; i++) {
81
+ const itemModel = subModel.get(i);
82
+ this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
83
+ }
84
+ return;
85
+ }
86
+ if (subModel instanceof DynamicFormGroupModel) {
87
+ this.patchValueRecursive(subValue, subModel.group, subControl);
88
+ }
89
+ });
90
+ }
91
+ serializeRecursive(formModel, formGroup) {
92
+ var _a;
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ const result = {};
95
+ if (!formModel || !formGroup || !formGroup.value)
96
+ return result;
97
+ for (const i in formModel) {
98
+ const subModel = formModel[i];
99
+ const subControl = this.findControlByModel(subModel, formGroup);
100
+ const serializer = (_a = subModel.additional) === null || _a === void 0 ? void 0 : _a.serializer;
101
+ if (ObjectUtils.isFunction(serializer)) {
102
+ result[subModel.id] = yield serializer(subModel, subControl);
103
+ continue;
104
+ }
105
+ if (subModel instanceof DynamicFormArrayModelBase) {
106
+ const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
107
+ const subArray = subControl;
108
+ const resArray = [];
109
+ for (let i = 0; i < length; i++) {
110
+ const itemModel = subModel.get(i);
111
+ resArray.push(yield this.serializeRecursive(itemModel.group, subArray.at(i)));
112
+ }
113
+ result[subModel.id] = resArray;
114
+ continue;
115
+ }
116
+ if (subModel instanceof DynamicFormGroupModel) {
117
+ result[subModel.id] = yield this.serializeRecursive(subModel.group, subControl);
118
+ continue;
119
+ }
120
+ if (subModel instanceof DynamicInputModel && !ObjectUtils.isNullOrUndefined(subControl.value)) {
121
+ result[subModel.id] = subModel.inputType == "number"
122
+ ? parseFloat((`${subControl.value}` || "0").replace(/,/gi, ".")) || null
123
+ : subControl.value;
124
+ continue;
125
+ }
126
+ result[subModel.id] = subControl.value;
127
+ }
128
+ return result;
129
+ });
130
+ }
131
+ notifyChangesRecursive(formModel, formGroup) {
132
+ if (!formModel || !formGroup)
133
+ return;
134
+ for (const i in formModel) {
135
+ const subModel = formModel[i];
136
+ const subControl = this.findControlByModel(subModel, formGroup);
137
+ if (subModel instanceof DynamicFormArrayModelBase) {
138
+ const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
139
+ const subArray = subControl;
140
+ for (let i = 0; i < length; i++) {
141
+ const itemModel = subModel.get(i);
142
+ this.notifyChangesRecursive(itemModel.group, subArray.at(i));
143
+ }
144
+ continue;
145
+ }
146
+ if (subModel instanceof DynamicFormGroupModel) {
147
+ this.notifyChangesRecursive(subModel.group, subControl);
148
+ continue;
149
+ }
150
+ this.updateSelectOptions(subModel, subControl);
151
+ }
152
+ }
153
+ showErrorsForGroup(formGroup) {
154
+ if (!formGroup)
155
+ return;
156
+ formGroup.markAsTouched({ onlySelf: true });
157
+ const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
158
+ this.showErrorsForControls(controls);
159
+ }
160
+ showErrorsForControls(controls) {
161
+ controls.forEach(control => {
162
+ if (control instanceof FormGroup) {
163
+ this.showErrorsForGroup(control);
164
+ return;
165
+ }
166
+ control.markAsTouched({ onlySelf: true });
167
+ if (control instanceof FormArray) {
168
+ this.showErrorsForControls(control.controls);
169
+ }
170
+ });
171
+ }
172
+ getFormModelForSchema(name) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ this.api.cache = {};
175
+ this.schemas = yield this.openApi.getSchemas();
176
+ return this.getFormModelForSchemaDef(this.schemas[name]);
177
+ });
178
+ }
179
+ getFormModelForSchemaDef(schema) {
180
+ if (!schema)
181
+ return [];
182
+ return Object.keys(schema.properties || {}).map(p => {
183
+ const property = schema.properties[p];
184
+ return this.getFormControlModel(property, schema);
185
+ }).filter(t => null !== t);
186
+ }
187
+ getFormControlModel(property, schema) {
188
+ var _a, _b;
189
+ if (Array.isArray(property.enum) || ObjectUtils.isString(property.optionsPath)) {
190
+ return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
191
+ }
192
+ switch (property.type) {
193
+ case "string":
194
+ case "number":
195
+ case "integer":
196
+ return new DynamicInputModel(this.getFormInputConfig(property, schema));
197
+ case "textarea":
198
+ return new DynamicTextAreaModel(this.getFormTextareaConfig(property, schema));
199
+ case "boolean":
200
+ return new DynamicCheckboxModel(this.getFormCheckboxConfig(property, schema));
201
+ case "list":
202
+ return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
203
+ case "array":
204
+ if (((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref) {
205
+ return new DynamicFormArrayModel(this.getFormArrayConfig(property, schema));
206
+ }
207
+ else if (((_b = property.items) === null || _b === void 0 ? void 0 : _b.enum) || property.enum) {
208
+ return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
209
+ }
210
+ else {
211
+ return new DynamicInputModel(this.getFormInputConfig(property, schema));
212
+ }
213
+ case "file":
214
+ return new DynamicFileUploadModel(this.getFormUploadConfig(property, schema));
215
+ }
216
+ if (property.$ref) {
217
+ return new DynamicFormGroupModel(this.getFormGroupConfig(property, schema));
218
+ }
219
+ return null;
220
+ }
221
+ getFormControlConfig(property, schema) {
222
+ const validators = this.getValidators(property, schema);
223
+ const errorMessages = Object.keys(validators).reduce((res, key) => {
224
+ res[key] = `error.${key}`;
225
+ return res;
226
+ }, {});
227
+ return {
228
+ id: property.id,
229
+ label: ObjectUtils.isString(property.label) ? property.label : property.id,
230
+ hidden: property.hidden,
231
+ disabled: property.disabled,
232
+ validators,
233
+ errorMessages,
234
+ additional: Object.assign({}, property)
235
+ };
236
+ }
237
+ getFormArrayConfig(property, schema) {
238
+ var _a;
239
+ const ref = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref || "";
240
+ const subSchema = this.schemas[ref.split("/").pop()];
241
+ return Object.assign(this.getFormControlConfig(property, schema), { groupFactory: () => this.getFormModelForSchemaDef(subSchema) });
242
+ }
243
+ getFormGroupConfig(property, schema) {
244
+ const ref = property.$ref || "";
245
+ const subSchema = this.schemas[ref.split("/").pop()];
246
+ return Object.assign(this.getFormControlConfig(property, schema), { group: this.getFormModelForSchemaDef(subSchema) });
247
+ }
248
+ getFormInputConfig(property, schema) {
249
+ var _a;
250
+ let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (((_a = property.items) === null || _a === void 0 ? void 0 : _a.type) || property.type);
251
+ switch (inputType) {
252
+ case "boolean":
253
+ inputType = "checkbox";
254
+ break;
255
+ case "textarea":
256
+ inputType = "textarea";
257
+ break;
258
+ case "integer":
259
+ inputType = "number";
260
+ break;
261
+ }
262
+ return Object.assign(this.getFormControlConfig(property, schema), {
263
+ inputType,
264
+ autoComplete: property.autoComplete || "off",
265
+ multiple: property.type == "array",
266
+ accept: ObjectUtils.isString(property.accept) ? property.accept : null,
267
+ mask: ObjectUtils.isString(property.mask) ? property.mask : null,
268
+ pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
269
+ step: isNaN(property.step) ? 1 : property.step,
270
+ min: isNaN(property.min) ? Number.MIN_SAFE_INTEGER : property.min,
271
+ max: isNaN(property.max) ? Number.MAX_SAFE_INTEGER : property.max,
272
+ });
273
+ }
274
+ getFormTextareaConfig(property, schema) {
275
+ return Object.assign(this.getFormControlConfig(property, schema), {
276
+ cols: property.cols || null,
277
+ rows: property.rows || 10,
278
+ wrap: property.wrap || false,
279
+ autoComplete: property.autoComplete || "off",
280
+ multiple: property.type == "array"
281
+ });
282
+ }
283
+ getFormSelectConfig(property, schema) {
284
+ return Object.assign(this.getFormControlConfig(property, schema), {
285
+ options: this.getFormSelectOptions(property, schema),
286
+ multiple: property.type == "array"
287
+ });
288
+ }
289
+ getFormCheckboxConfig(property, schema) {
290
+ return Object.assign(this.getFormControlConfig(property, schema), {
291
+ indeterminate: property.indeterminate === true
292
+ });
293
+ }
294
+ translateOptions(options) {
295
+ return __awaiter(this, void 0, void 0, function* () {
296
+ if (!options)
297
+ return [];
298
+ for (const option of options) {
299
+ option.label = yield this.language.getTranslation(option.label);
300
+ }
301
+ return options;
302
+ });
303
+ }
304
+ getFormSelectOptions(property, schema) {
305
+ var _a;
306
+ const $enum = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.enum) || property.enum;
307
+ if (property.optionsPath) {
308
+ return new FormSubject((formModel, control) => {
309
+ let path = property.optionsPath;
310
+ let target = control;
311
+ if (path.startsWith("$root")) {
312
+ path = path.substr(5);
313
+ while (target.parent) {
314
+ target = target.parent;
315
+ }
316
+ }
317
+ while (path.startsWith(".")) {
318
+ path = path.substr(1);
319
+ if (target.parent) {
320
+ target = target.parent;
321
+ }
322
+ }
323
+ const value = ObjectUtils.getValue(target.value, path);
324
+ const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => ({ value, label: value }));
325
+ return this.translateOptions(options);
326
+ });
327
+ }
328
+ if (ObjectUtils.isArray($enum)) {
329
+ return new FormSubject(() => {
330
+ const options = $enum.map(value => {
331
+ const label = property.translatable ? `${property.id}.${value}` : value;
332
+ return { value, label };
333
+ });
334
+ return this.translateOptions(options);
335
+ });
336
+ }
337
+ return new FormSubject(() => __awaiter(this, void 0, void 0, function* () {
338
+ this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {
339
+ return result.items.map(i => {
340
+ return { value: i.id || i._id, label: i[property.labelField] || i.label || i.id || i._id };
341
+ });
342
+ });
343
+ const options = (yield this.api.cache[property.endpoint]).map(t => Object.assign({}, t));
344
+ return this.translateOptions(options);
345
+ }));
346
+ }
347
+ getFormUploadConfig(property, schema) {
348
+ const url = this.api.url(property.url || "assets");
349
+ const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
350
+ return Object.assign(this.getFormControlConfig(property, schema), {
351
+ url,
352
+ accept,
353
+ autoUpload,
354
+ maxSize,
355
+ minSize,
356
+ removeUrl,
357
+ showFileList
358
+ });
359
+ }
360
+ getValidators(property, schema) {
361
+ const validators = {};
362
+ if (ObjectUtils.isArray(schema.required) && schema.required.indexOf(property.id) >= 0) {
363
+ validators.required = null;
364
+ }
365
+ if (property.minLength) {
366
+ validators.minLength = property.minLength;
367
+ }
368
+ if (property.maxLength) {
369
+ validators.maxLength = property.maxLength;
370
+ }
371
+ if (property.min) {
372
+ validators.min = property.min;
373
+ }
374
+ if (property.max) {
375
+ validators.max = property.max;
376
+ }
377
+ switch (property.format) {
378
+ case "email":
379
+ validators.email = null;
380
+ break;
381
+ }
382
+ return validators;
383
+ }
384
+ }
385
+ DynamicFormService.decorators = [
386
+ { type: Injectable }
387
+ ];
388
+ DynamicFormService.ctorParameters = () => [
389
+ { type: DynamicFormComponentService },
390
+ { type: DynamicFormValidationService },
391
+ { type: OpenApiService }
392
+ ];
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0gsb0JBQW9CLEVBRXBCLHNCQUFzQixFQUd0QiwyQkFBMkIsRUFFM0IscUJBQXFCLEVBSXJCLGtCQUFrQixJQUFJLElBQUksRUFDMUIsNEJBQTRCLEVBRzVCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3BCLHFCQUFxQixJQUFJLHlCQUF5QixFQUNyRCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFNSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLFdBQVcsRUFDZCxNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQThCLE1BQU0sbUNBQW1DLENBQUM7QUFHckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFheEMsWUFBWSxFQUErQixFQUFFLEVBQWdDLEVBQVcsT0FBdUI7UUFDM0csS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQURzRSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUUzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO0lBQ3BFLENBQUM7SUFkRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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RCxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDckIsS0FBSyxPQUFPO2dCQUNSLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixNQUFNO1NBQ2I7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOzs7WUFsWkosVUFBVTs7O1lBbkNQLDJCQUEyQjtZQU8zQiw0QkFBNEI7WUFtQjVCLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0NoZWNrYm94TW9kZWwsXHJcbiAgICBEeW5hbWljQ2hlY2tib3hNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsXHJcbiAgICBEeW5hbWljRmlsZVVwbG9hZE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXHJcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtU2VydmljZSBhcyBCYXNlLFxyXG4gICAgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcclxuICAgIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0lucHV0TW9kZWwsXHJcbiAgICBEeW5hbWljSW5wdXRNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbCxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNUZXh0QXJlYU1vZGVsLFxyXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbCBhcyBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlXHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICAgIElBcGlTZXJ2aWNlLFxyXG4gICAgSUxhbmd1YWdlU2VydmljZSxcclxuICAgIElPcGVuQXBpU2NoZW1hLFxyXG4gICAgSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSxcclxuICAgIElPcGVuQXBpU2NoZW1hcyxcclxuICAgIE9iamVjdFV0aWxzLFxyXG4gICAgT3BlbkFwaVNlcnZpY2UsXHJcbiAgICBTdHJpbmdVdGlsc1xyXG59IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcblxyXG5pbXBvcnQge0lGb3JtQ29udHJvbFNlcmlhbGl6ZXJ9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmltcG9ydCB7Rm9ybVN1YmplY3R9IGZyb20gXCIuLi91dGlscy9mb3JtLXN1YmplY3RcIjtcclxuaW1wb3J0IHtEeW5hbWljRm9ybUFycmF5TW9kZWwsIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1hcnJheS5tb2RlbFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XHJcblxyXG4gICAgZ2V0IGFwaSgpOiBJQXBpU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICByZWFkb25seSBvbkRldGVjdENoYW5nZXM6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbXBvbmVudD47XHJcbiAgICBwcm90ZWN0ZWQgc2NoZW1hczogSU9wZW5BcGlTY2hlbWFzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNzOiBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsIHZzOiBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlLCByZWFkb25seSBvcGVuQXBpOiBPcGVuQXBpU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNzLCB2cyk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29tcG9uZW50PigpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoR3JvdXAodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKE9iamVjdFV0aWxzLmNvcHkodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgY29tcG9uZW50Lm1vZGVsLCBjb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhjb21wb25lbnQpO1xyXG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBub3RpZnlDaGFuZ2VzKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVNlbGVjdE9wdGlvbnMoZm9ybUNvbnRyb2xNb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2xNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCkge1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGZvcm1Db250cm9sTW9kZWwub3B0aW9ucyQ7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAob3B0aW9ucyBpbnN0YW5jZW9mIFN1YmplY3QgJiYgb3B0aW9ucy5zb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnNvdXJjZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmeShmb3JtQ29udHJvbE1vZGVsLCBmb3JtQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm0uZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRlY3RDaGFuZ2VzKGZvcm1Db21wb25lbnQ/OiBEeW5hbWljRm9ybUNvbXBvbmVudCkge1xyXG4gICAgICAgIHN1cGVyLmRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMuZW1pdChmb3JtQ29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZTogYW55LCBmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5SWQoa2V5LCBmb3JtTW9kZWwpO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIGlmICghc3ViTW9kZWwpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWwgJiYgT2JqZWN0VXRpbHMuaXNPYmplY3Qoc3ViVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gc3ViVmFsdWUuaWQgfHwgc3ViVmFsdWUuX2lkIHx8IHN1YlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3ViTW9kZWwuc2l6ZSA+IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUoc3ViVmFsdWVbaV0sIGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZSwgc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBzZXJpYWxpemVSZWN1cnNpdmUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKCFmb3JtTW9kZWwgfHwgIWZvcm1Hcm91cCB8fCAhZm9ybUdyb3VwLnZhbHVlKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBmb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBzdWJNb2RlbC5hZGRpdGlvbmFsPy5zZXJpYWxpemVyIGFzIElGb3JtQ29udHJvbFNlcmlhbGl6ZXI7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKHNlcmlhbGl6ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gYXdhaXQgc2VyaWFsaXplcihzdWJNb2RlbCwgc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBBcnJheS5pc0FycmF5KHN1YkNvbnRyb2wudmFsdWUpID8gc3ViQ29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc0FycmF5ID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gcmVzQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0lucHV0TW9kZWwgJiYgIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKHN1YkNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gc3ViTW9kZWwuaW5wdXRUeXBlID09IFwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlRmxvYXQoKGAke3N1YkNvbnRyb2wudmFsdWV9YCB8fCBcIjBcIikucmVwbGFjZSgvLC9naSwgXCIuXCIpKSB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzdWJDb250cm9sLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1YkNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXApIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gZm9ybU1vZGVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk1vZGVsID0gZm9ybU1vZGVsW2ldIGFzIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWw8YW55PjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBBcnJheS5pc0FycmF5KHN1YkNvbnRyb2wudmFsdWUpID8gc3ViQ29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTW9kZWwgPSBzdWJNb2RlbC5nZXQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKHN1Yk1vZGVsLmdyb3VwLCBzdWJDb250cm9sIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdE9wdGlvbnMoc3ViTW9kZWwsIHN1YkNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtR3JvdXApIHJldHVybjtcclxuICAgICAgICBmb3JtR3JvdXAubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgICAgICBjb25zdCBjb250cm9scyA9IE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykubWFwKGlkID0+IGZvcm1Hcm91cC5jb250cm9sc1tpZF0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChjb250cm9sKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEZvcm1Nb2RlbEZvclNjaGVtYShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPER5bmFtaWNGb3JtTW9kZWw+IHtcclxuICAgICAgICB0aGlzLmFwaS5jYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2NoZW1hcyA9IGF3YWl0IHRoaXMub3BlbkFwaS5nZXRTY2hlbWFzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHRoaXMuc2NoZW1hc1tuYW1lXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0Zvcm1Nb2RlbCB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMgfHwge30pLm1hcChwID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzY2hlbWEucHJvcGVydGllc1twXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUNvbnRyb2xNb2RlbChwcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgICAgICB9KS5maWx0ZXIodCA9PiBudWxsICE9PSB0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUNvbnRyb2xNb2RlbChwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eS5lbnVtKSB8fCBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5vcHRpb25zUGF0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNUZXh0QXJlYU1vZGVsKHRoaXMuZ2V0Rm9ybVRleHRhcmVhQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0NoZWNrYm94TW9kZWwodGhpcy5nZXRGb3JtQ2hlY2tib3hDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlzdFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pdGVtcz8uJHJlZiB8fCBwcm9wZXJ0eS4kcmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUFycmF5TW9kZWwodGhpcy5nZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pdGVtcz8uZW51bSB8fCBwcm9wZXJ0eS5lbnVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbCh0aGlzLmdldEZvcm1VcGxvYWRDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvcGVydHkuJHJlZikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNGb3JtR3JvdXBNb2RlbCh0aGlzLmdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXModmFsaWRhdG9ycykucmVkdWNlKChyZXMsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICByZXNba2V5XSA9IGBlcnJvci4ke2tleX1gO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogcHJvcGVydHkuaWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5sYWJlbCkgPyBwcm9wZXJ0eS5sYWJlbCA6IHByb3BlcnR5LmlkLFxyXG4gICAgICAgICAgICBoaWRkZW46IHByb3BlcnR5LmhpZGRlbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHByb3BlcnR5LmRpc2FibGVkLFxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0eSlcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge2dyb3VwRmFjdG9yeTogKCkgPT4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYoc3ViU2NoZW1hKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybUdyb3VwTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge2dyb3VwOiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnIHtcclxuICAgICAgICBsZXQgaW5wdXRUeXBlID0gU3RyaW5nVXRpbHMuaGFzKHByb3BlcnR5LmlkLCBcInBhc3N3b3JkXCIsIFwiUGFzc3dvcmRcIikgPyBcInBhc3N3b3JkXCIgOiAocHJvcGVydHkuaXRlbXM/LnR5cGUgfHwgcHJvcGVydHkudHlwZSk7XHJcbiAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwiY2hlY2tib3hcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwidGV4dGFyZWFcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW50ZWdlclwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxyXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5tYXNrKSA/IHByb3BlcnR5Lm1hc2sgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkucGF0dGVybikgPyBwcm9wZXJ0eS5wYXR0ZXJuIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHByb3BlcnR5LnN0ZXApID8gMSA6IHByb3BlcnR5LnN0ZXAsXHJcbiAgICAgICAgICAgICAgICBtaW46IGlzTmFOKHByb3BlcnR5Lm1pbikgPyBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiA6IHByb3BlcnR5Lm1pbixcclxuICAgICAgICAgICAgICAgIG1heDogaXNOYU4ocHJvcGVydHkubWF4KSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogcHJvcGVydHkubWF4LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVRleHRhcmVhQ29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb2xzOiBwcm9wZXJ0eS5jb2xzIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICByb3dzOiBwcm9wZXJ0eS5yb3dzIHx8IDEwLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogcHJvcGVydHkud3JhcCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZTogcHJvcGVydHkuYXV0b0NvbXBsZXRlIHx8IFwib2ZmXCIsXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljU2VsZWN0TW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogcHJvcGVydHkuaW5kZXRlcm1pbmF0ZSA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zOiBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZzxhbnk+W10pOiBQcm9taXNlPER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4ge1xyXG4gICAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgb3B0aW9uLmxhYmVsID0gYXdhaXQgdGhpcy5sYW5ndWFnZS5nZXRUcmFuc2xhdGlvbihvcHRpb24ubGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpIHtcclxuICAgICAgICBjb25zdCAkZW51bSA9IHByb3BlcnR5Lml0ZW1zPy5lbnVtIHx8IHByb3BlcnR5LmVudW07XHJcbiAgICAgICAgaWYgKHByb3BlcnR5Lm9wdGlvbnNQYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybVN1YmplY3QoKGZvcm1Nb2RlbCwgY29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBjb250cm9sO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIiRyb290XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdFV0aWxzLmdldFZhbHVlKHRhcmdldC52YWx1ZSwgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKCFPYmplY3RVdGlscy5pc0FycmF5KHZhbHVlKSA/IFtdOiB2YWx1ZSkubWFwKHZhbHVlID0+ICh7dmFsdWUsIGxhYmVsOiB2YWx1ZX0pKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNBcnJheSgkZW51bSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHByb3BlcnR5LnRyYW5zbGF0YWJsZSA/IGAke3Byb3BlcnR5LmlkfS4ke3ZhbHVlfWAgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3ZhbHVlLCBsYWJlbH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEZvcm1TdWJqZWN0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdID0gdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdIHx8IHRoaXMuYXBpLmxpc3QocHJvcGVydHkuZW5kcG9pbnQsIHRoaXMuYXBpLm1ha2VMaXN0UGFyYW1zKDEsIC0xKSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogaS5pZCB8fCBpLl9pZCwgbGFiZWw6IGlbcHJvcGVydHkubGFiZWxGaWVsZF0gfHwgaS5sYWJlbCB8fCBpLmlkIHx8IGkuX2lkfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhd2FpdCB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0pLm1hcCh0ID0+IE9iamVjdC5hc3NpZ24oe30sIHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYXBpLnVybChwcm9wZXJ0eS51cmwgfHwgXCJhc3NldHNcIik7XHJcbiAgICAgICAgY29uc3Qge2FjY2VwdCwgYXV0b1VwbG9hZCwgbWF4U2l6ZSwgbWluU2l6ZSwgcmVtb3ZlVXJsLCBzaG93RmlsZUxpc3R9ID0gcHJvcGVydHk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xyXG4gICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgIGFjY2VwdCxcclxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcclxuICAgICAgICAgICAgbWF4U2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxyXG4gICAgICAgICAgICBzaG93RmlsZUxpc3RcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgJiYgc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5yZXF1aXJlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW5MZW5ndGggPSBwcm9wZXJ0eS5taW5MZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXhMZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXhMZW5ndGggPSBwcm9wZXJ0eS5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW4pIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW4gPSBwcm9wZXJ0eS5taW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXggPSBwcm9wZXJ0eS5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkuZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcbn1cclxuIl19