client-core-services 1.0.0
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 +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { UntypedFormControl } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../common-utils/common-function.service";
|
|
5
|
+
import * as i2 from "../../fileHandler/file-handler.service";
|
|
6
|
+
import * as i3 from "../../grid/grid-common-function/grid-common-function.service";
|
|
7
|
+
import * as i4 from "../../tree-component/tree-component.service";
|
|
8
|
+
export class FormControlService {
|
|
9
|
+
constructor(commonFunctionService, fileHandlerService, gridCommonFunctionService, TreeComponentService) {
|
|
10
|
+
this.commonFunctionService = commonFunctionService;
|
|
11
|
+
this.fileHandlerService = fileHandlerService;
|
|
12
|
+
this.gridCommonFunctionService = gridCommonFunctionService;
|
|
13
|
+
this.TreeComponentService = TreeComponentService;
|
|
14
|
+
}
|
|
15
|
+
editeListFieldData(templateForm, custmizedFormValue, tableFields, field, index, listOfFieldsUpdateIndex, staticData, dataListForUpload) {
|
|
16
|
+
let responce = {
|
|
17
|
+
"listOfFieldUpdateMode": true,
|
|
18
|
+
"listOfFieldsUpdateIndex": listOfFieldsUpdateIndex,
|
|
19
|
+
"custmizedFormValue": custmizedFormValue,
|
|
20
|
+
"dataListForUpload": dataListForUpload,
|
|
21
|
+
"templateForm": templateForm
|
|
22
|
+
};
|
|
23
|
+
let parentList = responce.custmizedFormValue[field.field_name];
|
|
24
|
+
let object = parentList[index];
|
|
25
|
+
responce.listOfFieldsUpdateIndex = index;
|
|
26
|
+
if (tableFields && tableFields.length > 0) {
|
|
27
|
+
tableFields.forEach((element) => {
|
|
28
|
+
switch (element.type) {
|
|
29
|
+
case "list_of_fields":
|
|
30
|
+
if (element.field_name == field.field_name && templateForm != null) {
|
|
31
|
+
responce.templateForm.controls[element.field_name].reset();
|
|
32
|
+
if (element.list_of_fields.length > 0) {
|
|
33
|
+
element.list_of_fields.forEach((data) => {
|
|
34
|
+
switch (data.type) {
|
|
35
|
+
case "list_of_string":
|
|
36
|
+
const custmisedKey = this.commonFunctionService.custmizedKey(element);
|
|
37
|
+
if (!responce.custmizedFormValue[custmisedKey])
|
|
38
|
+
responce.custmizedFormValue[custmisedKey] = {};
|
|
39
|
+
responce.custmizedFormValue[custmisedKey][data.field_name] = object[data.field_name];
|
|
40
|
+
break;
|
|
41
|
+
case "typeahead":
|
|
42
|
+
if (data.datatype == 'list_of_object') {
|
|
43
|
+
const custmisedKey = this.commonFunctionService.custmizedKey(element);
|
|
44
|
+
if (!responce.custmizedFormValue[custmisedKey])
|
|
45
|
+
responce.custmizedFormValue[custmisedKey] = {};
|
|
46
|
+
responce.custmizedFormValue[custmisedKey][data.field_name] = object[data.field_name];
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(object[data.field_name]);
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case "list_of_checkbox":
|
|
53
|
+
let checkboxListValue = [];
|
|
54
|
+
if (staticData && staticData[data.ddn_field] && staticData[data.ddn_field].length > 0) {
|
|
55
|
+
staticData[data.ddn_field].forEach((value) => {
|
|
56
|
+
let arrayData = object[data.field_name];
|
|
57
|
+
let selected = false;
|
|
58
|
+
if (arrayData != undefined && arrayData != null) {
|
|
59
|
+
for (let index = 0; index < arrayData.length; index++) {
|
|
60
|
+
if (this.commonFunctionService.checkObjecOrString(value) == this.commonFunctionService.checkObjecOrString(arrayData[index])) {
|
|
61
|
+
selected = true;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (selected) {
|
|
67
|
+
checkboxListValue.push(true);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
checkboxListValue.push(false);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//this.templateForm.get(element.field_name).get(data.field_name).setValue(checkboxListValue);
|
|
75
|
+
responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(checkboxListValue);
|
|
76
|
+
break;
|
|
77
|
+
case "file":
|
|
78
|
+
case "input_with_uploadfile":
|
|
79
|
+
if (object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
80
|
+
let custmizedKey = this.commonFunctionService.custmizedKey(element);
|
|
81
|
+
if (!responce.dataListForUpload[custmizedKey])
|
|
82
|
+
responce.dataListForUpload[custmizedKey] = {};
|
|
83
|
+
if (!responce.dataListForUpload[custmizedKey][data.field_name])
|
|
84
|
+
responce.dataListForUpload[custmizedKey][data.field_name] = [];
|
|
85
|
+
responce.dataListForUpload[custmizedKey][data.field_name] = this.fileHandlerService.modifyUploadFiles(JSON.parse(JSON.stringify(object[data.field_name])));
|
|
86
|
+
//responce.dataListForUpload[custmizedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
|
|
87
|
+
const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
|
|
88
|
+
//this.templateForm.get(element.field_name).get(data.field_name).setValue(value);
|
|
89
|
+
responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(value);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
//this.templateForm.get(element.field_name).get(data.field_name).setValue(object[data.field_name]);
|
|
94
|
+
responce.templateForm.controls[element.field_name].controls[data.field_name].setValue(object[data.field_name]);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return responce;
|
|
107
|
+
}
|
|
108
|
+
updateDataOnForm(templateForm, tableFields, formValue, formFieldButtons, custmizedFormValue, modifyCustmizedFormValue, selectedRow, dataListForUpload, treeViewData, staticData, longitude, latitude, zoom) {
|
|
109
|
+
let responce = {
|
|
110
|
+
templateForm: templateForm,
|
|
111
|
+
custmizedFormValue: custmizedFormValue,
|
|
112
|
+
modifyCustmizedFormValue: modifyCustmizedFormValue,
|
|
113
|
+
tableFields: tableFields,
|
|
114
|
+
dataListForUpload: dataListForUpload,
|
|
115
|
+
selectedRow: selectedRow,
|
|
116
|
+
treeViewData: treeViewData,
|
|
117
|
+
staticData: staticData,
|
|
118
|
+
longitude: longitude,
|
|
119
|
+
latitude: latitude,
|
|
120
|
+
zoom: zoom,
|
|
121
|
+
getAddress: false
|
|
122
|
+
};
|
|
123
|
+
tableFields.forEach((element) => {
|
|
124
|
+
if (element && element.field_name && element.field_name != '') {
|
|
125
|
+
let fieldName = element.field_name;
|
|
126
|
+
let object = formValue[fieldName];
|
|
127
|
+
if (object != null && object != undefined) {
|
|
128
|
+
this.updateFormValue(element, formValue, responce);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
if (formFieldButtons.length > 0) {
|
|
133
|
+
formFieldButtons.forEach((element) => {
|
|
134
|
+
let fieldName = element.field_name;
|
|
135
|
+
let object = selectedRow[fieldName];
|
|
136
|
+
if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
|
|
137
|
+
if (element.field_name && element.field_name != '') {
|
|
138
|
+
switch (element.type) {
|
|
139
|
+
case "dropdown":
|
|
140
|
+
let dropdownValue = object == null ? null : object;
|
|
141
|
+
responce.templateForm.controls[element.field_name].setValue(dropdownValue);
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return responce;
|
|
151
|
+
}
|
|
152
|
+
updateFormValue(element, formValue, responce) {
|
|
153
|
+
let type = element.type;
|
|
154
|
+
let datatype = element.datatype;
|
|
155
|
+
let tree_view_object = element.tree_view_object;
|
|
156
|
+
let date_format = element.date_format;
|
|
157
|
+
let fieldName = element.field_name;
|
|
158
|
+
let ddn_field = element.ddn_field;
|
|
159
|
+
let parent = element.parent;
|
|
160
|
+
let list_of_fields = element.list_of_fields;
|
|
161
|
+
let object = formValue[fieldName];
|
|
162
|
+
switch (type) {
|
|
163
|
+
case "grid_selection":
|
|
164
|
+
case 'grid_selection_vertical':
|
|
165
|
+
case "list_of_string":
|
|
166
|
+
case "drag_drop":
|
|
167
|
+
if (object != null && object != undefined) {
|
|
168
|
+
if (Array.isArray(object)) {
|
|
169
|
+
responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
|
|
170
|
+
if (type.startsWith("grid_selection")) {
|
|
171
|
+
const modifyData = this.gridCommonFunctionService.gridDataModify(responce.modifyCustmizedFormValue, responce.custmizedFormValue, responce.tableFields, fieldName, "grid_selection", formValue);
|
|
172
|
+
responce.modifyCustmizedFormValue = modifyData.modifyData;
|
|
173
|
+
if (modifyData.field_index != -1) {
|
|
174
|
+
const index = modifyData.field_index;
|
|
175
|
+
responce.tableFields[index] = modifyData.fields[index];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
responce.templateForm.controls[fieldName].setValue('');
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
case "file":
|
|
183
|
+
case "input_with_uploadfile":
|
|
184
|
+
case "file_for_s3":
|
|
185
|
+
if (object != null && object != undefined) {
|
|
186
|
+
responce.dataListForUpload[fieldName] = JSON.parse(JSON.stringify(object));
|
|
187
|
+
const value = this.fileHandlerService.modifyFileSetValue(object);
|
|
188
|
+
if (type == 'input_with_uploadfile') {
|
|
189
|
+
let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object);
|
|
190
|
+
element['tooltipMsg'] = tooltipMsg;
|
|
191
|
+
}
|
|
192
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
case "list_of_fields":
|
|
196
|
+
if (object != null && object != undefined) {
|
|
197
|
+
if (Array.isArray(object)) {
|
|
198
|
+
responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
|
|
199
|
+
let modifyObject = this.gridCommonFunctionService.modifyListofFieldsData(element, responce.custmizedFormValue[fieldName], element.list_of_fields);
|
|
200
|
+
responce.modifyCustmizedFormValue[fieldName] = modifyObject['data'];
|
|
201
|
+
}
|
|
202
|
+
else if (typeof object == "object" && datatype == 'key_value') {
|
|
203
|
+
responce.custmizedFormValue[fieldName] = object;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
if (list_of_fields && list_of_fields != null && list_of_fields.length > 0) {
|
|
207
|
+
list_of_fields.forEach((data, j) => {
|
|
208
|
+
switch (data.type) {
|
|
209
|
+
case "list_of_string":
|
|
210
|
+
case "grid_selection":
|
|
211
|
+
case 'grid_selection_vertical':
|
|
212
|
+
case "drag_drop":
|
|
213
|
+
if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
214
|
+
if (Array.isArray(object[data.field_name])) {
|
|
215
|
+
if (!responce.custmizedFormValue[fieldName])
|
|
216
|
+
responce.custmizedFormValue[fieldName] = {};
|
|
217
|
+
responce.custmizedFormValue[fieldName][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
|
|
218
|
+
}
|
|
219
|
+
responce.templateForm.controls[fieldName].controls[data.field_name].setValue('');
|
|
220
|
+
//(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue('');
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
case "typeahead":
|
|
224
|
+
if (data.datatype == "list_of_object" || datatype == 'chips') {
|
|
225
|
+
if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
226
|
+
if (Array.isArray(object[data.field_name])) {
|
|
227
|
+
if (!responce.custmizedFormValue[fieldName])
|
|
228
|
+
responce.custmizedFormValue[fieldName] = {};
|
|
229
|
+
responce.custmizedFormValue[fieldName][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
|
|
230
|
+
}
|
|
231
|
+
responce.templateForm.controls[fieldName].controls[data.field_name].setValue('');
|
|
232
|
+
//(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue('');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
237
|
+
const value = object[data.field_name];
|
|
238
|
+
responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
|
|
239
|
+
//(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue(value);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
case "input_with_uploadfile":
|
|
244
|
+
if (object != null && object != undefined && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
245
|
+
let custmisedKey = this.commonFunctionService.custmizedKey(element);
|
|
246
|
+
responce.dataListForUpload[custmisedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
|
|
247
|
+
const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
|
|
248
|
+
let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object[data.field_name]);
|
|
249
|
+
element.list_of_fields[j]['tooltipMsg'] = tooltipMsg;
|
|
250
|
+
responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
default:
|
|
254
|
+
if (object && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
255
|
+
const value = object[data.field_name];
|
|
256
|
+
responce.templateForm.controls[fieldName].controls[data.field_name].setValue(value);
|
|
257
|
+
//(<FormGroup>this.templateForm.controls[element.field_name]).controls[data.field_name].patchValue(value);
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
break;
|
|
266
|
+
case "typeahead":
|
|
267
|
+
if (datatype == "list_of_object" || datatype == 'chips') {
|
|
268
|
+
if (object != null && object != undefined) {
|
|
269
|
+
responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
|
|
270
|
+
responce.templateForm.controls[fieldName].setValue('');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
if (object != null && object != undefined) {
|
|
275
|
+
const value = object;
|
|
276
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
case "group_of_fields":
|
|
281
|
+
if (list_of_fields && list_of_fields.length > 0) {
|
|
282
|
+
list_of_fields.forEach((data, j) => {
|
|
283
|
+
let ChildFieldData = object;
|
|
284
|
+
let childFieldName = data.field_name;
|
|
285
|
+
if (data && childFieldName && childFieldName != '' && ChildFieldData && ChildFieldData != null) {
|
|
286
|
+
switch (data.type) {
|
|
287
|
+
case "list_of_string":
|
|
288
|
+
case "grid_selection":
|
|
289
|
+
case 'grid_selection_vertical':
|
|
290
|
+
case "drag_drop":
|
|
291
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
292
|
+
if (!responce.custmizedFormValue[fieldName])
|
|
293
|
+
responce.custmizedFormValue[fieldName] = {};
|
|
294
|
+
const value = JSON.parse(JSON.stringify(ChildFieldData[childFieldName]));
|
|
295
|
+
responce.custmizedFormValue[fieldName][childFieldName] = value;
|
|
296
|
+
//this.templateForm.get(fieldName).get(childFieldName).setValue('')
|
|
297
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue('');
|
|
298
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue('');
|
|
299
|
+
}
|
|
300
|
+
break;
|
|
301
|
+
case "typeahead":
|
|
302
|
+
if (data.datatype == "list_of_object" || data.datatype == 'chips') {
|
|
303
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
304
|
+
if (!responce.custmizedFormValue[fieldName])
|
|
305
|
+
responce.custmizedFormValue[fieldName] = {};
|
|
306
|
+
const value = JSON.parse(JSON.stringify(ChildFieldData[childFieldName]));
|
|
307
|
+
responce.custmizedFormValue[fieldName][childFieldName] = value;
|
|
308
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
309
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue('');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
314
|
+
const value = ChildFieldData[childFieldName];
|
|
315
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
316
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(value);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
case "number":
|
|
321
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
322
|
+
let gvalue;
|
|
323
|
+
const value = ChildFieldData[childFieldName];
|
|
324
|
+
if (value != null && value != '') {
|
|
325
|
+
gvalue = value;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
gvalue = 0;
|
|
329
|
+
}
|
|
330
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(gvalue);
|
|
331
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(gvalue);
|
|
332
|
+
}
|
|
333
|
+
else if (ChildFieldData && ChildFieldData.hasOwnProperty(childFieldName)) {
|
|
334
|
+
let gvalue = 0;
|
|
335
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(gvalue);
|
|
336
|
+
}
|
|
337
|
+
break;
|
|
338
|
+
case "list_of_checkbox":
|
|
339
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].patchValue([]);
|
|
340
|
+
if (parent) {
|
|
341
|
+
responce.selectedRow[parent] = {};
|
|
342
|
+
responce.selectedRow[parent][fieldName] = ChildFieldData;
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
responce.selectedRow[fieldName] = ChildFieldData;
|
|
346
|
+
}
|
|
347
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue([]);
|
|
348
|
+
break;
|
|
349
|
+
case "date":
|
|
350
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
351
|
+
if (data.date_format && data.date_format != "" && typeof ChildFieldData[childFieldName] === 'string') {
|
|
352
|
+
const date = ChildFieldData[childFieldName];
|
|
353
|
+
const dateMonthYear = date.split('/');
|
|
354
|
+
const formatedDate = dateMonthYear[2] + "-" + dateMonthYear[1] + "-" + dateMonthYear[0];
|
|
355
|
+
const value = new Date(formatedDate);
|
|
356
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
const value = formValue[fieldName][childFieldName] == null ? null : formValue[fieldName][childFieldName];
|
|
360
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
break;
|
|
364
|
+
case "input_with_uploadfile":
|
|
365
|
+
if (object != null && object != undefined && object[data.field_name] != null && object[data.field_name] != undefined) {
|
|
366
|
+
let custmisedKey = this.commonFunctionService.custmizedKey(element);
|
|
367
|
+
responce.dataListForUpload[custmisedKey][data.field_name] = JSON.parse(JSON.stringify(object[data.field_name]));
|
|
368
|
+
const value = this.fileHandlerService.modifyFileSetValue(object[data.field_name]);
|
|
369
|
+
let tooltipMsg = this.fileHandlerService.getFileTooltipMsg(object[data.field_name]);
|
|
370
|
+
element.list_of_fields[j]['tooltipMsg'] = tooltipMsg;
|
|
371
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
default:
|
|
375
|
+
if (ChildFieldData && ChildFieldData[childFieldName] != null && ChildFieldData[childFieldName] != undefined && ChildFieldData[childFieldName] != '') {
|
|
376
|
+
const value = ChildFieldData[childFieldName];
|
|
377
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(value);
|
|
378
|
+
//(<FormGroup>this.templateForm.controls[fieldName]).controls[childFieldName].patchValue(value);
|
|
379
|
+
}
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
case "tree_view_selection":
|
|
387
|
+
if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
|
|
388
|
+
responce.treeViewData[fieldName] = [];
|
|
389
|
+
let treeDropdownValue = object == null ? null : object;
|
|
390
|
+
if (treeDropdownValue != "") {
|
|
391
|
+
responce.treeViewData[fieldName].push(JSON.parse(JSON.stringify(treeDropdownValue)));
|
|
392
|
+
}
|
|
393
|
+
responce.templateForm.controls[fieldName].setValue(treeDropdownValue);
|
|
394
|
+
}
|
|
395
|
+
break;
|
|
396
|
+
case "tree_view":
|
|
397
|
+
if (formValue[fieldName] != null && formValue[fieldName] != undefined) {
|
|
398
|
+
let treeValue = object == null ? null : object;
|
|
399
|
+
responce.templateForm.controls[fieldName].setValue(treeValue);
|
|
400
|
+
if (treeValue) {
|
|
401
|
+
let result = this.TreeComponentService.updateTreeViewData(JSON.parse(JSON.stringify(treeValue)), JSON.parse(JSON.stringify(element)), responce.treeViewData);
|
|
402
|
+
responce.treeViewData = result.treeViewData;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
break;
|
|
406
|
+
case "stepper":
|
|
407
|
+
if (list_of_fields && list_of_fields.length > 0) {
|
|
408
|
+
list_of_fields.forEach((step) => {
|
|
409
|
+
if (step.list_of_fields && step.list_of_fields.length > 0) {
|
|
410
|
+
step.list_of_fields.forEach((data) => {
|
|
411
|
+
let childFieldName = data.field_name;
|
|
412
|
+
switch (data.type) {
|
|
413
|
+
case "list_of_string":
|
|
414
|
+
case "grid_selection":
|
|
415
|
+
case 'grid_selection_vertical':
|
|
416
|
+
if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
|
|
417
|
+
responce.custmizedFormValue[childFieldName] = formValue[childFieldName];
|
|
418
|
+
}
|
|
419
|
+
responce.templateForm.controls[step.field_name].controls[childFieldName].setValue('');
|
|
420
|
+
break;
|
|
421
|
+
case "typeahead":
|
|
422
|
+
if (data.datatype == "list_of_object" || data.datatype == 'chips') {
|
|
423
|
+
if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
|
|
424
|
+
responce.custmizedFormValue[childFieldName] = formValue[childFieldName](responce.templateForm.controls[step.field_name]).controls[childFieldName].setValue('');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
|
|
429
|
+
const value = formValue[childFieldName];
|
|
430
|
+
responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(value);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
break;
|
|
434
|
+
case "number":
|
|
435
|
+
let gvalue;
|
|
436
|
+
const value = formValue[childFieldName];
|
|
437
|
+
if (value != null && value != '') {
|
|
438
|
+
gvalue = value;
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
gvalue = 0;
|
|
442
|
+
}
|
|
443
|
+
responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(gvalue);
|
|
444
|
+
break;
|
|
445
|
+
case "list_of_checkbox":
|
|
446
|
+
responce.templateForm.controls[step.field_name].controls[childFieldName].patchValue([]);
|
|
447
|
+
break;
|
|
448
|
+
default:
|
|
449
|
+
if (formValue[childFieldName] != null && formValue[childFieldName] != undefined && formValue[childFieldName] != '') {
|
|
450
|
+
const value = formValue[childFieldName];
|
|
451
|
+
responce.templateForm.controls[step.field_name].controls[childFieldName].setValue(value);
|
|
452
|
+
}
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
if (data.tree_view_object && data.tree_view_object.field_name != "") {
|
|
456
|
+
let editeTreeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
|
|
457
|
+
const treeObject = responce.selectedRow[editeTreeModifyData.field_name];
|
|
458
|
+
responce.templateForm.controls[step.field_name].controls[editeTreeModifyData.field_name].setValue(treeObject);
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
break;
|
|
465
|
+
case "number":
|
|
466
|
+
if (object != null && object != undefined) {
|
|
467
|
+
let value;
|
|
468
|
+
if (object != null && object != '') {
|
|
469
|
+
value = object;
|
|
470
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
471
|
+
}
|
|
472
|
+
else if (object == 0) {
|
|
473
|
+
value = object;
|
|
474
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
break;
|
|
478
|
+
case "gmap":
|
|
479
|
+
case "gmapview":
|
|
480
|
+
if (object != null && object != undefined) {
|
|
481
|
+
if (formValue['longitude']) {
|
|
482
|
+
responce.longitude = formValue['longitude'];
|
|
483
|
+
}
|
|
484
|
+
if (formValue['latitude']) {
|
|
485
|
+
responce.latitude = formValue['latitude'];
|
|
486
|
+
}
|
|
487
|
+
if (formValue['zoom']) {
|
|
488
|
+
responce.zoom = formValue['zoom'];
|
|
489
|
+
}
|
|
490
|
+
if (responce.longitude != 0 && responce.latitude != 0) {
|
|
491
|
+
responce.getAddress = true;
|
|
492
|
+
//this.getAddress(responce.latitude,responce.longitude)
|
|
493
|
+
}
|
|
494
|
+
responce.templateForm.controls[fieldName].setValue(object);
|
|
495
|
+
}
|
|
496
|
+
break;
|
|
497
|
+
case "daterange":
|
|
498
|
+
if (object != null && object != undefined) {
|
|
499
|
+
let list_of_dates = [
|
|
500
|
+
{ field_name: 'start' },
|
|
501
|
+
{ field_name: 'end' }
|
|
502
|
+
];
|
|
503
|
+
if (list_of_dates.length > 0) {
|
|
504
|
+
list_of_dates.forEach((data) => {
|
|
505
|
+
let childFieldName = data.field_name;
|
|
506
|
+
responce.templateForm.controls[fieldName].controls[childFieldName].setValue(object[childFieldName]);
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
break;
|
|
511
|
+
case "date":
|
|
512
|
+
if (object != null && object != undefined) {
|
|
513
|
+
if (date_format && date_format != '' && typeof object === 'string') {
|
|
514
|
+
const date = object[fieldName];
|
|
515
|
+
const dateMonthYear = date.split('/');
|
|
516
|
+
const formatedDate = dateMonthYear[2] + "-" + dateMonthYear[1] + "-" + dateMonthYear[0];
|
|
517
|
+
const value = new Date(formatedDate);
|
|
518
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
const value = formValue[fieldName] == null ? null : formValue[fieldName];
|
|
522
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
break;
|
|
526
|
+
case "tabular_data_selector":
|
|
527
|
+
if (object != undefined && object != null) {
|
|
528
|
+
responce.custmizedFormValue[fieldName] = JSON.parse(JSON.stringify(object));
|
|
529
|
+
}
|
|
530
|
+
if (Array.isArray(responce.staticData[ddn_field]) && Array.isArray(responce.custmizedFormValue[fieldName])) {
|
|
531
|
+
responce.custmizedFormValue[fieldName].forEach((staData) => {
|
|
532
|
+
if (responce.staticData[ddn_field][staData._id]) {
|
|
533
|
+
responce.staticData[ddn_field][staData._id].selected = true;
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
break;
|
|
538
|
+
case "list_of_checkbox":
|
|
539
|
+
responce.templateForm.controls[fieldName].setValue([]);
|
|
540
|
+
break;
|
|
541
|
+
default:
|
|
542
|
+
if (object != null && object != undefined) {
|
|
543
|
+
const value = object == null ? null : object;
|
|
544
|
+
responce.templateForm.controls[fieldName].setValue(value);
|
|
545
|
+
}
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
if (tree_view_object && tree_view_object.field_name != "") {
|
|
549
|
+
let editeTreeModifyData = JSON.parse(JSON.stringify(tree_view_object));
|
|
550
|
+
const object = responce.selectedRow[editeTreeModifyData.field_name];
|
|
551
|
+
if (object) {
|
|
552
|
+
responce.templateForm.controls[editeTreeModifyData.field_name].setValue(object);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
setCheckboxFileListValue(checkBoxFieldListValue, templateForm, staticData, selectedRow, updateMode) {
|
|
557
|
+
let result = {
|
|
558
|
+
templateForm: templateForm
|
|
559
|
+
};
|
|
560
|
+
checkBoxFieldListValue.forEach((element) => {
|
|
561
|
+
let checkCreatControl;
|
|
562
|
+
if (element.parent) {
|
|
563
|
+
checkCreatControl = result.templateForm.controls[element.parent].controls[element.field_name];
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
checkCreatControl = result.templateForm.controls[element.field_name];
|
|
567
|
+
}
|
|
568
|
+
if (staticData[element.ddn_field] && checkCreatControl.controls && checkCreatControl.controls.length == 0) {
|
|
569
|
+
let checkArray;
|
|
570
|
+
if (element.parent) {
|
|
571
|
+
checkArray = result.templateForm.controls[element.parent].controls[element.field_name];
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
checkArray = result.templateForm.controls[element.field_name];
|
|
575
|
+
}
|
|
576
|
+
staticData[element.ddn_field].forEach((data, i) => {
|
|
577
|
+
if (updateMode) {
|
|
578
|
+
let arrayData;
|
|
579
|
+
if (element.parent) {
|
|
580
|
+
arrayData = selectedRow[element.parent][element.field_name];
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
arrayData = selectedRow[element.field_name];
|
|
584
|
+
}
|
|
585
|
+
let selected = false;
|
|
586
|
+
if (arrayData != undefined && arrayData != null) {
|
|
587
|
+
for (let index = 0; index < arrayData.length; index++) {
|
|
588
|
+
if (this.commonFunctionService.checkObjecOrString(data) == this.commonFunctionService.checkObjecOrString(arrayData[index])) {
|
|
589
|
+
selected = true;
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
if (selected) {
|
|
595
|
+
checkArray.push(new UntypedFormControl(true));
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
checkArray.push(new UntypedFormControl(false));
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
checkArray.push(new UntypedFormControl(false));
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
return result.templateForm;
|
|
608
|
+
}
|
|
609
|
+
updateCustomizedValue(custmizedFormValue, index, value) {
|
|
610
|
+
let response = {
|
|
611
|
+
custmizedFormValue: custmizedFormValue
|
|
612
|
+
};
|
|
613
|
+
if (index !== null && index >= 0) {
|
|
614
|
+
response.custmizedFormValue[index] = value;
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
response.custmizedFormValue.push(value);
|
|
618
|
+
}
|
|
619
|
+
return response;
|
|
620
|
+
}
|
|
621
|
+
editListOfString(parentfield, field, index, custmizedFormValue, templateForm) {
|
|
622
|
+
let response = {
|
|
623
|
+
templateForm: templateForm
|
|
624
|
+
};
|
|
625
|
+
let type = field.type;
|
|
626
|
+
let fieldName = field.field_name;
|
|
627
|
+
switch (type) {
|
|
628
|
+
case 'list_of_string':
|
|
629
|
+
const custmizedFormValueClone = Object.assign([], custmizedFormValue);
|
|
630
|
+
if (parentfield) {
|
|
631
|
+
const custmizedKey = parentfield ? this.commonFunctionService.custmizedKey(parentfield) : null;
|
|
632
|
+
const selectedValue = custmizedFormValueClone[custmizedKey][fieldName][index];
|
|
633
|
+
response.templateForm.controls[parentfield.field_name].controls[fieldName].setValue(selectedValue);
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
const selectedValue = custmizedFormValueClone[fieldName][index];
|
|
637
|
+
response.templateForm.controls[fieldName].setValue(selectedValue);
|
|
638
|
+
}
|
|
639
|
+
break;
|
|
640
|
+
default:
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
643
|
+
return response;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
FormControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, deps: [{ token: i1.CommonFunctionService }, { token: i2.FileHandlerService }, { token: i3.GridCommonFunctionService }, { token: i4.TreeComponentService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
647
|
+
FormControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, providedIn: 'root' });
|
|
648
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormControlService, decorators: [{
|
|
649
|
+
type: Injectable,
|
|
650
|
+
args: [{
|
|
651
|
+
providedIn: 'root'
|
|
652
|
+
}]
|
|
653
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.FileHandlerService }, { type: i3.GridCommonFunctionService }, { type: i4.TreeComponentService }]; } });
|
|
654
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2Zvcm0vZm9ybS1jb250cm9sL2Zvcm0tY29udHJvbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFvQixrQkFBa0IsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBU3hGLE1BQU0sT0FBTyxrQkFBa0I7SUFFN0IsWUFDVSxxQkFBMkMsRUFDM0Msa0JBQXNDLEVBQ3RDLHlCQUFtRCxFQUNuRCxvQkFBeUM7UUFIekMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtJQUMvQyxDQUFDO0lBRUwsa0JBQWtCLENBQUMsWUFBNkIsRUFBQyxrQkFBc0IsRUFBQyxXQUFlLEVBQUMsS0FBUyxFQUFDLEtBQVMsRUFBQyx1QkFBMkIsRUFBQyxVQUFjLEVBQUMsaUJBQXFCO1FBQzFLLElBQUksUUFBUSxHQUFHO1lBQ2IsdUJBQXVCLEVBQUMsSUFBSTtZQUM1Qix5QkFBeUIsRUFBQyx1QkFBdUI7WUFDakQsb0JBQW9CLEVBQUMsa0JBQWtCO1lBQ3ZDLG1CQUFtQixFQUFDLGlCQUFpQjtZQUNyQyxjQUFjLEVBQUMsWUFBWTtTQUM1QixDQUFBO1FBQ0QsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsUUFBUSxDQUFDLHVCQUF1QixHQUFH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QUFDLENBQUMsSUFBSSxDQUFDO29CQUM5RixNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUQsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQ3hIO3FCQUFNO29CQUNMLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQ2xFO2dCQUVILE1BQU07WUFDTjtnQkFDRSxNQUFNO1NBQ1Q7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztnSEF6bUJVLGtCQUFrQjtvSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWxlSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9maWxlSGFuZGxlci9maWxlLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9ncmlkL2dyaWQtY29tbW9uLWZ1bmN0aW9uL2dyaWQtY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmVlQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3RyZWUtY29tcG9uZW50L3RyZWUtY29tcG9uZW50LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUNvbnRyb2xTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbW1vbkZ1bmN0aW9uU2VydmljZTpDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpbGVIYW5kbGVyU2VydmljZTogRmlsZUhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBncmlkQ29tbW9uRnVuY3Rpb25TZXJ2aWNlOkdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIFRyZWVDb21wb25lbnRTZXJ2aWNlOlRyZWVDb21wb25lbnRTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgZWRpdGVMaXN0RmllbGREYXRhKHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLGN1c3RtaXplZEZvcm1WYWx1ZTphbnksdGFibGVGaWVsZHM6YW55LGZpZWxkOmFueSxpbmRleDphbnksbGlzdE9mRmllbGRzVXBkYXRlSW5kZXg6YW55LHN0YXRpY0RhdGE6YW55LGRhdGFMaXN0Rm9yVXBsb2FkOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIFwibGlzdE9mRmllbGRVcGRhdGVNb2RlXCI6dHJ1ZSxcclxuICAgICAgXCJsaXN0T2ZGaWVsZHNVcGRhdGVJbmRleFwiOmxpc3RPZkZpZWxkc1VwZGF0ZUluZGV4LFxyXG4gICAgICBcImN1c3RtaXplZEZvcm1WYWx1ZVwiOmN1c3RtaXplZEZvcm1WYWx1ZSxcclxuICAgICAgXCJkYXRhTGlzdEZvclVwbG9hZFwiOmRhdGFMaXN0Rm9yVXBsb2FkLFxyXG4gICAgICBcInRlbXBsYXRlRm9ybVwiOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgbGV0IHBhcmVudExpc3QgPSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICBsZXQgb2JqZWN0ID0gcGFyZW50TGlzdFtpbmRleF07XHJcbiAgICByZXNwb25jZS5saXN0T2ZGaWVsZHNVcGRhdGVJbmRleCA9IGluZGV4O1xyXG4gICAgaWYodGFibGVGaWVsZHMgJiYgdGFibGVGaWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgXCJsaXN0X29mX2ZpZWxkc1wiOlxyXG4gICAgICAgICAgICBpZihlbGVtZW50LmZpZWxkX25hbWUgPT0gZmllbGQuZmllbGRfbmFtZSAmJiB0ZW1wbGF0ZUZvcm0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0ucmVzZXQoKTtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0bWlzZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldKSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbY3VzdG1pc2VkS2V5XSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2N1c3RtaXNlZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGF0YXR5cGUgPT0gJ2xpc3Rfb2Zfb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0bWlzZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2N1c3RtaXNlZEtleV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjdXN0bWlzZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSBvYmplY3RbZGF0YS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94TGlzdFZhbHVlOmFueSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdGljRGF0YSAmJiBzdGF0aWNEYXRhW2RhdGEuZGRuX2ZpZWxkXSAmJiBzdGF0aWNEYXRhW2RhdGEuZGRuX2ZpZWxkXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljRGF0YVtkYXRhLmRkbl9maWVsZF0uZm9yRWFjaCgodmFsdWU6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5RGF0YSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheURhdGEgIT0gdW5kZWZpbmVkICYmIGFycmF5RGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlEYXRhLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuY2hlY2tPYmplY09yU3RyaW5nKHZhbHVlKSA9PSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jaGVja09iamVjT3JTdHJpbmcoYXJyYXlEYXRhW2luZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveExpc3RWYWx1ZS5wdXNoKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveExpc3RWYWx1ZS5wdXNoKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnRlbXBsYXRlRm9ybS5nZXQoZWxlbWVudC5maWVsZF9uYW1lKS5nZXQoZGF0YS5maWVsZF9uYW1lKS5zZXRWYWx1ZShjaGVja2JveExpc3RWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2RhdGEuZmllbGRfbmFtZV0uc2V0VmFsdWUoY2hlY2tib3hMaXN0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5wdXRfd2l0aF91cGxvYWRmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXN0bWl6ZWRLZXkgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XSkgcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXplZEtleV1bZGF0YS5maWVsZF9uYW1lXSkgcmVzcG9uY2UuZGF0YUxpc3RGb3JVcGxvYWRbY3VzdG1pemVkS2V5XVtkYXRhLmZpZWxkX25hbWVdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtjdXN0bWl6ZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlVcGxvYWRGaWxlcyhKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXplZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlGaWxlU2V0VmFsdWUob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChlbGVtZW50LmZpZWxkX25hbWUpLmdldChkYXRhLmZpZWxkX25hbWUpLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChlbGVtZW50LmZpZWxkX25hbWUpLmdldChkYXRhLmZpZWxkX25hbWUpLnNldFZhbHVlKG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuICB1cGRhdGVEYXRhT25Gb3JtKHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLHRhYmxlRmllbGRzOmFueSxmb3JtVmFsdWU6YW55LGZvcm1GaWVsZEJ1dHRvbnM6YW55LGN1c3RtaXplZEZvcm1WYWx1ZTphbnksbW9kaWZ5Q3VzdG1pemVkRm9ybVZhbHVlOmFueSxzZWxlY3RlZFJvdzphbnksZGF0YUxpc3RGb3JVcGxvYWQ6YW55LHRyZWVWaWV3RGF0YTphbnksc3RhdGljRGF0YTphbnksbG9uZ2l0dWRlOmFueSxsYXRpdHVkZTphbnksem9vbTphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlID17XHJcbiAgICAgIHRlbXBsYXRlRm9ybTp0ZW1wbGF0ZUZvcm0sXHJcbiAgICAgIGN1c3RtaXplZEZvcm1WYWx1ZTpjdXN0bWl6ZWRGb3JtVmFsdWUsXHJcbiAgICAgIG1vZGlmeUN1c3RtaXplZEZvcm1WYWx1ZTptb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUsXHJcbiAgICAgIHRhYmxlRmllbGRzOnRhYmxlRmllbGRzLFxyXG4gICAgICBkYXRhTGlzdEZvclVwbG9hZDpkYXRhTGlzdEZvclVwbG9hZCxcclxuICAgICAgc2VsZWN0ZWRSb3c6c2VsZWN0ZWRSb3csXHJcbiAgICAgIHRyZWVWaWV3RGF0YTp0cmVlVmlld0RhdGEsXHJcbiAgICAgIHN0YXRpY0RhdGE6c3RhdGljRGF0YSxcclxuICAgICAgbG9uZ2l0dWRlOmxvbmdpdHVkZSxcclxuICAgICAgbGF0aXR1ZGU6bGF0aXR1ZGUsXHJcbiAgICAgIHpvb206em9vbSxcclxuICAgICAgZ2V0QWRkcmVzczpmYWxzZVxyXG5cclxuICAgIH1cclxuICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5maWVsZF9uYW1lICYmIGVsZW1lbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgbGV0IGZpZWxkTmFtZSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICBsZXQgb2JqZWN0ID0gZm9ybVZhbHVlW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZShlbGVtZW50LGZvcm1WYWx1ZSxyZXNwb25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmKGZvcm1GaWVsZEJ1dHRvbnMubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvcm1GaWVsZEJ1dHRvbnMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGxldCBvYmplY3QgPSBzZWxlY3RlZFJvd1tmaWVsZE5hbWVdO1xyXG4gICAgICAgIGlmKGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgXCJkcm9wZG93blwiOlxyXG4gICAgICAgICAgICAgICAgbGV0IGRyb3Bkb3duVmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXS5zZXRWYWx1ZShkcm9wZG93blZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIHVwZGF0ZUZvcm1WYWx1ZShlbGVtZW50OmFueSxmb3JtVmFsdWU6YW55LHJlc3BvbmNlOmFueSl7XHJcbiAgICBsZXQgdHlwZSA9IGVsZW1lbnQudHlwZTtcclxuICAgIGxldCBkYXRhdHlwZSA9IGVsZW1lbnQuZGF0YXR5cGU7XHJcbiAgICBsZXQgdHJlZV92aWV3X29iamVjdCA9IGVsZW1lbnQudHJlZV92aWV3X29iamVjdDtcclxuICAgIGxldCBkYXRlX2Zvcm1hdCA9IGVsZW1lbnQuZGF0ZV9mb3JtYXQ7XHJcbiAgICBsZXQgZmllbGROYW1lID0gZWxlbWVudC5maWVsZF9uYW1lO1xyXG4gICAgbGV0IGRkbl9maWVsZCA9IGVsZW1lbnQuZGRuX2ZpZWxkO1xyXG4gICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50O1xyXG4gICAgbGV0IGxpc3Rfb2ZfZmllbGRzID0gZWxlbWVudC5saXN0X29mX2ZpZWxkcztcclxuICAgIGxldCBvYmplY3QgPSBmb3JtVmFsdWVbZmllbGROYW1lXTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgY2FzZSBcImRyYWdfZHJvcFwiOlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3QpKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdCkpO1xyXG4gICAgICAgICAgICBpZih0eXBlLnN0YXJ0c1dpdGgoXCJncmlkX3NlbGVjdGlvblwiKSl7XHJcbiAgICAgICAgICAgICAgY29uc3QgbW9kaWZ5RGF0YSA9IHRoaXMuZ3JpZENvbW1vbkZ1bmN0aW9uU2VydmljZS5ncmlkRGF0YU1vZGlmeShyZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUscmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlLHJlc3BvbmNlLnRhYmxlRmllbGRzLGZpZWxkTmFtZSxcImdyaWRfc2VsZWN0aW9uXCIsZm9ybVZhbHVlKTtcclxuICAgICAgICAgICAgICByZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWUgPSBtb2RpZnlEYXRhLm1vZGlmeURhdGE7XHJcbiAgICAgICAgICAgICAgaWYobW9kaWZ5RGF0YS5maWVsZF9pbmRleCAhPSAtMSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG1vZGlmeURhdGEuZmllbGRfaW5kZXg7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS50YWJsZUZpZWxkc1tpbmRleF0gPSBtb2RpZnlEYXRhLmZpZWxkc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSgnJylcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgIGNhc2UgXCJpbnB1dF93aXRoX3VwbG9hZGZpbGVcIjpcclxuICAgICAgY2FzZSBcImZpbGVfZm9yX3MzXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtmaWVsZE5hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UubW9kaWZ5RmlsZVNldFZhbHVlKG9iamVjdCk7XHJcbiAgICAgICAgICBpZih0eXBlID09ICdpbnB1dF93aXRoX3VwbG9hZGZpbGUnKXtcclxuICAgICAgICAgICAgbGV0IHRvb2x0aXBNc2cgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5nZXRGaWxlVG9vbHRpcE1zZyhvYmplY3QpO1xyXG4gICAgICAgICAgICBlbGVtZW50Wyd0b29sdGlwTXNnJ10gPSB0b29sdGlwTXNnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImxpc3Rfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBpZihBcnJheS5pc0FycmF5KG9iamVjdCkpe1xyXG4gICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSk7XHJcbiAgICAgICAgICAgIGxldCBtb2RpZnlPYmplY3QgPSB0aGlzLmdyaWRDb21tb25GdW5jdGlvblNlcnZpY2UubW9kaWZ5TGlzdG9mRmllbGRzRGF0YShlbGVtZW50LHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdLGVsZW1lbnQubGlzdF9vZl9maWVsZHMpO1xyXG4gICAgICAgICAgICByZXNwb25jZS5tb2RpZnlDdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IG1vZGlmeU9iamVjdFsnZGF0YSddO1xyXG4gICAgICAgICAgfWVsc2UgaWYodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIGRhdGF0eXBlID09ICdrZXlfdmFsdWUnKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSBvYmplY3Q7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYobGlzdF9vZl9maWVsZHMgJiYgbGlzdF9vZl9maWVsZHMgIT0gbnVsbCAmJiBsaXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBsaXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSxqOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICdncmlkX3NlbGVjdGlvbl92ZXJ0aWNhbCc6XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkcmFnX2Ryb3BcIjpcclxuICAgICAgICAgICAgICAgICAgICBpZihvYmplY3QgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdKSByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdFwiIHx8IGRhdGF0eXBlID09ICdjaGlwcycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYob2JqZWN0ICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IG51bGwgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShvYmplY3RbZGF0YS5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2RhdGEuZmllbGRfbmFtZV0uc2V0VmFsdWUoJycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF9uYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5wYXRjaFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W2RhdGEuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0X3dpdGhfdXBsb2FkZmlsZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0W2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RtaXNlZEtleSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmN1c3RtaXplZEtleShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmRhdGFMaXN0Rm9yVXBsb2FkW2N1c3RtaXNlZEtleV1bZGF0YS5maWVsZF9uYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UubW9kaWZ5RmlsZVNldFZhbHVlKG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sdGlwTXNnID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UuZ2V0RmlsZVRvb2x0aXBNc2cob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkc1tqXVsndG9vbHRpcE1zZyddID0gdG9vbHRpcE1zZztcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbZGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9iamVjdCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8oPEZvcm1Hcm91cD50aGlzLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1tkYXRhLmZpZWxkX25hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgIGlmKGRhdGF0eXBlID09IFwibGlzdF9vZl9vYmplY3RcIiB8fCBkYXRhdHlwZSA9PSAnY2hpcHMnKXtcclxuICAgICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSk7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0O1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICBpZihsaXN0X29mX2ZpZWxkcyAmJiBsaXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGRhdGE6YW55LGo6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBDaGlsZEZpZWxkRGF0YSA9IG9iamVjdDtcclxuICAgICAgICAgICAgbGV0IGNoaWxkRmllbGROYW1lID0gZGF0YS5maWVsZF9uYW1lO1xyXG4gICAgICAgICAgICBpZihkYXRhICYmIGNoaWxkRmllbGROYW1lICYmIGNoaWxkRmllbGROYW1lICE9ICcnICYmIENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImRyYWdfZHJvcFwiOlxyXG4gICAgICAgICAgICAgICAgICBpZihDaGlsZEZpZWxkRGF0YSAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXSkgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnRlbXBsYXRlRm9ybS5nZXQoZmllbGROYW1lKS5nZXQoY2hpbGRGaWVsZE5hbWUpLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICBpZihkYXRhLmRhdGF0eXBlID09IFwibGlzdF9vZl9vYmplY3RcIiB8fCBkYXRhLmRhdGF0eXBlID09ICdjaGlwcycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSBudWxsICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5jdXN0bWl6ZWRGb3JtVmFsdWVbZmllbGROYW1lXVtjaGlsZEZpZWxkTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBndmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBndmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKGd2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAvLyg8Rm9ybUdyb3VwPnRoaXMudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5wYXRjaFZhbHVlKGd2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhLmhhc093blByb3BlcnR5KGNoaWxkRmllbGROYW1lKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUoZ3ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2ZfY2hlY2tib3hcIjpcclxuICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0ucGF0Y2hWYWx1ZShbXSlcclxuICAgICAgICAgICAgICAgICAgaWYocGFyZW50KXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5zZWxlY3RlZFJvd1twYXJlbnRdID0ge31cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5zZWxlY3RlZFJvd1twYXJlbnRdW2ZpZWxkTmFtZV0gPSBDaGlsZEZpZWxkRGF0YTtcclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2Uuc2VsZWN0ZWRSb3dbZmllbGROYW1lXSA9IENoaWxkRmllbGREYXRhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoW10pO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICAgIGlmKENoaWxkRmllbGREYXRhICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSBudWxsICYmIENoaWxkRmllbGREYXRhW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmRhdGVfZm9ybWF0ICYmIGRhdGEuZGF0ZV9mb3JtYXQgIT1cIlwiICYmIHR5cGVvZiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gPT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlTW9udGhZZWFyID0gZGF0ZS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ZWREYXRlID0gZGF0ZU1vbnRoWWVhclsyXStcIi1cIitkYXRlTW9udGhZZWFyWzFdK1wiLVwiK2RhdGVNb250aFllYXJbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBEYXRlKGZvcm1hdGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdID09IG51bGwgPyBudWxsIDogZm9ybVZhbHVlW2ZpZWxkTmFtZV1bY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dF93aXRoX3VwbG9hZGZpbGVcIjpcclxuICAgICAgICAgICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCAmJiBvYmplY3RbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsICYmIG9iamVjdFtkYXRhLmZpZWxkX25hbWVdICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RtaXNlZEtleSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmN1c3RtaXplZEtleShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kYXRhTGlzdEZvclVwbG9hZFtjdXN0bWlzZWRLZXldW2RhdGEuZmllbGRfbmFtZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdFtkYXRhLmZpZWxkX25hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbGVIYW5kbGVyU2VydmljZS5tb2RpZnlGaWxlU2V0VmFsdWUob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b29sdGlwTXNnID0gdGhpcy5maWxlSGFuZGxlclNlcnZpY2UuZ2V0RmlsZVRvb2x0aXBNc2cob2JqZWN0W2RhdGEuZmllbGRfbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal1bJ3Rvb2x0aXBNc2cnXSA9IHRvb2x0aXBNc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgaWYoQ2hpbGRGaWVsZERhdGEgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBDaGlsZEZpZWxkRGF0YVtjaGlsZEZpZWxkTmFtZV0gIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ2hpbGRGaWVsZERhdGFbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vKDxGb3JtR3JvdXA+dGhpcy50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidHJlZV92aWV3X3NlbGVjdGlvblwiOlxyXG4gICAgICAgIGlmKGZvcm1WYWx1ZVtmaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIHJlc3BvbmNlLnRyZWVWaWV3RGF0YVtmaWVsZE5hbWVdID0gW107XHJcbiAgICAgICAgICBsZXQgdHJlZURyb3Bkb3duVmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICBpZih0cmVlRHJvcGRvd25WYWx1ZSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UudHJlZVZpZXdEYXRhW2ZpZWxkTmFtZV0ucHVzaChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRyZWVEcm9wZG93blZhbHVlKSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodHJlZURyb3Bkb3duVmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidHJlZV92aWV3XCI6XHJcbiAgICAgICAgaWYoZm9ybVZhbHVlW2ZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbZmllbGROYW1lXSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgbGV0IHRyZWVWYWx1ZSA9IG9iamVjdCA9PSBudWxsID8gbnVsbCA6IG9iamVjdDtcclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHRyZWVWYWx1ZSk7XHJcbiAgICAgICAgICBpZih0cmVlVmFsdWUpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5UcmVlQ29tcG9uZW50U2VydmljZS51cGRhdGVUcmVlVmlld0RhdGEoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmVlVmFsdWUpKSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSxyZXNwb25jZS50cmVlVmlld0RhdGEpO1xyXG4gICAgICAgICAgICByZXNwb25jZS50cmVlVmlld0RhdGEgPXJlc3VsdC50cmVlVmlld0RhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgIGlmKGxpc3Rfb2ZfZmllbGRzICYmIGxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgbGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoc3RlcDphbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoc3RlcC5saXN0X29mX2ZpZWxkcyAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHN0ZXAubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZEZpZWxkTmFtZSA9IGRhdGEuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZ3JpZF9zZWxlY3Rpb25cIjpcclxuICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JpZF9zZWxlY3Rpb25fdmVydGljYWwnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gXCJsaXN0X29mX29iamVjdFwiIHx8IGRhdGEuZGF0YXR5cGUgPT0gJ2NoaXBzJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IG51bGwgJiYgZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXSAhPSB1bmRlZmluZWQgJiYgZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW3N0ZXAuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3ZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGd2YWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFVudHlwZWRGb3JtR3JvdXA+cmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW3N0ZXAuZmllbGRfbmFtZV0pLmNvbnRyb2xzW2NoaWxkRmllbGROYW1lXS5zZXRWYWx1ZShndmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnBhdGNoVmFsdWUoW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtjaGlsZEZpZWxkTmFtZV0gIT0gbnVsbCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3JtVmFsdWVbY2hpbGRGaWVsZE5hbWVdICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVZhbHVlW2NoaWxkRmllbGROYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbY2hpbGRGaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZihkYXRhLnRyZWVfdmlld19vYmplY3QgJiYgZGF0YS50cmVlX3ZpZXdfb2JqZWN0LmZpZWxkX25hbWUgIT0gXCJcIil7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBlZGl0ZVRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU9iamVjdCA9IHJlc3BvbmNlLnNlbGVjdGVkUm93W2VkaXRlVHJlZU1vZGlmeURhdGEuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD5yZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbc3RlcC5maWVsZF9uYW1lXSkuY29udHJvbHNbZWRpdGVUcmVlTW9kaWZ5RGF0YS5maWVsZF9uYW1lXS5zZXRWYWx1ZSh0cmVlT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgbGV0IHZhbHVlO1xyXG4gICAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9ICcnKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Q7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgfWVsc2UgaWYob2JqZWN0ID09IDApe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdDtcclxuICAgICAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImdtYXBcIjpcclxuICAgICAgY2FzZSBcImdtYXB2aWV3XCI6XHJcbiAgICAgICAgaWYob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0ICE9IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICBpZihmb3JtVmFsdWVbJ2xvbmdpdHVkZSddKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UubG9uZ2l0dWRlID0gZm9ybVZhbHVlWydsb25naXR1ZGUnXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGZvcm1WYWx1ZVsnbGF0aXR1ZGUnXSl7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLmxhdGl0dWRlID0gZm9ybVZhbHVlWydsYXRpdHVkZSddO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoZm9ybVZhbHVlWyd6b29tJ10pe1xyXG4gICAgICAgICAgICByZXNwb25jZS56b29tID0gZm9ybVZhbHVlWyd6b29tJ107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihyZXNwb25jZS5sb25naXR1ZGUgIT0gMCAmJiByZXNwb25jZS5sYXRpdHVkZSAhPSAwKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuZ2V0QWRkcmVzcyA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vdGhpcy5nZXRBZGRyZXNzKHJlc3BvbmNlLmxhdGl0dWRlLHJlc3BvbmNlLmxvbmdpdHVkZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKG9iamVjdClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkYXRlcmFuZ2VcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGxldCBsaXN0X29mX2RhdGVzID0gW1xyXG4gICAgICAgICAgICB7ZmllbGRfbmFtZSA6ICdzdGFydCd9LFxyXG4gICAgICAgICAgICB7ZmllbGRfbmFtZSA6ICdlbmQnfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgaWYgKGxpc3Rfb2ZfZGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsaXN0X29mX2RhdGVzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgY2hpbGRGaWVsZE5hbWUgPSBkYXRhLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1tjaGlsZEZpZWxkTmFtZV0uc2V0VmFsdWUob2JqZWN0W2NoaWxkRmllbGROYW1lXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgIGlmKGRhdGVfZm9ybWF0ICYmIGRhdGVfZm9ybWF0ICE9ICcnICYmIHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKXtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG9iamVjdFtmaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlTW9udGhZZWFyID0gZGF0ZS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRlZERhdGUgPSBkYXRlTW9udGhZZWFyWzJdK1wiLVwiK2RhdGVNb250aFllYXJbMV0rXCItXCIrZGF0ZU1vbnRoWWVhclswXTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXRlZERhdGUpO1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1WYWx1ZVtmaWVsZE5hbWVdID09IG51bGwgPyBudWxsIDogZm9ybVZhbHVlW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJ0YWJ1bGFyX2RhdGFfc2VsZWN0b3JcIjpcclxuICAgICAgICBpZihvYmplY3QgIT0gdW5kZWZpbmVkICYmIG9iamVjdCAhPSBudWxsKXtcclxuICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmplY3QpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25jZS5zdGF0aWNEYXRhW2Rkbl9maWVsZF0pICYmIEFycmF5LmlzQXJyYXkocmVzcG9uY2UuY3VzdG1pemVkRm9ybVZhbHVlW2ZpZWxkTmFtZV0pKXtcclxuICAgICAgICAgIHJlc3BvbmNlLmN1c3RtaXplZEZvcm1WYWx1ZVtmaWVsZE5hbWVdLmZvckVhY2goKHN0YURhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlc3BvbmNlLnN0YXRpY0RhdGFbZGRuX2ZpZWxkXVtzdGFEYXRhLl9pZF0pe1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLnN0YXRpY0RhdGFbZGRuX2ZpZWxkXVtzdGFEYXRhLl9pZF0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJsaXN0X29mX2NoZWNrYm94XCI6XHJcbiAgICAgICAgcmVzcG9uY2UudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkTmFtZV0uc2V0VmFsdWUoW10pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3Q7XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRyZWVfdmlld19vYmplY3QgJiYgdHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICBsZXQgZWRpdGVUcmVlTW9kaWZ5RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJlZV92aWV3X29iamVjdCkpO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSByZXNwb25jZS5zZWxlY3RlZFJvd1tlZGl0ZVRyZWVNb2RpZnlEYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICBpZihvYmplY3Qpe1xyXG4gICAgICAgIHJlc3BvbmNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1tlZGl0ZVRyZWVNb2RpZnlEYXRhLmZpZWxkX25hbWVdLnNldFZhbHVlKG9iamVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBzZXRDaGVja2JveEZpbGVMaXN0VmFsdWUoY2hlY2tCb3hGaWVsZExpc3RWYWx1ZTphbnksdGVtcGxhdGVGb3JtOlVudHlwZWRGb3JtR3JvdXAsc3RhdGljRGF0YTphbnksc2VsZWN0ZWRSb3c6YW55LHVwZGF0ZU1vZGU6Ym9vbGVhbikge1xyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgdGVtcGxhdGVGb3JtOnRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgY2hlY2tCb3hGaWVsZExpc3RWYWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBsZXQgY2hlY2tDcmVhdENvbnRyb2w6IGFueTtcclxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50KSB7XHJcbiAgICAgICAgY2hlY2tDcmVhdENvbnRyb2wgPSAoPFVudHlwZWRGb3JtR3JvdXA+cmVzdWx0LnRlbXBsYXRlRm9ybS5jb250cm9sc1tlbGVtZW50LnBhcmVudF0pLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2hlY2tDcmVhdENvbnRyb2wgPSByZXN1bHQudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXRpY0RhdGFbZWxlbWVudC5kZG5fZmllbGRdICYmIGNoZWNrQ3JlYXRDb250cm9sLmNvbnRyb2xzICYmIGNoZWNrQ3JlYXRDb250cm9sLmNvbnRyb2xzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgbGV0IGNoZWNrQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50KSB7XHJcbiAgICAgICAgICBjaGVja0FycmF5ID0gKDxVbnR5cGVkRm9ybUdyb3VwPnJlc3VsdC50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5wYXJlbnRdKS5jb250cm9sc1tlbGVtZW50LmZpZWxkX25hbWVdIGFzIFVudHlwZWRGb3JtQXJyYXk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoZWNrQXJyYXkgPSByZXN1bHQudGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRfbmFtZV0gYXMgVW50eXBlZEZvcm1BcnJheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhdGljRGF0YVtlbGVtZW50LmRkbl9maWVsZF0uZm9yRWFjaCgoZGF0YTphbnksIGk6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodXBkYXRlTW9kZSkge1xyXG4gICAgICAgICAgICBsZXQgYXJyYXlEYXRhO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICBhcnJheURhdGEgPSBzZWxlY3RlZFJvd1tlbGVtZW50LnBhcmVudF1bZWxlbWVudC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBhcnJheURhdGEgPSBzZWxlY3RlZFJvd1tlbGVtZW50LmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlEYXRhICE9IHVuZGVmaW5lZCAmJiBhcnJheURhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheURhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuY2hlY2tPYmplY09yU3RyaW5nKGRhdGEpID09IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmNoZWNrT2JqZWNPclN0cmluZyhhcnJheURhdGFbaW5kZXhdKSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICBjaGVja0FycmF5LnB1c2gobmV3IFVudHlwZWRGb3JtQ29udHJvbCh0cnVlKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2hlY2tBcnJheS5wdXNoKG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2hlY2tBcnJheS5wdXNoKG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZmFsc2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0LnRlbXBsYXRlRm9ybTtcclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVDdXN0b21pemVkVmFsdWUoY3VzdG1pemVkRm9ybVZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgY3VzdG1pemVkRm9ybVZhbHVlOiBjdXN0bWl6ZWRGb3JtVmFsdWVcclxuICAgIH1cclxuICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA+PSAwKSB7XHJcbiAgICAgIHJlc3BvbnNlLmN1c3RtaXplZEZvcm1WYWx1ZVtpbmRleF0gPSB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3BvbnNlLmN1c3RtaXplZEZvcm1WYWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZVxyXG4gIH1cclxuXHJcbiAgZWRpdExpc3RPZlN0cmluZyhwYXJlbnRmaWVsZDogYW55LGZpZWxkOiBhbnksaW5kZXg6IG51bWJlcixjdXN0bWl6ZWRGb3JtVmFsdWU6IGFueSwgdGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwICkge1xyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICB0ZW1wbGF0ZUZvcm06IHRlbXBsYXRlRm9ybVxyXG4gICAgfVxyXG4gICAgbGV0IHR5cGUgPSBmaWVsZC50eXBlO1xyXG4gICAgbGV0IGZpZWxkTmFtZSA9IGZpZWxkLmZpZWxkX25hbWVcclxuICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgY2FzZSAnbGlzdF9vZl9zdHJpbmcnOlxyXG4gICAgICAgIGNvbnN0IGN1c3RtaXplZEZvcm1WYWx1ZUNsb25lID0gT2JqZWN0LmFzc2lnbihbXSxjdXN0bWl6ZWRGb3JtVmFsdWUpO1xyXG4gICAgICAgIGlmIChwYXJlbnRmaWVsZCkge1xyXG4gICAgICAgICAgY29uc3QgY3VzdG1pemVkS2V5ID0gcGFyZW50ZmllbGQgPyB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5jdXN0bWl6ZWRLZXkocGFyZW50ZmllbGQpOiBudWxsO1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IGN1c3RtaXplZEZvcm1WYWx1ZUNsb25lW2N1c3RtaXplZEtleV1bZmllbGROYW1lXVtpbmRleF07XHJcbiAgICAgICAgICAoIDxVbnR5cGVkRm9ybUdyb3VwPnJlc3BvbnNlLnRlbXBsYXRlRm9ybS5jb250cm9sc1twYXJlbnRmaWVsZC5maWVsZF9uYW1lXSkuY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gY3VzdG1pemVkRm9ybVZhbHVlQ2xvbmVbZmllbGROYW1lXVtpbmRleF07XHJcbiAgICAgICAgICByZXNwb25zZS50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXS5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG59XHJcbiJdfQ==
|