kwikid-forms 0.1.20 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/kwikid-forms.umd.js +2759 -2739
- package/bundles/kwikid-forms.umd.js.map +1 -1
- package/esm2015/lib/renderer/config-converter.helper.js +661 -0
- package/esm2015/lib/renderer/form-view/form-view.component.js +40 -59
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +4 -1
- package/esm2015/lib/renderer/renderer.component.js +54 -24
- package/fesm2015/kwikid-forms.js +2013 -1981
- package/fesm2015/kwikid-forms.js.map +1 -1
- package/lib/renderer/{renderer.config-converter.helper.d.ts → config-converter.helper.d.ts} +2 -0
- package/lib/renderer/form-view/form-view.component.d.ts +8 -4
- package/lib/renderer/renderer.component.d.ts +2 -2
- package/package.json +3 -3
- package/esm2015/lib/renderer/renderer.config-converter.helper.js +0 -641
|
@@ -1,641 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { TuiDay } from "@taiga-ui/cdk";
|
|
3
|
-
import { checkObjectKeyExists, isEmptyValue, isNotEmptyValue, logMethod } from "kwikid-toolkit";
|
|
4
|
-
import { convertFormFieldTypeDateToKwikUIFormat } from "./form-view/helpers/form-view.fields.helper";
|
|
5
|
-
export class Converter {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.getFormFields = (formConfig) => {
|
|
8
|
-
let fields;
|
|
9
|
-
if (checkObjectKeyExists(formConfig, "multiForm")) {
|
|
10
|
-
fields = formConfig.multiForm.fields;
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
fields = formConfig.fields;
|
|
14
|
-
}
|
|
15
|
-
return fields;
|
|
16
|
-
};
|
|
17
|
-
this.setMissingFieldKeyValue = (field, key, value) => {
|
|
18
|
-
if (!checkObjectKeyExists(field, key)) {
|
|
19
|
-
field[key] = value;
|
|
20
|
-
}
|
|
21
|
-
return field;
|
|
22
|
-
};
|
|
23
|
-
this.setFieldKeyValue = (field, key, value) => {
|
|
24
|
-
field[key] = value;
|
|
25
|
-
return field;
|
|
26
|
-
};
|
|
27
|
-
this.removeFieldKey = (field, key) => {
|
|
28
|
-
if (checkObjectKeyExists(field, key)) {
|
|
29
|
-
delete field[key];
|
|
30
|
-
}
|
|
31
|
-
return field;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
convertFormConfig(formConfig) {
|
|
35
|
-
const updateOnFieldType = (field) => {
|
|
36
|
-
const formatFieldTypeHtml = (field) => {
|
|
37
|
-
field = this.setFieldKeyValue(field, "isFormElement", false);
|
|
38
|
-
return field;
|
|
39
|
-
};
|
|
40
|
-
const formatFieldTypeTitle = (field) => {
|
|
41
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
42
|
-
field = this.setFieldKeyValue(field, "isFormElement", false);
|
|
43
|
-
return field;
|
|
44
|
-
};
|
|
45
|
-
const formatFieldTypeText = (field) => {
|
|
46
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
47
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "case", "default");
|
|
48
|
-
return field;
|
|
49
|
-
};
|
|
50
|
-
const formatFieldTypeCheckbox = (field) => {
|
|
51
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
52
|
-
return field;
|
|
53
|
-
};
|
|
54
|
-
const formatFieldTypeNumber = (field) => {
|
|
55
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
56
|
-
if (checkObjectKeyExists(field, "key")) {
|
|
57
|
-
if (field.key === "aadhaar_number") {
|
|
58
|
-
field = this.setFieldKeyValue(field, "type", "aadhaar_number");
|
|
59
|
-
}
|
|
60
|
-
if (field.key === "contact_number") {
|
|
61
|
-
field = this.setFieldKeyValue(field, "type", "phone");
|
|
62
|
-
}
|
|
63
|
-
if (field.type === "phone" || field.type === "number") {
|
|
64
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "countryCode", "+91");
|
|
65
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "phoneMaskAfterCountryCode", "####-######");
|
|
66
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "removeCountryCodeFromValue", true);
|
|
67
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "decimal", "never");
|
|
68
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "prefix", "");
|
|
69
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "postfix", "");
|
|
70
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "min", -Infinity);
|
|
71
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "max", Infinity);
|
|
72
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "precision", 2);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
76
|
-
return field;
|
|
77
|
-
};
|
|
78
|
-
const formatFieldTypeDate = (field) => {
|
|
79
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
80
|
-
if (checkObjectKeyExists(field, "min")) {
|
|
81
|
-
const tuiDay = convertFormFieldTypeDateToKwikUIFormat(field["min"]);
|
|
82
|
-
field.properties = this.setFieldKeyValue(field.properties, "min", tuiDay);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "min", new TuiDay(0, 0, 1)); // Year - 0000, Month - 0 (0 Indexing), Day - 1
|
|
86
|
-
}
|
|
87
|
-
if (checkObjectKeyExists(field, "max")) {
|
|
88
|
-
const tuiDay = convertFormFieldTypeDateToKwikUIFormat(field["max"]);
|
|
89
|
-
field.properties = this.setFieldKeyValue(field.properties, "max", tuiDay);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "max", new TuiDay(new Date().getFullYear(), // Year - 9999
|
|
93
|
-
new Date().getMonth(), // Month - 11 (0 Indexing)
|
|
94
|
-
new Date().getDate() // Day - 31
|
|
95
|
-
));
|
|
96
|
-
}
|
|
97
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "placeholder", "");
|
|
98
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
99
|
-
return field;
|
|
100
|
-
};
|
|
101
|
-
const formatFieldTypePhone = (field) => {
|
|
102
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
103
|
-
return field;
|
|
104
|
-
};
|
|
105
|
-
const formatFieldTypeRadio = (field) => {
|
|
106
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
107
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "size", "m");
|
|
108
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "orientation", "vertical");
|
|
109
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
110
|
-
field.options = field.options.map((x) => {
|
|
111
|
-
if (typeof x === "string" || typeof x === "number") {
|
|
112
|
-
return { label: x, disabled: false, description: "" };
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
if (checkObjectKeyExists(x, "label") &&
|
|
116
|
-
checkObjectKeyExists(x, "disabled") &&
|
|
117
|
-
checkObjectKeyExists(x, "description")) {
|
|
118
|
-
return x;
|
|
119
|
-
}
|
|
120
|
-
if (!checkObjectKeyExists(x, "disabled")) {
|
|
121
|
-
x = Object.assign(Object.assign({}, x), { disabled: false });
|
|
122
|
-
}
|
|
123
|
-
if (!checkObjectKeyExists(x, "description")) {
|
|
124
|
-
x = Object.assign(Object.assign({}, x), { description: false });
|
|
125
|
-
}
|
|
126
|
-
return x;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
return field;
|
|
130
|
-
};
|
|
131
|
-
const formatFieldTypeSearchText = (field) => {
|
|
132
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
133
|
-
if (checkObjectKeyExists(field, "type")) {
|
|
134
|
-
if (field.type === "search-text") {
|
|
135
|
-
field = this.setFieldKeyValue(field, "type", "dropdown-with-search");
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return field;
|
|
139
|
-
};
|
|
140
|
-
const formatFieldTypeDropdownWithSearch = (field) => {
|
|
141
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
142
|
-
return field;
|
|
143
|
-
};
|
|
144
|
-
const formatFieldTypeApiCall = (field) => {
|
|
145
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
146
|
-
if (!checkObjectKeyExists(field.properties, "shape")) {
|
|
147
|
-
field.properties = this.setFieldKeyValue(field.properties, "shape", null);
|
|
148
|
-
}
|
|
149
|
-
if (!checkObjectKeyExists(field, "showLoader")) {
|
|
150
|
-
field = this.setFieldKeyValue(field, "showLoader", false);
|
|
151
|
-
}
|
|
152
|
-
if (!checkObjectKeyExists(field.properties, "size")) {
|
|
153
|
-
field.properties = this.setFieldKeyValue(field.properties, "size", "m");
|
|
154
|
-
}
|
|
155
|
-
if (!checkObjectKeyExists(field, "api")) {
|
|
156
|
-
field = this.setFieldKeyValue(field, "api", {});
|
|
157
|
-
field.api = this.setMissingFieldKeyValue(field.api, "url", "");
|
|
158
|
-
field.api = this.setMissingFieldKeyValue(field.api, "request", "");
|
|
159
|
-
field.api = this.setMissingFieldKeyValue(field.api, "response", "");
|
|
160
|
-
field.api = this.setMissingFieldKeyValue(field.api, "status", "");
|
|
161
|
-
field.api.status = this.setMissingFieldKeyValue(field.api.status, "value", "default");
|
|
162
|
-
field.api.status = this.setMissingFieldKeyValue(field.api.status, "labels", {
|
|
163
|
-
default: "Call API",
|
|
164
|
-
loading: "Call API",
|
|
165
|
-
success: "API Success",
|
|
166
|
-
failed: "API Failed"
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
return field;
|
|
170
|
-
};
|
|
171
|
-
const formatFieldTypeOtp = (field) => {
|
|
172
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
173
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "mask", new Array(field.properties.otpLength).fill("#").join(" "));
|
|
174
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
175
|
-
return field;
|
|
176
|
-
};
|
|
177
|
-
const formatFieldTypeAadhaarNumber = (field) => {
|
|
178
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
179
|
-
return field;
|
|
180
|
-
};
|
|
181
|
-
switch (field.type) {
|
|
182
|
-
case "html":
|
|
183
|
-
field = formatFieldTypeHtml(field);
|
|
184
|
-
break;
|
|
185
|
-
case "title":
|
|
186
|
-
field = formatFieldTypeTitle(field);
|
|
187
|
-
break;
|
|
188
|
-
case "text":
|
|
189
|
-
field = formatFieldTypeText(field);
|
|
190
|
-
break;
|
|
191
|
-
case "checkbox":
|
|
192
|
-
field = formatFieldTypeCheckbox(field);
|
|
193
|
-
break;
|
|
194
|
-
case "number":
|
|
195
|
-
field = formatFieldTypeNumber(field);
|
|
196
|
-
break;
|
|
197
|
-
case "date":
|
|
198
|
-
field = formatFieldTypeDate(field);
|
|
199
|
-
break;
|
|
200
|
-
case "phone":
|
|
201
|
-
field = formatFieldTypePhone(field);
|
|
202
|
-
break;
|
|
203
|
-
case "radio":
|
|
204
|
-
field = formatFieldTypeRadio(field);
|
|
205
|
-
break;
|
|
206
|
-
case "search-text":
|
|
207
|
-
field = formatFieldTypeSearchText(field);
|
|
208
|
-
break;
|
|
209
|
-
case "dropdown-with-search":
|
|
210
|
-
field = formatFieldTypeDropdownWithSearch(field);
|
|
211
|
-
break;
|
|
212
|
-
case "api-call":
|
|
213
|
-
field = formatFieldTypeApiCall(field);
|
|
214
|
-
break;
|
|
215
|
-
case "otp":
|
|
216
|
-
field = formatFieldTypeOtp(field);
|
|
217
|
-
break;
|
|
218
|
-
case "aadhaar-number":
|
|
219
|
-
field = formatFieldTypeAadhaarNumber(field);
|
|
220
|
-
break;
|
|
221
|
-
default:
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
return field;
|
|
225
|
-
};
|
|
226
|
-
const getConnectedelementTypeValueObject = (key) => {
|
|
227
|
-
const object = {
|
|
228
|
-
key: key,
|
|
229
|
-
conditions: { formula: "", rules: [] },
|
|
230
|
-
actions: { success: [], failure: [] }
|
|
231
|
-
};
|
|
232
|
-
return object;
|
|
233
|
-
};
|
|
234
|
-
const formatFieldKeys = (field) => {
|
|
235
|
-
if (checkObjectKeyExists(field, "connectedTo")) {
|
|
236
|
-
if (typeof field["connectedTo"] === "string") {
|
|
237
|
-
field["connectedElements"] = [
|
|
238
|
-
getConnectedelementTypeValueObject(field["connectedTo"])
|
|
239
|
-
];
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
field["connectedTo"] = field["connectedTo"].map((key) => {
|
|
243
|
-
return getConnectedelementTypeValueObject(key);
|
|
244
|
-
});
|
|
245
|
-
field["connectedElements"] = field["connectedTo"];
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
this.removeFieldKey(field, "connectedTo");
|
|
249
|
-
if (checkObjectKeyExists(field, "connectedToParent")) {
|
|
250
|
-
if (typeof field["connectedToParent"] === "string") {
|
|
251
|
-
field["connectedParentFields"] = [
|
|
252
|
-
getConnectedelementTypeValueObject(field["connectedToParent"])
|
|
253
|
-
];
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
field["connectedParentFields"] = getConnectedelementTypeValueObject(field["connectedToParent"]);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
this.removeFieldKey(field, "connectedToParent");
|
|
260
|
-
this.removeFieldKey(field, "sideEffect");
|
|
261
|
-
return field;
|
|
262
|
-
};
|
|
263
|
-
const getConnectedElementFieldMapping = (field, connectedFieldMapping) => {
|
|
264
|
-
const getConnectedElementChildFieldMapping = (field, connectedFieldMapping) => {
|
|
265
|
-
if (checkObjectKeyExists(field, "connectedElements")) {
|
|
266
|
-
connectedFieldMapping["child"][field.key] = field.connectedElements;
|
|
267
|
-
}
|
|
268
|
-
else if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
269
|
-
field["connectedElements"] =
|
|
270
|
-
connectedFieldMapping["child"][field.key];
|
|
271
|
-
}
|
|
272
|
-
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
273
|
-
};
|
|
274
|
-
const getConnectedElementParentFieldMapping = (field, connectedFieldMapping) => {
|
|
275
|
-
if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
276
|
-
for (let connectedParentKey of connectedFieldMapping["child"][field.key]) {
|
|
277
|
-
if (checkObjectKeyExists(connectedFieldMapping["parent"], connectedParentKey["key"])) {
|
|
278
|
-
connectedFieldMapping["parent"][connectedParentKey["key"]].push(field.key);
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
connectedFieldMapping["parent"][connectedParentKey["key"]] = [
|
|
282
|
-
field.key
|
|
283
|
-
];
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
288
|
-
};
|
|
289
|
-
const connectedChildFieldMapping = getConnectedElementChildFieldMapping(field, connectedFieldMapping);
|
|
290
|
-
field = connectedChildFieldMapping["field"];
|
|
291
|
-
connectedFieldMapping =
|
|
292
|
-
connectedChildFieldMapping["connectedFieldMapping"];
|
|
293
|
-
const connectedParentFieldMapping = getConnectedElementParentFieldMapping(field, connectedFieldMapping);
|
|
294
|
-
field = connectedParentFieldMapping["field"];
|
|
295
|
-
connectedFieldMapping =
|
|
296
|
-
connectedParentFieldMapping["connectedFieldMapping"];
|
|
297
|
-
return connectedFieldMapping;
|
|
298
|
-
};
|
|
299
|
-
const updateConnectedElementsKeyValue = (field, connectedFieldMapping) => {
|
|
300
|
-
if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
301
|
-
field["connectedElements"] = connectedFieldMapping["child"][field.key];
|
|
302
|
-
}
|
|
303
|
-
if (checkObjectKeyExists(connectedFieldMapping["parent"], field.key)) {
|
|
304
|
-
field["connectedParentFields"] =
|
|
305
|
-
connectedFieldMapping["parent"][field.key];
|
|
306
|
-
}
|
|
307
|
-
return field;
|
|
308
|
-
};
|
|
309
|
-
const updateFieldValidatorConfig = (field) => {
|
|
310
|
-
var _a, _b, _c, _d, _e;
|
|
311
|
-
if (field.isFormElement) {
|
|
312
|
-
const validators = checkObjectKeyExists(field, "validators")
|
|
313
|
-
? field.validators
|
|
314
|
-
: {};
|
|
315
|
-
field = this.setMissingFieldKeyValue(field, "validators", {});
|
|
316
|
-
field = this.setFieldKeyValue(field, "validators", Object.assign(Object.assign({}, field["validators"]), { min: checkObjectKeyExists(validators, "min")
|
|
317
|
-
? isNotEmptyValue(validators.min)
|
|
318
|
-
? Number(validators.min)
|
|
319
|
-
: null
|
|
320
|
-
: checkObjectKeyExists(field, "min")
|
|
321
|
-
? Number(field.min)
|
|
322
|
-
: null, max: checkObjectKeyExists(validators, "max")
|
|
323
|
-
? isNotEmptyValue(validators.max)
|
|
324
|
-
? Number(validators.max)
|
|
325
|
-
: null
|
|
326
|
-
: checkObjectKeyExists(field, "max")
|
|
327
|
-
? Number(field.max)
|
|
328
|
-
: null, required: checkObjectKeyExists(validators, "required")
|
|
329
|
-
? Boolean(validators.required)
|
|
330
|
-
: checkObjectKeyExists(field, "required")
|
|
331
|
-
? Boolean(field.required)
|
|
332
|
-
: false, minLength: checkObjectKeyExists(validators, "minLength")
|
|
333
|
-
? isNotEmptyValue(validators.minLength)
|
|
334
|
-
? Number(validators.minLength)
|
|
335
|
-
: null
|
|
336
|
-
: checkObjectKeyExists(field, "minLength")
|
|
337
|
-
? Number(field.minLength)
|
|
338
|
-
: null, maxLength: checkObjectKeyExists(validators, "maxLength")
|
|
339
|
-
? isNotEmptyValue(validators.maxLength)
|
|
340
|
-
? Number(validators.maxLength)
|
|
341
|
-
: null
|
|
342
|
-
: checkObjectKeyExists(field, "length")
|
|
343
|
-
? Number(field.length)
|
|
344
|
-
: checkObjectKeyExists(field, "maxLength")
|
|
345
|
-
? Number(field.maxLength)
|
|
346
|
-
: null, pattern: checkObjectKeyExists(validators, "pattern")
|
|
347
|
-
? isNotEmptyValue(validators.pattern)
|
|
348
|
-
? validators.pattern
|
|
349
|
-
: undefined
|
|
350
|
-
: checkObjectKeyExists(field, "pattern")
|
|
351
|
-
? { key: "CUSTOM", pattern: String(field.pattern) }
|
|
352
|
-
: checkObjectKeyExists(field, "regex")
|
|
353
|
-
? { key: "CUSTOM", pattern: String(field.regex) }
|
|
354
|
-
: undefined }));
|
|
355
|
-
delete field.min;
|
|
356
|
-
delete field.max;
|
|
357
|
-
delete field.required;
|
|
358
|
-
delete field.minLength;
|
|
359
|
-
delete field.length;
|
|
360
|
-
delete field.maxLength;
|
|
361
|
-
delete field.pattern;
|
|
362
|
-
delete field.regex;
|
|
363
|
-
switch (field.type) {
|
|
364
|
-
case "text":
|
|
365
|
-
delete field.validators.min;
|
|
366
|
-
delete field.validators.max;
|
|
367
|
-
break;
|
|
368
|
-
default:
|
|
369
|
-
break;
|
|
370
|
-
}
|
|
371
|
-
if (isEmptyValue((_a = field.validators) === null || _a === void 0 ? void 0 : _a.min)) {
|
|
372
|
-
delete field.validators.min;
|
|
373
|
-
}
|
|
374
|
-
if (isEmptyValue((_b = field.validators) === null || _b === void 0 ? void 0 : _b.max)) {
|
|
375
|
-
delete field.validators.min;
|
|
376
|
-
}
|
|
377
|
-
if (isEmptyValue((_c = field.validators) === null || _c === void 0 ? void 0 : _c.minLength)) {
|
|
378
|
-
delete field.validators.minLength;
|
|
379
|
-
}
|
|
380
|
-
if (isEmptyValue((_d = field.validators) === null || _d === void 0 ? void 0 : _d.maxLength)) {
|
|
381
|
-
delete field.validators.maxLength;
|
|
382
|
-
}
|
|
383
|
-
if (isEmptyValue((_e = field.validators) === null || _e === void 0 ? void 0 : _e.pattern)) {
|
|
384
|
-
delete field.validators.pattern;
|
|
385
|
-
}
|
|
386
|
-
field.focus = false;
|
|
387
|
-
field.invalid = false;
|
|
388
|
-
}
|
|
389
|
-
return field;
|
|
390
|
-
};
|
|
391
|
-
const updateFieldDefaultValueConfig = (field) => {
|
|
392
|
-
if (field.isFormElement) {
|
|
393
|
-
if (checkObjectKeyExists(field, "defaultValue")) {
|
|
394
|
-
return field;
|
|
395
|
-
}
|
|
396
|
-
else if (checkObjectKeyExists(field, "default")) {
|
|
397
|
-
return field;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
if (checkObjectKeyExists(field, "defaultVal")) {
|
|
401
|
-
// Currently below line is commented because it caused issues in setting Default Value.
|
|
402
|
-
// field["defaultValue"] = field["defaultVal"];
|
|
403
|
-
// delete field["defaultVal"];
|
|
404
|
-
}
|
|
405
|
-
// TODO: Condition for all_forms_data is not considered yet.
|
|
406
|
-
if (field.autoPopulateFromSummaryData) {
|
|
407
|
-
field["defaultValue"] = {
|
|
408
|
-
is_found: false,
|
|
409
|
-
value: "",
|
|
410
|
-
sources: [
|
|
411
|
-
{
|
|
412
|
-
source: "summary_data",
|
|
413
|
-
summary_data: {
|
|
414
|
-
path: `$.${field.key}`,
|
|
415
|
-
validation: {
|
|
416
|
-
rules: [
|
|
417
|
-
{
|
|
418
|
-
key: "1",
|
|
419
|
-
type: "is_not_empty",
|
|
420
|
-
is_not_empty: {
|
|
421
|
-
value: true
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
],
|
|
425
|
-
actions: [
|
|
426
|
-
{
|
|
427
|
-
type: "set_default_value_found",
|
|
428
|
-
condition: "1",
|
|
429
|
-
set_default_value_found: {
|
|
430
|
-
value: true
|
|
431
|
-
}
|
|
432
|
-
},
|
|
433
|
-
{
|
|
434
|
-
type: "enable_field",
|
|
435
|
-
condition: "1 OR NOT(1)",
|
|
436
|
-
enable_field: { value: true }
|
|
437
|
-
}
|
|
438
|
-
]
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
]
|
|
443
|
-
};
|
|
444
|
-
}
|
|
445
|
-
else if (checkObjectKeyExists(field, "autofill")) {
|
|
446
|
-
if (checkObjectKeyExists(field.autofill, "type")) {
|
|
447
|
-
if (field.autofill.type === "storage") {
|
|
448
|
-
field["defaultValue"] = {
|
|
449
|
-
is_found: false,
|
|
450
|
-
value: "",
|
|
451
|
-
sources: [
|
|
452
|
-
{
|
|
453
|
-
source: "browser_storage",
|
|
454
|
-
browser_storage: {
|
|
455
|
-
path: `$.${field.key}`,
|
|
456
|
-
validation: {
|
|
457
|
-
rules: [
|
|
458
|
-
{
|
|
459
|
-
key: "1",
|
|
460
|
-
type: "is_not_empty",
|
|
461
|
-
is_not_empty: {
|
|
462
|
-
value: true
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
],
|
|
466
|
-
actions: [
|
|
467
|
-
{
|
|
468
|
-
type: "set_default_value_found",
|
|
469
|
-
condition: "1",
|
|
470
|
-
set_default_value_found: {
|
|
471
|
-
value: true
|
|
472
|
-
}
|
|
473
|
-
},
|
|
474
|
-
{
|
|
475
|
-
type: "enable_field",
|
|
476
|
-
condition: "1 OR NOT(1)",
|
|
477
|
-
enable_field: { value: true }
|
|
478
|
-
}
|
|
479
|
-
]
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
]
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
else if (field.autofill.type === "config") {
|
|
487
|
-
field["defaultValue"] = {
|
|
488
|
-
is_found: false,
|
|
489
|
-
value: "",
|
|
490
|
-
sources: [
|
|
491
|
-
{
|
|
492
|
-
source: "field_config",
|
|
493
|
-
field_config: {
|
|
494
|
-
path: `$.${field.key}`,
|
|
495
|
-
validation: {
|
|
496
|
-
rules: [
|
|
497
|
-
{
|
|
498
|
-
key: "1",
|
|
499
|
-
type: "is_not_empty",
|
|
500
|
-
is_not_empty: {
|
|
501
|
-
value: true
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
],
|
|
505
|
-
actions: [
|
|
506
|
-
{
|
|
507
|
-
type: "set_default_value_found",
|
|
508
|
-
condition: "1",
|
|
509
|
-
set_default_value_found: {
|
|
510
|
-
value: true
|
|
511
|
-
}
|
|
512
|
-
},
|
|
513
|
-
{
|
|
514
|
-
type: "enable_field",
|
|
515
|
-
condition: "1 OR NOT(1)",
|
|
516
|
-
enable_field: { value: true }
|
|
517
|
-
}
|
|
518
|
-
]
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
]
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
field["defaultValue"] = {
|
|
529
|
-
is_found: false,
|
|
530
|
-
value: "",
|
|
531
|
-
sources: [
|
|
532
|
-
{
|
|
533
|
-
source: "form_data",
|
|
534
|
-
form_data: {
|
|
535
|
-
path: `$.${field.key}`,
|
|
536
|
-
validation: {
|
|
537
|
-
rules: [
|
|
538
|
-
{
|
|
539
|
-
key: "1",
|
|
540
|
-
type: "is_not_empty",
|
|
541
|
-
is_not_empty: {
|
|
542
|
-
value: true
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
],
|
|
546
|
-
actions: [
|
|
547
|
-
{
|
|
548
|
-
type: "set_default_value_found",
|
|
549
|
-
condition: "1",
|
|
550
|
-
set_default_value_found: {
|
|
551
|
-
value: true
|
|
552
|
-
}
|
|
553
|
-
},
|
|
554
|
-
{
|
|
555
|
-
type: "enable_field",
|
|
556
|
-
condition: "1 OR NOT(1)",
|
|
557
|
-
enable_field: { value: true }
|
|
558
|
-
}
|
|
559
|
-
]
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
]
|
|
564
|
-
};
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
delete field["defaultVal"];
|
|
568
|
-
}
|
|
569
|
-
return field;
|
|
570
|
-
};
|
|
571
|
-
const updateFieldMessages = (field) => {
|
|
572
|
-
if (field.isFormElement) {
|
|
573
|
-
field = this.setMissingFieldKeyValue(field, "messages", []);
|
|
574
|
-
}
|
|
575
|
-
return field;
|
|
576
|
-
};
|
|
577
|
-
const updateFieldResetButton = (field) => {
|
|
578
|
-
if (field.isFormElement) {
|
|
579
|
-
if (checkObjectKeyExists(field, "action") &&
|
|
580
|
-
field.action === "reset" &&
|
|
581
|
-
checkObjectKeyExists(field, "fields")) {
|
|
582
|
-
field = this.setFieldKeyValue(field, "reset", {
|
|
583
|
-
fields: field.fields
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
return field;
|
|
588
|
-
};
|
|
589
|
-
const setFormFields = (formConfig, fields) => {
|
|
590
|
-
if (checkObjectKeyExists(formConfig, "multiForm")) {
|
|
591
|
-
formConfig.multiForm["fields"] = fields;
|
|
592
|
-
}
|
|
593
|
-
else {
|
|
594
|
-
formConfig["fields"] = fields;
|
|
595
|
-
}
|
|
596
|
-
return formConfig;
|
|
597
|
-
};
|
|
598
|
-
const setFormFieldGroups = (formConfig, groups) => {
|
|
599
|
-
formConfig["fieldGroups"] = groups;
|
|
600
|
-
return formConfig;
|
|
601
|
-
};
|
|
602
|
-
const updateFormFieldGroups = (fieldGroups, field) => {
|
|
603
|
-
if (checkObjectKeyExists(field, "groupKey")) {
|
|
604
|
-
if (checkObjectKeyExists(fieldGroups, field.groupKey)) {
|
|
605
|
-
fieldGroups[field.groupKey].push(field.key);
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
fieldGroups[field.groupKey] = [field.key];
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
return fieldGroups;
|
|
612
|
-
};
|
|
613
|
-
let connectedFieldMapping = {
|
|
614
|
-
parent: {},
|
|
615
|
-
child: {}
|
|
616
|
-
};
|
|
617
|
-
let fields = this.getFormFields(formConfig);
|
|
618
|
-
let fieldGroups = {};
|
|
619
|
-
for (let field of fields) {
|
|
620
|
-
field = updateOnFieldType(field);
|
|
621
|
-
field = formatFieldKeys(field);
|
|
622
|
-
// connectedFieldMapping = getConnectedElementFieldMapping(
|
|
623
|
-
// field,
|
|
624
|
-
// connectedFieldMapping
|
|
625
|
-
// );
|
|
626
|
-
// field = updateConnectedElementsKeyValue(field, connectedFieldMapping);
|
|
627
|
-
fieldGroups = updateFormFieldGroups(fieldGroups, field);
|
|
628
|
-
field = updateFieldDefaultValueConfig(field);
|
|
629
|
-
field = updateFieldValidatorConfig(field);
|
|
630
|
-
field = updateFieldResetButton(field);
|
|
631
|
-
field = updateFieldMessages(field);
|
|
632
|
-
}
|
|
633
|
-
formConfig = setFormFieldGroups(formConfig, fieldGroups);
|
|
634
|
-
formConfig = setFormFields(formConfig, fields);
|
|
635
|
-
return formConfig;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
__decorate([
|
|
639
|
-
logMethod
|
|
640
|
-
], Converter.prototype, "convertFormConfig", null);
|
|
641
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29uZmlnLWNvbnZlcnRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci5jb25maWctY29udmVydGVyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFckcsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFDRSxrQkFBYSxHQUFHLENBQUMsVUFBZSxFQUFTLEVBQUU7WUFDekMsSUFBSSxNQUFhLENBQUM7WUFFbEIsSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQzthQUN0QztpQkFBTTtnQkFDTCxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUM1QjtZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUVGLDRCQUF1QixHQUFHLENBQUMsS0FBVSxFQUFFLEdBQVcsRUFBRSxLQUFVLEVBQU8sRUFBRTtZQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixxQkFBZ0IsR0FBRyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFPLEVBQUU7WUFDOUQsS0FBSyxDQUFDLEdB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QyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0MsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBdHhCQztJQURDLFNBQVM7a0RBc3hCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR1aURheSB9IGZyb20gXCJAdGFpZ2EtdWkvY2RrXCI7XG5pbXBvcnQge1xuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgaXNFbXB0eVZhbHVlLFxuICBpc05vdEVtcHR5VmFsdWUsXG4gIGxvZ01ldGhvZFxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IGNvbnZlcnRGb3JtRmllbGRUeXBlRGF0ZVRvS3dpa1VJRm9ybWF0IH0gZnJvbSBcIi4vZm9ybS12aWV3L2hlbHBlcnMvZm9ybS12aWV3LmZpZWxkcy5oZWxwZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbnZlcnRlciB7XG4gIGdldEZvcm1GaWVsZHMgPSAoZm9ybUNvbmZpZzogYW55KTogYW55W10gPT4ge1xuICAgIGxldCBmaWVsZHM6IGFueVtdO1xuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpKSB7XG4gICAgICBmaWVsZHMgPSBmb3JtQ29uZmlnLm11bHRpRm9ybS5maWVsZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGZvcm1Db25maWcuZmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHM7XG4gIH07XG5cbiAgc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIGtleSkpIHtcbiAgICAgIGZpZWxkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIHNldEZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgIGZpZWxkW2tleV0gPSB2YWx1ZTtcblxuICAgIHJldHVybiBmaWVsZDtcbiAgfTtcblxuICByZW1vdmVGaWVsZEtleSA9IChmaWVsZDogYW55LCBrZXk6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBrZXkpKSB7XG4gICAgICBkZWxldGUgZmllbGRba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgQGxvZ01ldGhvZFxuICBjb252ZXJ0Rm9ybUNvbmZpZyhmb3JtQ29uZmlnOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHVwZGF0ZU9uRmllbGRUeXBlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlSHRtbCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVRpdGxlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlVGV4dCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImRlZmF1bHRcIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlQ2hlY2tib3ggPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVOdW1iZXIgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJrZXlcIikpIHtcbiAgICAgICAgICBpZiAoZmllbGQua2V5ID09PSBcImFhZGhhYXJfbnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInR5cGVcIiwgXCJhYWRoYWFyX251bWJlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0gXCJjb250YWN0X251bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ0eXBlXCIsIFwicGhvbmVcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IFwicGhvbmVcIiB8fCBmaWVsZC50eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJjb3VudHJ5Q29kZVwiLFxuICAgICAgICAgICAgICBcIis5MVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZVwiLFxuICAgICAgICAgICAgICBcIiMjIyMtIyMjIyMjXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJyZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZVwiLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICAgICAgICBcIm5ldmVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwcmVmaXhcIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcInBvc3RmaXhcIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcIm1pblwiLFxuICAgICAgICAgICAgICAtSW5maW5pdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgSW5maW5pdHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwcmVjaXNpb25cIixcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVEYXRlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWluXCIpKSB7XG4gICAgICAgICAgY29uc3QgdHVpRGF5ID0gY29udmVydEZvcm1GaWVsZFR5cGVEYXRlVG9Ld2lrVUlGb3JtYXQoZmllbGRbXCJtaW5cIl0pO1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgIHR1aURheVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgIG5ldyBUdWlEYXkoMCwgMCwgMSlcbiAgICAgICAgICApOyAvLyBZZWFyIC0gMDAwMCwgTW9udGggLSAwICgwIEluZGV4aW5nKSwgRGF5IC0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1heFwiKSkge1xuICAgICAgICAgIGNvbnN0IHR1aURheSA9IGNvbnZlcnRGb3JtRmllbGRUeXBlRGF0ZVRvS3dpa1VJRm9ybWF0KGZpZWxkW1wibWF4XCJdKTtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICB0dWlEYXlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICBuZXcgVHVpRGF5KFxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksIC8vIFllYXIgLSA5OTk5XG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0TW9udGgoKSwgLy8gTW9udGggLSAxMSAoMCBJbmRleGluZylcbiAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXREYXRlKCkgLy8gRGF5IC0gMzFcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcInBsYWNlaG9sZGVyXCIsXG4gICAgICAgICAgXCJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImhpZGRlblwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVBob25lID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlUmFkaW8gPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJzaXplXCIsXG4gICAgICAgICAgXCJtXCJcbiAgICAgICAgKTtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcIm9yaWVudGF0aW9uXCIsXG4gICAgICAgICAgXCJ2ZXJ0aWNhbFwiXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImhpZGRlblwiLCBmYWxzZSk7XG5cbiAgICAgICAgZmllbGQub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMubWFwKCh4OiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHgsIGRpc2FibGVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImxhYmVsXCIpICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHgsIFwiZGlzYWJsZWRcIikgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJkZXNjcmlwdGlvblwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICAgIHggPSB7IC4uLngsIGRpc2FibGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImRlc2NyaXB0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHggPSB7IC4uLngsIGRlc2NyaXB0aW9uOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlU2VhcmNoVGV4dCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInR5cGVcIikpIHtcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJzZWFyY2gtdGV4dFwiKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgICAgICBcImRyb3Bkb3duLXdpdGgtc2VhcmNoXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZURyb3Bkb3duV2l0aFNlYXJjaCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZUFwaUNhbGwgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQucHJvcGVydGllcywgXCJzaGFwZVwiKSkge1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgXCJzaGFwZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJzaG93TG9hZGVyXCIpKSB7XG4gICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwic2hvd0xvYWRlclwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5wcm9wZXJ0aWVzLCBcInNpemVcIikpIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwic2l6ZVwiLFxuICAgICAgICAgICAgXCJtXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiYXBpXCIpKSB7XG4gICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiYXBpXCIsIHt9KTtcblxuICAgICAgICAgIGZpZWxkLmFwaSA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQuYXBpLCBcInVybFwiLCBcIlwiKTtcbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJyZXF1ZXN0XCIsIFwiXCIpO1xuICAgICAgICAgIGZpZWxkLmFwaSA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQuYXBpLCBcInJlc3BvbnNlXCIsIFwiXCIpO1xuICAgICAgICAgIGZpZWxkLmFwaSA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQuYXBpLCBcInN0YXR1c1wiLCBcIlwiKTtcblxuICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyxcbiAgICAgICAgICAgIFwidmFsdWVcIixcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMsXG4gICAgICAgICAgICBcImxhYmVsc1wiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkZWZhdWx0OiBcIkNhbGwgQVBJXCIsXG4gICAgICAgICAgICAgIGxvYWRpbmc6IFwiQ2FsbCBBUElcIixcbiAgICAgICAgICAgICAgc3VjY2VzczogXCJBUEkgU3VjY2Vzc1wiLFxuICAgICAgICAgICAgICBmYWlsZWQ6IFwiQVBJIEZhaWxlZFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlT3RwID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwibWFza1wiLFxuICAgICAgICAgIG5ldyBBcnJheShmaWVsZC5wcm9wZXJ0aWVzLm90cExlbmd0aCkuZmlsbChcIiNcIikuam9pbihcIiBcIilcbiAgICAgICAgKTtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlQWFkaGFhck51bWJlciA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcblxuICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJodG1sXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVIdG1sKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRpdGxlXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVUaXRsZShmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVUZXh0KGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVDaGVja2JveChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZU51bWJlcihmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVEYXRlKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBob25lXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVQaG9uZShmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlUmFkaW8oZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2VhcmNoLXRleHRcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVNlYXJjaFRleHQoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZHJvcGRvd24td2l0aC1zZWFyY2hcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZURyb3Bkb3duV2l0aFNlYXJjaChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhcGktY2FsbFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlQXBpQ2FsbChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvdHBcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZU90cChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhYWRoYWFyLW51bWJlclwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlQWFkaGFhck51bWJlcihmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29ubmVjdGVkZWxlbWVudFR5cGVWYWx1ZU9iamVjdCA9IChrZXk6IGFueSk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb25kaXRpb25zOiB7IGZvcm11bGE6IFwiXCIsIHJ1bGVzOiBbXSB9LFxuICAgICAgICBhY3Rpb25zOiB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbXSB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0RmllbGRLZXlzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvXCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1wiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPSBbXG4gICAgICAgICAgICBnZXRDb25uZWN0ZWRlbGVtZW50VHlwZVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9cIl0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFRvXCJdID0gZmllbGRbXCJjb25uZWN0ZWRUb1wiXS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29ubmVjdGVkZWxlbWVudFR5cGVWYWx1ZU9iamVjdChrZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPSBmaWVsZFtcImNvbm5lY3RlZFRvXCJdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcImNvbm5lY3RlZFRvXCIpO1xuXG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkVG9QYXJlbnRcIikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFtcImNvbm5lY3RlZFRvUGFyZW50XCJdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRQYXJlbnRGaWVsZHNcIl0gPSBbXG4gICAgICAgICAgICBnZXRDb25uZWN0ZWRlbGVtZW50VHlwZVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IGdldENvbm5lY3RlZGVsZW1lbnRUeXBlVmFsdWVPYmplY3QoXG4gICAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFRvUGFyZW50XCJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJjb25uZWN0ZWRUb1BhcmVudFwiKTtcblxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJzaWRlRWZmZWN0XCIpO1xuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRGaWVsZE1hcHBpbmcgPSAoXG4gICAgICBmaWVsZDogYW55LFxuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcbiAgICApOiBhbnkgPT4ge1xuICAgICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudENoaWxkRmllbGRNYXBwaW5nID0gKFxuICAgICAgICBmaWVsZDogYW55LFxuICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxuICAgICAgKTogYW55ID0+IHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XSA9IGZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcImNoaWxkXCJdLCBmaWVsZC5rZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPVxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcgPSAoXG4gICAgICAgIGZpZWxkOiBhbnksXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgICApOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBjb25uZWN0ZWRQYXJlbnRLZXkgb2YgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bXG4gICAgICAgICAgICBmaWVsZC5rZXlcbiAgICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXSxcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dLnB1c2goXG4gICAgICAgICAgICAgICAgZmllbGQua2V5XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJwYXJlbnRcIl1bY29ubmVjdGVkUGFyZW50S2V5W1wia2V5XCJdXSA9IFtcbiAgICAgICAgICAgICAgICBmaWVsZC5rZXlcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBmaWVsZDogZmllbGQsIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogY29ubmVjdGVkRmllbGRNYXBwaW5nIH07XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb25uZWN0ZWRDaGlsZEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRDaGlsZEZpZWxkTWFwcGluZyhcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1xuICAgICAgKTtcbiAgICAgIGZpZWxkID0gY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmdbXCJmaWVsZFwiXTtcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZyA9XG4gICAgICAgIGNvbm5lY3RlZENoaWxkRmllbGRNYXBwaW5nW1wiY29ubmVjdGVkRmllbGRNYXBwaW5nXCJdO1xuXG4gICAgICBjb25zdCBjb25uZWN0ZWRQYXJlbnRGaWVsZE1hcHBpbmcgPSBnZXRDb25uZWN0ZWRFbGVtZW50UGFyZW50RmllbGRNYXBwaW5nKFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXG4gICAgICApO1xuICAgICAgZmllbGQgPSBjb25uZWN0ZWRQYXJlbnRGaWVsZE1hcHBpbmdbXCJmaWVsZFwiXTtcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZyA9XG4gICAgICAgIGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZ1tcImNvbm5lY3RlZEZpZWxkTWFwcGluZ1wiXTtcblxuICAgICAgcmV0dXJuIGNvbm5lY3RlZEZpZWxkTWFwcGluZztcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQ29ubmVjdGVkRWxlbWVudHNLZXlWYWx1ZSA9IChcbiAgICAgIGZpZWxkOiBhbnksXG4gICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxuICAgICk6IGFueSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSkpIHtcbiAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9IGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcImNoaWxkXCJdW2ZpZWxkLmtleV07XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJwYXJlbnRcIl0sIGZpZWxkLmtleSkpIHtcbiAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRQYXJlbnRGaWVsZHNcIl0gPVxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtmaWVsZC5rZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkVmFsaWRhdG9yQ29uZmlnID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRvcnNcIilcbiAgICAgICAgICA/IGZpZWxkLnZhbGlkYXRvcnNcbiAgICAgICAgICA6IHt9O1xuXG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ2YWxpZGF0b3JzXCIsIHt9KTtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwidmFsaWRhdG9yc1wiLCB7XG4gICAgICAgICAgLi4uZmllbGRbXCJ2YWxpZGF0b3JzXCJdLFxuICAgICAgICAgIG1pbjogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJtaW5cIilcbiAgICAgICAgICAgID8gaXNOb3RFbXB0eVZhbHVlKHZhbGlkYXRvcnMubWluKVxuICAgICAgICAgICAgICA/IE51bWJlcih2YWxpZGF0b3JzLm1pbilcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1pblwiKVxuICAgICAgICAgICAgPyBOdW1iZXIoZmllbGQubWluKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIG1heDogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJtYXhcIilcbiAgICAgICAgICAgID8gaXNOb3RFbXB0eVZhbHVlKHZhbGlkYXRvcnMubWF4KVxuICAgICAgICAgICAgICA/IE51bWJlcih2YWxpZGF0b3JzLm1heClcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1heFwiKVxuICAgICAgICAgICAgPyBOdW1iZXIoZmllbGQubWF4KVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHJlcXVpcmVkOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICA/IEJvb2xlYW4odmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgID8gQm9vbGVhbihmaWVsZC5yZXF1aXJlZClcbiAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgbWluTGVuZ3RoOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1pbkxlbmd0aFwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5taW5MZW5ndGgpXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWluTGVuZ3RoKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWluTGVuZ3RoXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5taW5MZW5ndGgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1heExlbmd0aFwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5tYXhMZW5ndGgpXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWF4TGVuZ3RoKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibGVuZ3RoXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5sZW5ndGgpXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1heExlbmd0aFwiKVxuICAgICAgICAgICAgPyBOdW1iZXIoZmllbGQubWF4TGVuZ3RoKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHBhdHRlcm46IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwicGF0dGVyblwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5wYXR0ZXJuKVxuICAgICAgICAgICAgICA/IHZhbGlkYXRvcnMucGF0dGVyblxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJwYXR0ZXJuXCIpXG4gICAgICAgICAgICA/IHsga2V5OiBcIkNVU1RPTVwiLCBwYXR0ZXJuOiBTdHJpbmcoZmllbGQucGF0dGVybikgfVxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJyZWdleFwiKVxuICAgICAgICAgICAgPyB7IGtleTogXCJDVVNUT01cIiwgcGF0dGVybjogU3RyaW5nKGZpZWxkLnJlZ2V4KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBkZWxldGUgZmllbGQubWluO1xuICAgICAgICBkZWxldGUgZmllbGQubWF4O1xuICAgICAgICBkZWxldGUgZmllbGQucmVxdWlyZWQ7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5taW5MZW5ndGg7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5sZW5ndGg7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5tYXhMZW5ndGg7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5wYXR0ZXJuO1xuICAgICAgICBkZWxldGUgZmllbGQucmVnZXg7XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1pbjtcbiAgICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1heDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ubWluKSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/Lm1heCkpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5taW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5taW5MZW5ndGgpKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ubWF4TGVuZ3RoKSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1heExlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/LnBhdHRlcm4pKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMucGF0dGVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkLmZvY3VzID0gZmFsc2U7XG4gICAgICAgIGZpZWxkLmludmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGaWVsZERlZmF1bHRWYWx1ZUNvbmZpZyA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50KSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0VmFsdWVcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZGVmYXVsdFwiKSkge1xuICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZGVmYXVsdFZhbFwiKSkge1xuICAgICAgICAgICAgLy8gQ3VycmVudGx5IGJlbG93IGxpbmUgaXMgY29tbWVudGVkIGJlY2F1c2UgaXQgY2F1c2VkIGlzc3VlcyBpbiBzZXR0aW5nIERlZmF1bHQgVmFsdWUuXG4gICAgICAgICAgICAvLyBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgICAgICAgIC8vIGRlbGV0ZSBmaWVsZFtcImRlZmF1bHRWYWxcIl07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVE9ETzogQ29uZGl0aW9uIGZvciBhbGxfZm9ybXNfZGF0YSBpcyBub3QgY29uc2lkZXJlZCB5ZXQuXG4gICAgICAgICAgaWYgKGZpZWxkLmF1dG9Qb3B1bGF0ZUZyb21TdW1tYXJ5RGF0YSkge1xuICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XG4gICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IFwic3VtbWFyeV9kYXRhXCIsXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5X2RhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImF1dG9maWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuYXV0b2ZpbGwsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQuYXV0b2ZpbGwudHlwZSA9PT0gXCJzdG9yYWdlXCIpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBcImJyb3dzZXJfc3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJfc3RvcmFnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmF1dG9maWxsLnR5cGUgPT09IFwiY29uZmlnXCIpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBcImZpZWxkX2NvbmZpZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2NvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICBpc19mb3VuZDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgc291cmNlOiBcImZvcm1fZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGAkLiR7ZmllbGQua2V5fWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3RfZW1wdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfdmFsdWVfZm91bmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMSBPUiBOT1QoMSlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGaWVsZE1lc3NhZ2VzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLCBcIm1lc3NhZ2VzXCIsIFtdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGaWVsZFJlc2V0QnV0dG9uID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImFjdGlvblwiKSAmJlxuICAgICAgICAgIGZpZWxkLmFjdGlvbiA9PT0gXCJyZXNldFwiICYmXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZmllbGRzXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInJlc2V0XCIsIHtcbiAgICAgICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRGb3JtRmllbGRzID0gKGZvcm1Db25maWc6IGFueSwgZmllbGRzOiBhbnlbXSk6IGFueSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybUNvbmZpZywgXCJtdWx0aUZvcm1cIikpIHtcbiAgICAgICAgZm9ybUNvbmZpZy5tdWx0aUZvcm1bXCJmaWVsZHNcIl0gPSBmaWVsZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtQ29uZmlnW1wiZmllbGRzXCJdID0gZmllbGRzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybUNvbmZpZztcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0Rm9ybUZpZWxkR3JvdXBzID0gKGZvcm1Db25maWc6IGFueSwgZ3JvdXBzOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgZm9ybUNvbmZpZ1tcImZpZWxkR3JvdXBzXCJdID0gZ3JvdXBzO1xuXG4gICAgICByZXR1cm4gZm9ybUNvbmZpZztcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRm9ybUZpZWxkR3JvdXBzID0gKGZpZWxkR3JvdXBzOiBhbnksIGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImdyb3VwS2V5XCIpKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZEdyb3VwcywgZmllbGQuZ3JvdXBLZXkpKSB7XG4gICAgICAgICAgZmllbGRHcm91cHNbZmllbGQuZ3JvdXBLZXldLnB1c2goZmllbGQua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZEdyb3Vwc1tmaWVsZC5ncm91cEtleV0gPSBbZmllbGQua2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGRHcm91cHM7XG4gICAgfTtcblxuICAgIGxldCBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueSA9IHtcbiAgICAgIHBhcmVudDoge30sXG4gICAgICBjaGlsZDoge31cbiAgICB9O1xuXG4gICAgbGV0IGZpZWxkczogYW55W10gPSB0aGlzLmdldEZvcm1GaWVsZHMoZm9ybUNvbmZpZyk7XG5cbiAgICBsZXQgZmllbGRHcm91cHM6IGFueSA9IHt9O1xuXG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBmaWVsZCA9IHVwZGF0ZU9uRmllbGRUeXBlKGZpZWxkKTtcblxuICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZEtleXMoZmllbGQpO1xuXG4gICAgICAvLyBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgPSBnZXRDb25uZWN0ZWRFbGVtZW50RmllbGRNYXBwaW5nKFxuICAgICAgLy8gICBmaWVsZCxcbiAgICAgIC8vICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXG4gICAgICAvLyApO1xuICAgICAgLy8gZmllbGQgPSB1cGRhdGVDb25uZWN0ZWRFbGVtZW50c0tleVZhbHVlKGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmcpO1xuICAgICAgZmllbGRHcm91cHMgPSB1cGRhdGVGb3JtRmllbGRHcm91cHMoZmllbGRHcm91cHMsIGZpZWxkKTtcblxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZERlZmF1bHRWYWx1ZUNvbmZpZyhmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRWYWxpZGF0b3JDb25maWcoZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkUmVzZXRCdXR0b24oZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkTWVzc2FnZXMoZmllbGQpO1xuICAgIH1cblxuICAgIGZvcm1Db25maWcgPSBzZXRGb3JtRmllbGRHcm91cHMoZm9ybUNvbmZpZywgZmllbGRHcm91cHMpO1xuXG4gICAgZm9ybUNvbmZpZyA9IHNldEZvcm1GaWVsZHMoZm9ybUNvbmZpZywgZmllbGRzKTtcblxuICAgIHJldHVybiBmb3JtQ29uZmlnO1xuICB9XG59XG4iXX0=
|