kwikid-forms 0.0.0-watch
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/README.md +44 -0
- package/assets/done1.png +0 -0
- package/assets/edit.png +0 -0
- package/assets/lock.png +0 -0
- package/esm2015/kwikid-forms.js +5 -0
- package/esm2015/lib/builder/builder.component.js +138 -0
- package/esm2015/lib/builder/builder.module.js +21 -0
- package/esm2015/lib/kwikid-forms.module.js +53 -0
- package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.js +16 -0
- package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.js +8 -0
- package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.js +47 -0
- package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.js +15 -0
- package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/rules/form-view.rules.enum.definitions.js +7 -0
- package/esm2015/lib/renderer/form-view/definitions/rules/form-view.rules.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/sources/form-view.sources.enum.definitions.js +16 -0
- package/esm2015/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/triggers/form-view.triggers.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.js +2 -0
- package/esm2015/lib/renderer/form-view/form-view.component.js +654 -0
- package/esm2015/lib/renderer/form-view/form-view.decorators.js +93 -0
- package/esm2015/lib/renderer/form-view/form-view.module.js +37 -0
- package/esm2015/lib/renderer/form-view/form-view.service.js +27 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.actions.helper.js +27 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +105 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.common.helper.js +136 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.condition.helper.js +46 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.defaults.helper.js +52 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +146 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.rules.helper.js +86 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.sources.helper.js +161 -0
- package/esm2015/lib/renderer/form-view/helpers/form-view.validations.helper.js +156 -0
- package/esm2015/lib/renderer/forms-list/forms-list.component.js +61 -0
- package/esm2015/lib/renderer/forms-list/forms-list.helper.js +4 -0
- package/esm2015/lib/renderer/forms-list/forms-list.module.js +37 -0
- package/esm2015/lib/renderer/renderer.component.js +201 -0
- package/esm2015/lib/renderer/renderer.config-converter.helper.js +530 -0
- package/esm2015/lib/renderer/renderer.helper.js +50 -0
- package/esm2015/lib/renderer/renderer.module.js +39 -0
- package/esm2015/lib/renderer/renderer.service.js +115 -0
- package/esm2015/public_api.js +17 -0
- package/fesm2015/kwikid-forms.js +2970 -0
- package/fesm2015/kwikid-forms.js.map +1 -0
- package/kwikid-forms.d.ts +5 -0
- package/lib/builder/builder.component.d.ts +68 -0
- package/lib/builder/builder.module.d.ts +10 -0
- package/lib/kwikid-forms.module.d.ts +13 -0
- package/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.d.ts +14 -0
- package/lib/renderer/form-view/definitions/actions/form-view.actions.type.definitions.d.ts +91 -0
- package/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.d.ts +6 -0
- package/lib/renderer/form-view/definitions/apis/form-view.apis.type.definitions.d.ts +40 -0
- package/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.d.ts +43 -0
- package/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.d.ts +7 -0
- package/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.d.ts +13 -0
- package/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.d.ts +137 -0
- package/lib/renderer/form-view/definitions/rules/form-view.rules.enum.definitions.d.ts +5 -0
- package/lib/renderer/form-view/definitions/rules/form-view.rules.type.definitions.d.ts +41 -0
- package/lib/renderer/form-view/definitions/sources/form-view.sources.enum.definitions.d.ts +13 -0
- package/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.d.ts +16 -0
- package/lib/renderer/form-view/definitions/triggers/form-view.triggers.type.definitions.d.ts +1 -0
- package/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.d.ts +17 -0
- package/lib/renderer/form-view/form-view.component.d.ts +66 -0
- package/lib/renderer/form-view/form-view.decorators.d.ts +7 -0
- package/lib/renderer/form-view/form-view.module.d.ts +11 -0
- package/lib/renderer/form-view/form-view.service.d.ts +5 -0
- package/lib/renderer/form-view/helpers/form-view.actions.helper.d.ts +13 -0
- package/lib/renderer/form-view/helpers/form-view.apis.helper.d.ts +17 -0
- package/lib/renderer/form-view/helpers/form-view.common.helper.d.ts +19 -0
- package/lib/renderer/form-view/helpers/form-view.condition.helper.d.ts +8 -0
- package/lib/renderer/form-view/helpers/form-view.defaults.helper.d.ts +10 -0
- package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +20 -0
- package/lib/renderer/form-view/helpers/form-view.rules.helper.d.ts +12 -0
- package/lib/renderer/form-view/helpers/form-view.sources.helper.d.ts +29 -0
- package/lib/renderer/form-view/helpers/form-view.validations.helper.d.ts +25 -0
- package/lib/renderer/forms-list/forms-list.component.d.ts +18 -0
- package/lib/renderer/forms-list/forms-list.helper.d.ts +1 -0
- package/lib/renderer/forms-list/forms-list.module.d.ts +11 -0
- package/lib/renderer/renderer.component.d.ts +30 -0
- package/lib/renderer/renderer.config-converter.helper.d.ts +7 -0
- package/lib/renderer/renderer.helper.d.ts +6 -0
- package/lib/renderer/renderer.module.d.ts +12 -0
- package/lib/renderer/renderer.service.d.ts +27 -0
- package/package.json +47 -0
- package/public_api.d.ts +9 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { TuiDay } from "@taiga-ui/cdk";
|
|
3
|
+
import { log } from "./form-view/form-view.decorators";
|
|
4
|
+
import { hasKey } from "./renderer.helper";
|
|
5
|
+
export class Converter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.getFormFields = (formConfig) => {
|
|
8
|
+
let fields;
|
|
9
|
+
if (hasKey(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 (!hasKey(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 (hasKey(field, key)) {
|
|
29
|
+
delete field[key];
|
|
30
|
+
}
|
|
31
|
+
return field;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
convertFormConfig(formConfig) {
|
|
35
|
+
const updateOnFieldType = (field) => {
|
|
36
|
+
const formatFieldTypeTitle = (field) => {
|
|
37
|
+
const fieldKey = `${field.type}_${field.label
|
|
38
|
+
.split(" ")
|
|
39
|
+
.join("_")
|
|
40
|
+
.toLocaleLowerCase()}`;
|
|
41
|
+
field = this.setFieldKeyValue(field, "key", fieldKey);
|
|
42
|
+
field = this.setFieldKeyValue(field, "hidden", false);
|
|
43
|
+
return field;
|
|
44
|
+
};
|
|
45
|
+
const formatFieldTypeRadio = (field) => {
|
|
46
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "size", "m");
|
|
47
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "orientation", "vertical");
|
|
48
|
+
field = this.setFieldKeyValue(field, "hidden", false);
|
|
49
|
+
field.options = field.options.map((x) => {
|
|
50
|
+
return { label: x, disabled: false };
|
|
51
|
+
});
|
|
52
|
+
return field;
|
|
53
|
+
};
|
|
54
|
+
const formatFieldTypeOtp = (field) => {
|
|
55
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "mask", new Array(field.properties.otpLength).fill("#").join(" "));
|
|
56
|
+
field = this.setFieldKeyValue(field, "hidden", false);
|
|
57
|
+
return field;
|
|
58
|
+
};
|
|
59
|
+
const formatFieldTypeDate = (field) => {
|
|
60
|
+
const convertDateStringToTuiDayFormat = (date) => {
|
|
61
|
+
const splitDate = date.split("-");
|
|
62
|
+
const tuiDay = new TuiDay(Number(splitDate[2]), // Year
|
|
63
|
+
Number(splitDate[1]) - 1, // Month, Why '-1' => Because Taiga-UI Required It, So...
|
|
64
|
+
Number(splitDate[0]) // Day
|
|
65
|
+
);
|
|
66
|
+
return tuiDay;
|
|
67
|
+
};
|
|
68
|
+
if (hasKey(field, "min")) {
|
|
69
|
+
const tuiDay = convertDateStringToTuiDayFormat(field["min"]);
|
|
70
|
+
field.properties = this.setFieldKeyValue(field.properties, "min", tuiDay);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "min", new TuiDay(0, 0, 1)); // Year - 0000, Month - 0 (0 Indexing), Day - 1
|
|
74
|
+
}
|
|
75
|
+
if (hasKey(field, "max")) {
|
|
76
|
+
const tuiDay = convertDateStringToTuiDayFormat(field["max"]);
|
|
77
|
+
field.properties = this.setFieldKeyValue(field.properties, "max", tuiDay);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "max", new TuiDay(new Date().getFullYear(), // Year - 9999
|
|
81
|
+
new Date().getMonth(), // Month - 11 (0 Indexing)
|
|
82
|
+
new Date().getDate() // Day - 31
|
|
83
|
+
));
|
|
84
|
+
}
|
|
85
|
+
field = this.setFieldKeyValue(field, "hidden", false);
|
|
86
|
+
return field;
|
|
87
|
+
};
|
|
88
|
+
const formatFieldTypeNumber = (field) => {
|
|
89
|
+
if (hasKey(field, "key")) {
|
|
90
|
+
if (field.key === "aadhaar_number") {
|
|
91
|
+
field = this.setFieldKeyValue(field, "type", "aadhaar_number");
|
|
92
|
+
}
|
|
93
|
+
if (field.key === "contact_number") {
|
|
94
|
+
field = this.setFieldKeyValue(field, "type", "phone");
|
|
95
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "countryCode", "+91");
|
|
96
|
+
field.properties = this.setMissingFieldKeyValue(field.properties, "phoneMaskAfterCountryCode", "####-######");
|
|
97
|
+
field.properties = this.setFieldKeyValue(field.properties, "decimal", "not-zero");
|
|
98
|
+
field.properties = this.setFieldKeyValue(field.properties, "min", -Infinity);
|
|
99
|
+
field.properties = this.setFieldKeyValue(field.properties, "max", Infinity);
|
|
100
|
+
field.properties = this.setFieldKeyValue(field.properties, "precision", 0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
field = this.setFieldKeyValue(field, "hidden", false);
|
|
104
|
+
return field;
|
|
105
|
+
};
|
|
106
|
+
const formatFieldTypeApiCall = (field) => {
|
|
107
|
+
if (!hasKey(field.properties, "shape")) {
|
|
108
|
+
field.properties = this.setFieldKeyValue(field.properties, "shape", null);
|
|
109
|
+
}
|
|
110
|
+
if (!hasKey(field, "showLoader")) {
|
|
111
|
+
field = this.setFieldKeyValue(field, "showLoader", false);
|
|
112
|
+
}
|
|
113
|
+
if (!hasKey(field.properties, "size")) {
|
|
114
|
+
field.properties = this.setFieldKeyValue(field.properties, "size", "m");
|
|
115
|
+
}
|
|
116
|
+
if (!hasKey(field, "api")) {
|
|
117
|
+
field = this.setFieldKeyValue(field, "api", {});
|
|
118
|
+
field.api = this.setMissingFieldKeyValue(field.api, "url", "");
|
|
119
|
+
field.api = this.setMissingFieldKeyValue(field.api, "request", "");
|
|
120
|
+
field.api = this.setMissingFieldKeyValue(field.api, "response", "");
|
|
121
|
+
field.api = this.setMissingFieldKeyValue(field.api, "status", "");
|
|
122
|
+
field.api.status = this.setMissingFieldKeyValue(field.api.status, "value", "default");
|
|
123
|
+
field.api.status = this.setMissingFieldKeyValue(field.api.status, "labels", {
|
|
124
|
+
default: "Call API",
|
|
125
|
+
loading: "Call API",
|
|
126
|
+
success: "API Success",
|
|
127
|
+
failed: "API Failed"
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return field;
|
|
131
|
+
};
|
|
132
|
+
const formatFieldTypeSearchText = (field) => {
|
|
133
|
+
if (hasKey(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 formatFieldTypeText = (field) => {
|
|
141
|
+
return field;
|
|
142
|
+
};
|
|
143
|
+
switch (field.type) {
|
|
144
|
+
case "title":
|
|
145
|
+
field = formatFieldTypeTitle(field);
|
|
146
|
+
break;
|
|
147
|
+
case "radio":
|
|
148
|
+
field = formatFieldTypeRadio(field);
|
|
149
|
+
break;
|
|
150
|
+
case "otp":
|
|
151
|
+
field = formatFieldTypeOtp(field);
|
|
152
|
+
break;
|
|
153
|
+
case "date":
|
|
154
|
+
field = formatFieldTypeDate(field);
|
|
155
|
+
break;
|
|
156
|
+
case "number":
|
|
157
|
+
field = formatFieldTypeNumber(field);
|
|
158
|
+
break;
|
|
159
|
+
case "api-call":
|
|
160
|
+
field = formatFieldTypeApiCall(field);
|
|
161
|
+
break;
|
|
162
|
+
case "search-text":
|
|
163
|
+
field = formatFieldTypeSearchText(field);
|
|
164
|
+
break;
|
|
165
|
+
default:
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
return field;
|
|
169
|
+
};
|
|
170
|
+
const getConnectedElementKeyValueObject = (key) => {
|
|
171
|
+
const object = {
|
|
172
|
+
key: key,
|
|
173
|
+
conditions: { formula: "", rules: [] },
|
|
174
|
+
actions: { success: [], failure: [] }
|
|
175
|
+
};
|
|
176
|
+
return object;
|
|
177
|
+
};
|
|
178
|
+
const formatFieldKeys = (field) => {
|
|
179
|
+
if (hasKey(field, "connectedTo")) {
|
|
180
|
+
if (typeof field["connectedTo"] === "string") {
|
|
181
|
+
field["connectedElements"] = [
|
|
182
|
+
getConnectedElementKeyValueObject(field["connectedTo"])
|
|
183
|
+
];
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
field["connectedTo"] = field["connectedTo"].map((key) => {
|
|
187
|
+
return getConnectedElementKeyValueObject(key);
|
|
188
|
+
});
|
|
189
|
+
field["connectedElements"] = field["connectedTo"];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
this.removeFieldKey(field, "connectedTo");
|
|
193
|
+
if (hasKey(field, "connectedToParent")) {
|
|
194
|
+
if (typeof field["connectedToParent"] === "string") {
|
|
195
|
+
field["connectedParentFields"] = [
|
|
196
|
+
getConnectedElementKeyValueObject(field["connectedToParent"])
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
field["connectedParentFields"] = getConnectedElementKeyValueObject(field["connectedToParent"]);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
this.removeFieldKey(field, "connectedToParent");
|
|
204
|
+
this.removeFieldKey(field, "sideEffect");
|
|
205
|
+
return field;
|
|
206
|
+
};
|
|
207
|
+
const getConnectedElementFieldMapping = (field, connectedFieldMapping) => {
|
|
208
|
+
const getConnectedElementChildFieldMapping = (field, connectedFieldMapping) => {
|
|
209
|
+
if (hasKey(field, "connectedElements")) {
|
|
210
|
+
connectedFieldMapping["child"][field.key] = field.connectedElements;
|
|
211
|
+
}
|
|
212
|
+
else if (hasKey(connectedFieldMapping["child"], field.key)) {
|
|
213
|
+
field["connectedElements"] =
|
|
214
|
+
connectedFieldMapping["child"][field.key];
|
|
215
|
+
}
|
|
216
|
+
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
217
|
+
};
|
|
218
|
+
const getConnectedElementParentFieldMapping = (field, connectedFieldMapping) => {
|
|
219
|
+
console.log(field, connectedFieldMapping);
|
|
220
|
+
if (hasKey(connectedFieldMapping["child"], field.key)) {
|
|
221
|
+
for (let connectedParentKey of connectedFieldMapping["child"][field.key]) {
|
|
222
|
+
if (hasKey(connectedFieldMapping["parent"], connectedParentKey["key"])) {
|
|
223
|
+
connectedFieldMapping["parent"][connectedParentKey["key"]].push(field.key);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
connectedFieldMapping["parent"][connectedParentKey["key"]] = [
|
|
227
|
+
field.key
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
233
|
+
};
|
|
234
|
+
const connectedChildFieldMapping = getConnectedElementChildFieldMapping(field, connectedFieldMapping);
|
|
235
|
+
field = connectedChildFieldMapping["field"];
|
|
236
|
+
connectedFieldMapping =
|
|
237
|
+
connectedChildFieldMapping["connectedFieldMapping"];
|
|
238
|
+
const connectedParentFieldMapping = getConnectedElementParentFieldMapping(field, connectedFieldMapping);
|
|
239
|
+
field = connectedParentFieldMapping["field"];
|
|
240
|
+
connectedFieldMapping =
|
|
241
|
+
connectedParentFieldMapping["connectedFieldMapping"];
|
|
242
|
+
return connectedFieldMapping;
|
|
243
|
+
};
|
|
244
|
+
const updateConnectedElementsKeyValue = (field, connectedFieldMapping) => {
|
|
245
|
+
if (hasKey(connectedFieldMapping["child"], field.key)) {
|
|
246
|
+
field["connectedElements"] = connectedFieldMapping["child"][field.key];
|
|
247
|
+
}
|
|
248
|
+
if (hasKey(connectedFieldMapping["parent"], field.key)) {
|
|
249
|
+
field["connectedParentFields"] =
|
|
250
|
+
connectedFieldMapping["parent"][field.key];
|
|
251
|
+
}
|
|
252
|
+
return field;
|
|
253
|
+
};
|
|
254
|
+
const updateFieldValidatorConfig = (field) => {
|
|
255
|
+
if (field.type !== "title") {
|
|
256
|
+
const validators = hasKey(field, "validators") ? field.validators : {};
|
|
257
|
+
field = this.setMissingFieldKeyValue(field, "validators", {});
|
|
258
|
+
field = this.setFieldKeyValue(field, "validators", Object.assign(Object.assign({}, field["validators"]), { min: hasKey(validators, "min")
|
|
259
|
+
? validators.min
|
|
260
|
+
: hasKey(field, "min")
|
|
261
|
+
? field.min
|
|
262
|
+
: undefined, max: hasKey(validators, "max")
|
|
263
|
+
? validators.max
|
|
264
|
+
: hasKey(field, "max")
|
|
265
|
+
? field.max
|
|
266
|
+
: undefined, required: hasKey(validators, "required")
|
|
267
|
+
? validators.required
|
|
268
|
+
: hasKey(field, "required")
|
|
269
|
+
? field.required
|
|
270
|
+
: undefined, minLength: hasKey(validators, "minLength")
|
|
271
|
+
? validators.minLength
|
|
272
|
+
: hasKey(field, "minLength")
|
|
273
|
+
? field.minLength
|
|
274
|
+
: undefined, maxLength: hasKey(validators, "maxLength")
|
|
275
|
+
? validators.maxLength
|
|
276
|
+
: hasKey(field, "length")
|
|
277
|
+
? field.length
|
|
278
|
+
: hasKey(field, "maxLength")
|
|
279
|
+
? field.maxLength
|
|
280
|
+
: undefined, pattern: hasKey(field.validators, "pattern")
|
|
281
|
+
? field.validators.pattern
|
|
282
|
+
: hasKey(field, "pattern")
|
|
283
|
+
? field.pattern
|
|
284
|
+
: hasKey(field, "regex")
|
|
285
|
+
? field.regex
|
|
286
|
+
: undefined }));
|
|
287
|
+
delete field.min;
|
|
288
|
+
delete field.max;
|
|
289
|
+
delete field.required;
|
|
290
|
+
delete field.minLength;
|
|
291
|
+
delete field.length;
|
|
292
|
+
delete field.maxLength;
|
|
293
|
+
delete field.pattern;
|
|
294
|
+
delete field.regex;
|
|
295
|
+
}
|
|
296
|
+
return field;
|
|
297
|
+
};
|
|
298
|
+
const updateFieldDefaultValueConfig = (field) => {
|
|
299
|
+
if (field.type !== "title") {
|
|
300
|
+
if (hasKey(field, "defaultValue")) {
|
|
301
|
+
return field;
|
|
302
|
+
}
|
|
303
|
+
else if (hasKey(field, "default")) {
|
|
304
|
+
return field;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
if (hasKey(field, "defaultVal")) {
|
|
308
|
+
// Currently below line is commented because it caused issues in setting Default Value.
|
|
309
|
+
// field["defaultValue"] = field["defaultVal"];
|
|
310
|
+
// delete field["defaultVal"];
|
|
311
|
+
}
|
|
312
|
+
// TODO: Condition for all_forms_data is not considered yet.
|
|
313
|
+
if (field.autoPopulateFromSummaryData) {
|
|
314
|
+
field["defaultValue"] = {
|
|
315
|
+
is_found: false,
|
|
316
|
+
value: "",
|
|
317
|
+
sources: [
|
|
318
|
+
{
|
|
319
|
+
source: "summary_data",
|
|
320
|
+
summary_data: {
|
|
321
|
+
path: `$.${field.key}`,
|
|
322
|
+
validation: {
|
|
323
|
+
rules: [
|
|
324
|
+
{
|
|
325
|
+
key: "1",
|
|
326
|
+
type: "is_not_empty",
|
|
327
|
+
is_not_empty: {
|
|
328
|
+
value: true
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
actions: [
|
|
333
|
+
{
|
|
334
|
+
type: "set_default_value_found",
|
|
335
|
+
condition: "1",
|
|
336
|
+
set_default_value_found: {
|
|
337
|
+
value: true
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
type: "enable_field",
|
|
342
|
+
condition: "1 OR NOT(1)",
|
|
343
|
+
enable_field: { value: true }
|
|
344
|
+
}
|
|
345
|
+
]
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
]
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
else if (hasKey(field, "autofill")) {
|
|
353
|
+
if (hasKey(field.autofill, "type")) {
|
|
354
|
+
if (field.autofill.type === "storage") {
|
|
355
|
+
field["defaultValue"] = {
|
|
356
|
+
is_found: false,
|
|
357
|
+
value: "",
|
|
358
|
+
sources: [
|
|
359
|
+
{
|
|
360
|
+
source: "browser_storage",
|
|
361
|
+
browser_storage: {
|
|
362
|
+
path: `$.${field.key}`,
|
|
363
|
+
validation: {
|
|
364
|
+
rules: [
|
|
365
|
+
{
|
|
366
|
+
key: "1",
|
|
367
|
+
type: "is_not_empty",
|
|
368
|
+
is_not_empty: {
|
|
369
|
+
value: true
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
],
|
|
373
|
+
actions: [
|
|
374
|
+
{
|
|
375
|
+
type: "set_default_value_found",
|
|
376
|
+
condition: "1",
|
|
377
|
+
set_default_value_found: {
|
|
378
|
+
value: true
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
type: "enable_field",
|
|
383
|
+
condition: "1 OR NOT(1)",
|
|
384
|
+
enable_field: { value: true }
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
]
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
else if (field.autofill.type === "config") {
|
|
394
|
+
field["defaultValue"] = {
|
|
395
|
+
is_found: false,
|
|
396
|
+
value: "",
|
|
397
|
+
sources: [
|
|
398
|
+
{
|
|
399
|
+
source: "field_config",
|
|
400
|
+
field_config: {
|
|
401
|
+
path: `$.${field.key}`,
|
|
402
|
+
validation: {
|
|
403
|
+
rules: [
|
|
404
|
+
{
|
|
405
|
+
key: "1",
|
|
406
|
+
type: "is_not_empty",
|
|
407
|
+
is_not_empty: {
|
|
408
|
+
value: true
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
],
|
|
412
|
+
actions: [
|
|
413
|
+
{
|
|
414
|
+
type: "set_default_value_found",
|
|
415
|
+
condition: "1",
|
|
416
|
+
set_default_value_found: {
|
|
417
|
+
value: true
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
type: "enable_field",
|
|
422
|
+
condition: "1 OR NOT(1)",
|
|
423
|
+
enable_field: { value: true }
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
]
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
field["defaultValue"] = {
|
|
436
|
+
is_found: false,
|
|
437
|
+
value: "",
|
|
438
|
+
sources: [
|
|
439
|
+
{
|
|
440
|
+
source: "form_data",
|
|
441
|
+
form_data: {
|
|
442
|
+
path: `$.${field.key}`,
|
|
443
|
+
validation: {
|
|
444
|
+
rules: [
|
|
445
|
+
{
|
|
446
|
+
key: "1",
|
|
447
|
+
type: "is_not_empty",
|
|
448
|
+
is_not_empty: {
|
|
449
|
+
value: true
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
],
|
|
453
|
+
actions: [
|
|
454
|
+
{
|
|
455
|
+
type: "set_default_value_found",
|
|
456
|
+
condition: "1",
|
|
457
|
+
set_default_value_found: {
|
|
458
|
+
value: true
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
type: "enable_field",
|
|
463
|
+
condition: "1 OR NOT(1)",
|
|
464
|
+
enable_field: { value: true }
|
|
465
|
+
}
|
|
466
|
+
]
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
]
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
delete field["defaultVal"];
|
|
475
|
+
}
|
|
476
|
+
return field;
|
|
477
|
+
};
|
|
478
|
+
const updateFieldMessages = (field) => {
|
|
479
|
+
if (field.type !== "title") {
|
|
480
|
+
field = this.setMissingFieldKeyValue(field, "messages", []);
|
|
481
|
+
}
|
|
482
|
+
return field;
|
|
483
|
+
};
|
|
484
|
+
const updateFieldResetButton = (field) => {
|
|
485
|
+
if (field.type === "title") {
|
|
486
|
+
if (hasKey(field, "action") &&
|
|
487
|
+
field.action === "reset" &&
|
|
488
|
+
hasKey(field, "fields")) {
|
|
489
|
+
field = this.setFieldKeyValue(field, "reset", {
|
|
490
|
+
fields: field.fields
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return field;
|
|
495
|
+
};
|
|
496
|
+
let fields = this.getFormFields(formConfig);
|
|
497
|
+
let connectedFieldMapping = {
|
|
498
|
+
parent: {},
|
|
499
|
+
child: {}
|
|
500
|
+
};
|
|
501
|
+
const setFormFields = (formConfig, fields) => {
|
|
502
|
+
if (hasKey(formConfig, "multiForm")) {
|
|
503
|
+
formConfig.multiForm["fields"] = fields;
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
formConfig["fields"] = fields;
|
|
507
|
+
}
|
|
508
|
+
return formConfig;
|
|
509
|
+
};
|
|
510
|
+
for (let field of fields) {
|
|
511
|
+
field = updateOnFieldType(field);
|
|
512
|
+
field = formatFieldKeys(field);
|
|
513
|
+
// connectedFieldMapping = getConnectedElementFieldMapping(
|
|
514
|
+
// field,
|
|
515
|
+
// connectedFieldMapping
|
|
516
|
+
// );
|
|
517
|
+
// field = updateConnectedElementsKeyValue(field, connectedFieldMapping);
|
|
518
|
+
field = updateFieldDefaultValueConfig(field);
|
|
519
|
+
field = updateFieldValidatorConfig(field);
|
|
520
|
+
field = updateFieldResetButton(field);
|
|
521
|
+
field = updateFieldMessages(field);
|
|
522
|
+
}
|
|
523
|
+
formConfig = setFormFields(formConfig, fields);
|
|
524
|
+
return formConfig;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
__decorate([
|
|
528
|
+
log
|
|
529
|
+
], Converter.prototype, "convertFormConfig", null);
|
|
530
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29uZmlnLWNvbnZlcnRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci5jb25maWctY29udmVydGVyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBQ0Usa0JBQWEsR0FBRyxDQUFDLFVBQWUsRUFBUyxFQUFFO1lBQ3pDLElBQUksTUFBYSxDQUFDO1lBRWxCLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO2FBQzVCO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUYsNEJBQXVCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsR0FBVyxFQUFFLEtBQVUsRUFBTyxFQUFFO1lBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixxQkFBZ0IsR0FBRyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFPLEVBQUU7WUFDOUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUVuQixPQUFPLEtBQUss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WUFFN0MsS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTFDLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV0QyxLQUFLLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEM7UUFFRCxVQUFVLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFyb0JDO0lBREMsR0FBRztrREFxb0JIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHVpRGF5IH0gZnJvbSBcIkB0YWlnYS11aS9jZGtcIjtcclxuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIi4vZm9ybS12aWV3L2Zvcm0tdmlldy5kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IGhhc0tleSB9IGZyb20gXCIuL3JlbmRlcmVyLmhlbHBlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnZlcnRlciB7XHJcbiAgZ2V0Rm9ybUZpZWxkcyA9IChmb3JtQ29uZmlnOiBhbnkpOiBhbnlbXSA9PiB7XHJcbiAgICBsZXQgZmllbGRzOiBhbnlbXTtcclxuXHJcbiAgICBpZiAoaGFzS2V5KGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpKSB7XHJcbiAgICAgIGZpZWxkcyA9IGZvcm1Db25maWcubXVsdGlGb3JtLmZpZWxkcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpZWxkcyA9IGZvcm1Db25maWcuZmllbGRzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWVsZHM7XHJcbiAgfTtcclxuXHJcbiAgc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgaWYgKCFoYXNLZXkoZmllbGQsIGtleSkpIHtcclxuICAgICAgZmllbGRba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkO1xyXG4gIH07XHJcblxyXG4gIHNldEZpZWxkS2V5VmFsdWUgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgZmllbGRba2V5XSA9IHZhbHVlO1xyXG5cclxuICAgIHJldHVybiBmaWVsZDtcclxuICB9O1xyXG5cclxuICByZW1vdmVGaWVsZEtleSA9IChmaWVsZDogYW55LCBrZXk6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgICBpZiAoaGFzS2V5KGZpZWxkLCBrZXkpKSB7XHJcbiAgICAgIGRlbGV0ZSBmaWVsZFtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWVsZDtcclxuICB9O1xyXG5cclxuICBAbG9nXHJcbiAgY29udmVydEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHVwZGF0ZU9uRmllbGRUeXBlID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVUaXRsZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZEtleTogc3RyaW5nID0gYCR7ZmllbGQudHlwZX1fJHtmaWVsZC5sYWJlbFxyXG4gICAgICAgICAgLnNwbGl0KFwiIFwiKVxyXG4gICAgICAgICAgLmpvaW4oXCJfXCIpXHJcbiAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKX1gO1xyXG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImtleVwiLCBmaWVsZEtleSk7XHJcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVSYWRpbyA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICBcInNpemVcIixcclxuICAgICAgICAgIFwibVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICBcIm9yaWVudGF0aW9uXCIsXHJcbiAgICAgICAgICBcInZlcnRpY2FsXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImhpZGRlblwiLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLm1hcCgoeDogYW55KTogYW55ID0+IHtcclxuICAgICAgICAgIHJldHVybiB7IGxhYmVsOiB4LCBkaXNhYmxlZDogZmFsc2UgfTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVPdHAgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXHJcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgXCJtYXNrXCIsXHJcbiAgICAgICAgICBuZXcgQXJyYXkoZmllbGQucHJvcGVydGllcy5vdHBMZW5ndGgpLmZpbGwoXCIjXCIpLmpvaW4oXCIgXCIpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmllbGQ7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZURhdGUgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udmVydERhdGVTdHJpbmdUb1R1aURheUZvcm1hdCA9IChkYXRlOiBzdHJpbmcpOiBUdWlEYXkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXREYXRlID0gZGF0ZS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICBjb25zdCB0dWlEYXkgPSBuZXcgVHVpRGF5KFxyXG4gICAgICAgICAgICBOdW1iZXIoc3BsaXREYXRlWzJdKSwgLy8gWWVhclxyXG4gICAgICAgICAgICBOdW1iZXIoc3BsaXREYXRlWzFdKSAtIDEsIC8vIE1vbnRoLCBXaHkgJy0xJyA9PiBCZWNhdXNlIFRhaWdhLVVJIFJlcXVpcmVkIEl0LCBTby4uLlxyXG4gICAgICAgICAgICBOdW1iZXIoc3BsaXREYXRlWzBdKSAvLyBEYXlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHR1aURheTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaGFzS2V5KGZpZWxkLCBcIm1pblwiKSkge1xyXG4gICAgICAgICAgY29uc3QgdHVpRGF5ID0gY29udmVydERhdGVTdHJpbmdUb1R1aURheUZvcm1hdChmaWVsZFtcIm1pblwiXSk7XHJcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxyXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBcIm1pblwiLFxyXG4gICAgICAgICAgICB0dWlEYXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxyXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBcIm1pblwiLFxyXG4gICAgICAgICAgICBuZXcgVHVpRGF5KDAsIDAsIDEpXHJcbiAgICAgICAgICApOyAvLyBZZWFyIC0gMDAwMCwgTW9udGggLSAwICgwIEluZGV4aW5nKSwgRGF5IC0gMVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhhc0tleShmaWVsZCwgXCJtYXhcIikpIHtcclxuICAgICAgICAgIGNvbnN0IHR1aURheSA9IGNvbnZlcnREYXRlU3RyaW5nVG9UdWlEYXlGb3JtYXQoZmllbGRbXCJtYXhcIl0pO1xyXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcclxuICAgICAgICAgICAgXCJtYXhcIixcclxuICAgICAgICAgICAgdHVpRGF5XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcclxuICAgICAgICAgICAgXCJtYXhcIixcclxuICAgICAgICAgICAgbmV3IFR1aURheShcclxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksIC8vIFllYXIgLSA5OTk5XHJcbiAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRNb250aCgpLCAvLyBNb250aCAtIDExICgwIEluZGV4aW5nKVxyXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpIC8vIERheSAtIDMxXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmllbGQ7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZU51bWJlciA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgICBpZiAoaGFzS2V5KGZpZWxkLCBcImtleVwiKSkge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0gXCJhYWRoYWFyX251bWJlclwiKSB7XHJcbiAgICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInR5cGVcIiwgXCJhYWRoYWFyX251bWJlclwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmaWVsZC5rZXkgPT09IFwiY29udGFjdF9udW1iZXJcIikge1xyXG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ0eXBlXCIsIFwicGhvbmVcIik7XHJcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxyXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgICAgXCJjb3VudHJ5Q29kZVwiLFxyXG4gICAgICAgICAgICAgIFwiKzkxXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXHJcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcclxuICAgICAgICAgICAgICBcInBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcIixcclxuICAgICAgICAgICAgICBcIiMjIyMtIyMjIyMjXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxyXG4gICAgICAgICAgICAgIFwibm90LXplcm9cIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxyXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgICAgXCJtaW5cIixcclxuICAgICAgICAgICAgICAtSW5maW5pdHlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICAgIFwibWF4XCIsXHJcbiAgICAgICAgICAgICAgSW5maW5pdHlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICAgIFwicHJlY2lzaW9uXCIsXHJcbiAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVBcGlDYWxsID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghaGFzS2V5KGZpZWxkLnByb3BlcnRpZXMsIFwic2hhcGVcIikpIHtcclxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXHJcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgIFwic2hhcGVcIixcclxuICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFoYXNLZXkoZmllbGQsIFwic2hvd0xvYWRlclwiKSkge1xyXG4gICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwic2hvd0xvYWRlclwiLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaGFzS2V5KGZpZWxkLnByb3BlcnRpZXMsIFwic2l6ZVwiKSkge1xyXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcclxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcclxuICAgICAgICAgICAgXCJzaXplXCIsXHJcbiAgICAgICAgICAgIFwibVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWhhc0tleShmaWVsZCwgXCJhcGlcIikpIHtcclxuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImFwaVwiLCB7fSk7XHJcblxyXG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwidXJsXCIsIFwiXCIpO1xyXG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwicmVxdWVzdFwiLCBcIlwiKTtcclxuICAgICAgICAgIGZpZWxkLmFwaSA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQuYXBpLCBcInJlc3BvbnNlXCIsIFwiXCIpO1xyXG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwic3RhdHVzXCIsIFwiXCIpO1xyXG5cclxuICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxyXG4gICAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzLFxyXG4gICAgICAgICAgICBcInZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXHJcbiAgICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMsXHJcbiAgICAgICAgICAgIFwibGFiZWxzXCIsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBcIkNhbGwgQVBJXCIsXHJcbiAgICAgICAgICAgICAgbG9hZGluZzogXCJDYWxsIEFQSVwiLFxyXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IFwiQVBJIFN1Y2Nlc3NcIixcclxuICAgICAgICAgICAgICBmYWlsZWQ6IFwiQVBJIEZhaWxlZFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaWVsZDtcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlU2VhcmNoVGV4dCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgICBpZiAoaGFzS2V5KGZpZWxkLCBcInR5cGVcIikpIHtcclxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBcInNlYXJjaC10ZXh0XCIpIHtcclxuICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXHJcbiAgICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCIsXHJcbiAgICAgICAgICAgICAgXCJkcm9wZG93bi13aXRoLXNlYXJjaFwiXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmllbGQ7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVRleHQgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInRpdGxlXCI6XHJcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVRpdGxlKGZpZWxkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOlxyXG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVSYWRpbyhmaWVsZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwib3RwXCI6XHJcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZU90cChmaWVsZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVEYXRlKGZpZWxkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlTnVtYmVyKGZpZWxkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJhcGktY2FsbFwiOlxyXG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVBcGlDYWxsKGZpZWxkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJzZWFyY2gtdGV4dFwiOlxyXG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVTZWFyY2hUZXh0KGZpZWxkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3QgPSAoa2V5OiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgY29uZGl0aW9uczogeyBmb3JtdWxhOiBcIlwiLCBydWxlczogW10gfSxcclxuICAgICAgICBhY3Rpb25zOiB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbXSB9XHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZvcm1hdEZpZWxkS2V5cyA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgaWYgKGhhc0tleShmaWVsZCwgXCJjb25uZWN0ZWRUb1wiKSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1wiXSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9IFtcclxuICAgICAgICAgICAgZ2V0Q29ubmVjdGVkRWxlbWVudEtleVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9cIl0pXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFRvXCJdID0gZmllbGRbXCJjb25uZWN0ZWRUb1wiXS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3Qoa2V5KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9IGZpZWxkW1wiY29ubmVjdGVkVG9cIl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVtb3ZlRmllbGRLZXkoZmllbGQsIFwiY29ubmVjdGVkVG9cIik7XHJcblxyXG4gICAgICBpZiAoaGFzS2V5KGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFtcImNvbm5lY3RlZFRvUGFyZW50XCJdID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IFtcclxuICAgICAgICAgICAgZ2V0Q29ubmVjdGVkRWxlbWVudEtleVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl0pXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdChcclxuICAgICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRUb1BhcmVudFwiXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJjb25uZWN0ZWRUb1BhcmVudFwiKTtcclxuXHJcbiAgICAgIHRoaXMucmVtb3ZlRmllbGRLZXkoZmllbGQsIFwic2lkZUVmZmVjdFwiKTtcclxuXHJcbiAgICAgIHJldHVybiBmaWVsZDtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyA9IChcclxuICAgICAgZmllbGQ6IGFueSxcclxuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcclxuICAgICk6IGFueSA9PiB7XHJcbiAgICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRDaGlsZEZpZWxkTWFwcGluZyA9IChcclxuICAgICAgICBmaWVsZDogYW55LFxyXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XHJcbiAgICAgICk6IGFueSA9PiB7XHJcbiAgICAgICAgaWYgKGhhc0tleShmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKSkge1xyXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XSA9IGZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzS2V5KGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcImNoaWxkXCJdLCBmaWVsZC5rZXkpKSB7XHJcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID1cclxuICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcgPSAoXHJcbiAgICAgICAgZmllbGQ6IGFueSxcclxuICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxyXG4gICAgICApOiBhbnkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmcpO1xyXG4gICAgICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSkpIHtcclxuICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RlZFBhcmVudEtleSBvZiBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtcclxuICAgICAgICAgICAgZmllbGQua2V5XHJcbiAgICAgICAgICBdKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBoYXNLZXkoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdLCBjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl0pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dLnB1c2goXHJcbiAgICAgICAgICAgICAgICBmaWVsZC5rZXlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dID0gW1xyXG4gICAgICAgICAgICAgICAgZmllbGQua2V5XHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZmllbGQ6IGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGNvbm5lY3RlZEZpZWxkTWFwcGluZyB9O1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmcgPSBnZXRDb25uZWN0ZWRFbGVtZW50Q2hpbGRGaWVsZE1hcHBpbmcoXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXHJcbiAgICAgICk7XHJcbiAgICAgIGZpZWxkID0gY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmdbXCJmaWVsZFwiXTtcclxuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cclxuICAgICAgICBjb25uZWN0ZWRDaGlsZEZpZWxkTWFwcGluZ1tcImNvbm5lY3RlZEZpZWxkTWFwcGluZ1wiXTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcoXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXHJcbiAgICAgICk7XHJcbiAgICAgIGZpZWxkID0gY29ubmVjdGVkUGFyZW50RmllbGRNYXBwaW5nW1wiZmllbGRcIl07XHJcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZyA9XHJcbiAgICAgICAgY29ubmVjdGVkUGFyZW50RmllbGRNYXBwaW5nW1wiY29ubmVjdGVkRmllbGRNYXBwaW5nXCJdO1xyXG5cclxuICAgICAgcmV0dXJuIGNvbm5lY3RlZEZpZWxkTWFwcGluZztcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdXBkYXRlQ29ubmVjdGVkRWxlbWVudHNLZXlWYWx1ZSA9IChcclxuICAgICAgZmllbGQ6IGFueSxcclxuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcclxuICAgICk6IGFueSA9PiB7XHJcbiAgICAgIGlmIChoYXNLZXkoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSkpIHtcclxuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhhc0tleShjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJwYXJlbnRcIl0sIGZpZWxkLmtleSkpIHtcclxuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9XHJcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJwYXJlbnRcIl1bZmllbGQua2V5XTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVGaWVsZFZhbGlkYXRvckNvbmZpZyA9IChmaWVsZDogYW55KTogYW55ID0+IHtcclxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09IFwidGl0bGVcIikge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBoYXNLZXkoZmllbGQsIFwidmFsaWRhdG9yc1wiKSA/IGZpZWxkLnZhbGlkYXRvcnMgOiB7fTtcclxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQsIFwidmFsaWRhdG9yc1wiLCB7fSk7XHJcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwidmFsaWRhdG9yc1wiLCB7XHJcbiAgICAgICAgICAuLi5maWVsZFtcInZhbGlkYXRvcnNcIl0sXHJcbiAgICAgICAgICBtaW46IGhhc0tleSh2YWxpZGF0b3JzLCBcIm1pblwiKVxyXG4gICAgICAgICAgICA/IHZhbGlkYXRvcnMubWluXHJcbiAgICAgICAgICAgIDogaGFzS2V5KGZpZWxkLCBcIm1pblwiKVxyXG4gICAgICAgICAgICA/IGZpZWxkLm1pblxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIG1heDogaGFzS2V5KHZhbGlkYXRvcnMsIFwibWF4XCIpXHJcbiAgICAgICAgICAgID8gdmFsaWRhdG9ycy5tYXhcclxuICAgICAgICAgICAgOiBoYXNLZXkoZmllbGQsIFwibWF4XCIpXHJcbiAgICAgICAgICAgID8gZmllbGQubWF4XHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgcmVxdWlyZWQ6IGhhc0tleSh2YWxpZGF0b3JzLCBcInJlcXVpcmVkXCIpXHJcbiAgICAgICAgICAgID8gdmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICAgICAgICA6IGhhc0tleShmaWVsZCwgXCJyZXF1aXJlZFwiKVxyXG4gICAgICAgICAgICA/IGZpZWxkLnJlcXVpcmVkXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgbWluTGVuZ3RoOiBoYXNLZXkodmFsaWRhdG9ycywgXCJtaW5MZW5ndGhcIilcclxuICAgICAgICAgICAgPyB2YWxpZGF0b3JzLm1pbkxlbmd0aFxyXG4gICAgICAgICAgICA6IGhhc0tleShmaWVsZCwgXCJtaW5MZW5ndGhcIilcclxuICAgICAgICAgICAgPyBmaWVsZC5taW5MZW5ndGhcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBtYXhMZW5ndGg6IGhhc0tleSh2YWxpZGF0b3JzLCBcIm1heExlbmd0aFwiKVxyXG4gICAgICAgICAgICA/IHZhbGlkYXRvcnMubWF4TGVuZ3RoXHJcbiAgICAgICAgICAgIDogaGFzS2V5KGZpZWxkLCBcImxlbmd0aFwiKVxyXG4gICAgICAgICAgICA/IGZpZWxkLmxlbmd0aFxyXG4gICAgICAgICAgICA6IGhhc0tleShmaWVsZCwgXCJtYXhMZW5ndGhcIilcclxuICAgICAgICAgICAgPyBmaWVsZC5tYXhMZW5ndGhcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBwYXR0ZXJuOiBoYXNLZXkoZmllbGQudmFsaWRhdG9ycywgXCJwYXR0ZXJuXCIpXHJcbiAgICAgICAgICAgID8gZmllbGQudmFsaWRhdG9ycy5wYXR0ZXJuXHJcbiAgICAgICAgICAgIDogaGFzS2V5KGZpZWxkLCBcInBhdHRlcm5cIilcclxuICAgICAgICAgICAgPyBmaWVsZC5wYXR0ZXJuXHJcbiAgICAgICAgICAgIDogaGFzS2V5KGZpZWxkLCBcInJlZ2V4XCIpXHJcbiAgICAgICAgICAgID8gZmllbGQucmVnZXhcclxuICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1pbjtcclxuICAgICAgICBkZWxldGUgZmllbGQubWF4O1xyXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5yZXF1aXJlZDtcclxuICAgICAgICBkZWxldGUgZmllbGQubWluTGVuZ3RoO1xyXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5sZW5ndGg7XHJcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1heExlbmd0aDtcclxuICAgICAgICBkZWxldGUgZmllbGQucGF0dGVybjtcclxuICAgICAgICBkZWxldGUgZmllbGQucmVnZXg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmaWVsZDtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdXBkYXRlRmllbGREZWZhdWx0VmFsdWVDb25maWcgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSBcInRpdGxlXCIpIHtcclxuICAgICAgICBpZiAoaGFzS2V5KGZpZWxkLCBcImRlZmF1bHRWYWx1ZVwiKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzS2V5KGZpZWxkLCBcImRlZmF1bHRcIikpIHtcclxuICAgICAgICAgIHJldHVybiBmaWVsZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGhhc0tleShmaWVsZCwgXCJkZWZhdWx0VmFsXCIpKSB7XHJcbiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBiZWxvdyBsaW5lIGlzIGNvbW1lbnRlZCBiZWNhdXNlIGl0IGNhdXNlZCBpc3N1ZXMgaW4gc2V0dGluZyBEZWZhdWx0IFZhbHVlLlxyXG4gICAgICAgICAgICAvLyBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcclxuICAgICAgICAgICAgLy8gZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBUT0RPOiBDb25kaXRpb24gZm9yIGFsbF9mb3Jtc19kYXRhIGlzIG5vdCBjb25zaWRlcmVkIHlldC5cclxuICAgICAgICAgIGlmIChmaWVsZC5hdXRvUG9wdWxhdGVGcm9tU3VtbWFyeURhdGEpIHtcclxuICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XHJcbiAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxyXG4gICAgICAgICAgICAgIHNvdXJjZXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgc291cmNlOiBcInN1bW1hcnlfZGF0YVwiLFxyXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5X2RhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzS2V5KGZpZWxkLCBcImF1dG9maWxsXCIpKSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNLZXkoZmllbGQuYXV0b2ZpbGwsIFwidHlwZVwiKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmaWVsZC5hdXRvZmlsbC50eXBlID09PSBcInN0b3JhZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XHJcbiAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiYnJvd3Nlcl9zdG9yYWdlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBicm93c2VyX3N0b3JhZ2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmF1dG9maWxsLnR5cGUgPT09IFwiY29uZmlnXCIpIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xyXG4gICAgICAgICAgICAgICAgICBpc19mb3VuZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBcImZpZWxkX2NvbmZpZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGAkLiR7ZmllbGQua2V5fWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3RfZW1wdHk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0X2RlZmF1bHRfdmFsdWVfZm91bmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfdmFsdWVfZm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMSBPUiBOT1QoMSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZpZWxkOiB7IHZhbHVlOiB0cnVlIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcclxuICAgICAgICAgICAgICBpc19mb3VuZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgc291cmNlczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiZm9ybV9kYXRhXCIsXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGAkLiR7ZmllbGQua2V5fWAsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ub3RfZW1wdHk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfdmFsdWVfZm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMSBPUiBOT1QoMSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVGaWVsZE1lc3NhZ2VzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSAhPT0gXCJ0aXRsZVwiKSB7XHJcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLCBcIm1lc3NhZ2VzXCIsIFtdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVGaWVsZFJlc2V0QnV0dG9uID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJ0aXRsZVwiKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgaGFzS2V5KGZpZWxkLCBcImFjdGlvblwiKSAmJlxyXG4gICAgICAgICAgZmllbGQuYWN0aW9uID09PSBcInJlc2V0XCIgJiZcclxuICAgICAgICAgIGhhc0tleShmaWVsZCwgXCJmaWVsZHNcIilcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInJlc2V0XCIsIHtcclxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHNcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZmllbGRzOiBhbnlbXSA9IHRoaXMuZ2V0Rm9ybUZpZWxkcyhmb3JtQ29uZmlnKTtcclxuXHJcbiAgICBsZXQgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnkgPSB7XHJcbiAgICAgIHBhcmVudDoge30sXHJcbiAgICAgIGNoaWxkOiB7fVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXRGb3JtRmllbGRzID0gKGZvcm1Db25maWc6IGFueSwgZmllbGRzOiBhbnlbXSk6IGFueSA9PiB7XHJcbiAgICAgIGlmIChoYXNLZXkoZm9ybUNvbmZpZywgXCJtdWx0aUZvcm1cIikpIHtcclxuICAgICAgICBmb3JtQ29uZmlnLm11bHRpRm9ybVtcImZpZWxkc1wiXSA9IGZpZWxkcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3JtQ29uZmlnW1wiZmllbGRzXCJdID0gZmllbGRzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZm9ybUNvbmZpZztcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XHJcbiAgICAgIGZpZWxkID0gdXBkYXRlT25GaWVsZFR5cGUoZmllbGQpO1xyXG5cclxuICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZEtleXMoZmllbGQpO1xyXG5cclxuICAgICAgLy8gY29ubmVjdGVkRmllbGRNYXBwaW5nID0gZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyhcclxuICAgICAgLy8gICBmaWVsZCxcclxuICAgICAgLy8gICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcclxuICAgICAgLy8gKTtcclxuICAgICAgLy8gZmllbGQgPSB1cGRhdGVDb25uZWN0ZWRFbGVtZW50c0tleVZhbHVlKGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmcpO1xyXG5cclxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZERlZmF1bHRWYWx1ZUNvbmZpZyhmaWVsZCk7XHJcblxyXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkVmFsaWRhdG9yQ29uZmlnKGZpZWxkKTtcclxuXHJcbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRSZXNldEJ1dHRvbihmaWVsZCk7XHJcblxyXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkTWVzc2FnZXMoZmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1Db25maWcgPSBzZXRGb3JtRmllbGRzKGZvcm1Db25maWcsIGZpZWxkcyk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1Db25maWc7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|