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,880 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { UntypedFormControl, Validators } 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 "../../env/env.service";
|
|
6
|
+
import * as i3 from "../../storage/storage.service";
|
|
7
|
+
import * as i4 from "@angular/forms";
|
|
8
|
+
import * as i5 from "../../customvalidation/customvalidation.service";
|
|
9
|
+
import * as i6 from "./../../api/api-call/api-call.service";
|
|
10
|
+
import * as i7 from "../../check-if/check-if.service";
|
|
11
|
+
import * as i8 from "../../model/model.service";
|
|
12
|
+
export class FormCreationService {
|
|
13
|
+
constructor(commonFunctionService, envService, storageService, formBuilder, customvalidationService, apiCallService, checkifService, modalService) {
|
|
14
|
+
this.commonFunctionService = commonFunctionService;
|
|
15
|
+
this.envService = envService;
|
|
16
|
+
this.storageService = storageService;
|
|
17
|
+
this.formBuilder = formBuilder;
|
|
18
|
+
this.customvalidationService = customvalidationService;
|
|
19
|
+
this.apiCallService = apiCallService;
|
|
20
|
+
this.checkifService = checkifService;
|
|
21
|
+
this.modalService = modalService;
|
|
22
|
+
const currentYear = new Date().getFullYear();
|
|
23
|
+
this.minDate = new Date(currentYear - 100, 0, 1);
|
|
24
|
+
this.maxDate = new Date(currentYear + 25, 11, 31);
|
|
25
|
+
}
|
|
26
|
+
getTempData(tempData, tabIndex, currentMenu, formName, dinamic_form) {
|
|
27
|
+
let responce = {
|
|
28
|
+
tab: {},
|
|
29
|
+
currentMenu: currentMenu,
|
|
30
|
+
grid_view_mode: "",
|
|
31
|
+
form: {},
|
|
32
|
+
forms: {}
|
|
33
|
+
};
|
|
34
|
+
if (tempData[0].templateTabs) {
|
|
35
|
+
responce.tab = tempData[0].templateTabs[tabIndex];
|
|
36
|
+
}
|
|
37
|
+
let tab = responce.tab;
|
|
38
|
+
if (tab && tab.tab_name != "" && tab.tab_name != null && tab.tab_name != undefined) {
|
|
39
|
+
if (currentMenu && currentMenu.name && currentMenu.name != undefined && currentMenu.name != null) {
|
|
40
|
+
const menu = { "name": tab.tab_name };
|
|
41
|
+
this.storageService.SetActiveMenu(menu);
|
|
42
|
+
responce.currentMenu.name = tab.tab_name;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (tab && tab.grid != null && tab.grid != undefined) {
|
|
46
|
+
if (tab.grid.grid_view != null && tab.grid.grid_view != undefined && tab.grid.grid_view != '') {
|
|
47
|
+
responce.grid_view_mode = tab.grid.grid_view;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
responce.grid_view_mode = 'tableView';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (tab && formName != '') {
|
|
54
|
+
if (formName == 'DINAMIC_FORM') {
|
|
55
|
+
responce.form = dinamic_form;
|
|
56
|
+
}
|
|
57
|
+
else if (tab.forms != null && tab.forms != undefined) {
|
|
58
|
+
responce.forms = tab.forms;
|
|
59
|
+
let gridActionButtons = [];
|
|
60
|
+
if (tab.grid && tab.grid.action_buttons) {
|
|
61
|
+
gridActionButtons = tab.grid.action_buttons;
|
|
62
|
+
}
|
|
63
|
+
responce.form = this.commonFunctionService.getForm(responce.forms, formName, gridActionButtons);
|
|
64
|
+
if (formName == 'clone_object') {
|
|
65
|
+
responce.form['api_params'] = "QTMP:CLONE_OBJECT";
|
|
66
|
+
}
|
|
67
|
+
//this.setForm();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
responce.form = {};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return responce;
|
|
74
|
+
}
|
|
75
|
+
checkFormDetails(form, tab, currentMenu) {
|
|
76
|
+
let responce = {
|
|
77
|
+
currentMenu: currentMenu,
|
|
78
|
+
bulkupdates: false,
|
|
79
|
+
getLocation: false,
|
|
80
|
+
headerFiledsData: [],
|
|
81
|
+
tableFields: [],
|
|
82
|
+
formFieldButtons: [],
|
|
83
|
+
getTableField: true
|
|
84
|
+
};
|
|
85
|
+
if (form) {
|
|
86
|
+
if (form.details) {
|
|
87
|
+
if (form.details.collection_name && form.details.collection_name != '' && (responce.currentMenu != undefined || this.envService.getRequestType() == 'PUBLIC')) {
|
|
88
|
+
if (responce.currentMenu == undefined) {
|
|
89
|
+
responce.currentMenu = {};
|
|
90
|
+
}
|
|
91
|
+
responce.currentMenu['name'] = form.details.collection_name;
|
|
92
|
+
if (tab && tab.tab_name && tab.tab_name != '') {
|
|
93
|
+
responce.currentMenu['tab_name'] = tab.tab_name;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (form.details.bulk_update) {
|
|
97
|
+
responce.bulkupdates = true;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
responce.bulkupdates = false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (form.getLocation) {
|
|
104
|
+
responce.getLocation = form.getLocation;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
responce.getLocation = false;
|
|
108
|
+
}
|
|
109
|
+
if (form.headerFields) {
|
|
110
|
+
responce.headerFiledsData = form.headerFields;
|
|
111
|
+
}
|
|
112
|
+
if (form['tableFields'] && form['tableFields'] != undefined && form['tableFields'] != null) {
|
|
113
|
+
responce.tableFields = JSON.parse(JSON.stringify(form['tableFields']));
|
|
114
|
+
responce.getTableField = false;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
responce.tableFields = [];
|
|
118
|
+
}
|
|
119
|
+
if (form.tab_list_buttons && form.tab_list_buttons != undefined && form.tab_list_buttons.length > 0) {
|
|
120
|
+
responce.formFieldButtons = form.tab_list_buttons;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return responce;
|
|
124
|
+
}
|
|
125
|
+
createFormControl(forControl, field, object, type) {
|
|
126
|
+
let disabled = field.is_disabled ? true : ((field.disable_if != undefined && field.disable_if != '') ? true : false);
|
|
127
|
+
switch (type) {
|
|
128
|
+
case "list":
|
|
129
|
+
forControl[field.field_name] = this.formBuilder.array(object, this.validator(field));
|
|
130
|
+
break;
|
|
131
|
+
case 'checkbox':
|
|
132
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
|
|
133
|
+
break;
|
|
134
|
+
case "text":
|
|
135
|
+
switch (field.type) {
|
|
136
|
+
case "gst_number":
|
|
137
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
|
|
138
|
+
break;
|
|
139
|
+
case "api":
|
|
140
|
+
switch (field.api_call_name) {
|
|
141
|
+
case "gst_number":
|
|
142
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidGSTNumber.bind(this.customvalidationService));
|
|
149
|
+
break;
|
|
150
|
+
case "typeahead":
|
|
151
|
+
switch (field.datatype) {
|
|
152
|
+
case 'object':
|
|
153
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field), this.customvalidationService.isValidData.bind(this.customvalidationService));
|
|
154
|
+
break;
|
|
155
|
+
default:
|
|
156
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
forControl[field.field_name] = new UntypedFormControl({ value: object, disabled: disabled }, this.validator(field));
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case "group":
|
|
166
|
+
forControl[field.field_name] = this.formBuilder.group(object);
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
validator(field) {
|
|
173
|
+
const validator = [];
|
|
174
|
+
if (field.is_mandatory != undefined && field.is_mandatory) {
|
|
175
|
+
switch (field.type) {
|
|
176
|
+
case "grid_selection":
|
|
177
|
+
case "list_of_string":
|
|
178
|
+
break;
|
|
179
|
+
case "typeahead":
|
|
180
|
+
if (field.datatype != 'list_of_object' && field.datatype != 'chips') {
|
|
181
|
+
validator.push(Validators.required);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case 'checkbox':
|
|
185
|
+
validator.push(Validators.requiredTrue);
|
|
186
|
+
break;
|
|
187
|
+
case "email":
|
|
188
|
+
validator.push(Validators.required);
|
|
189
|
+
validator.push(Validators.email);
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
validator.push(Validators.required);
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
switch (field.type) {
|
|
198
|
+
case "email":
|
|
199
|
+
validator.push(Validators.email);
|
|
200
|
+
break;
|
|
201
|
+
default:
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (field.min_length != undefined && field.min_length != null && field.min_length != '' && Number(field.min_length) && field.min_length > 0) {
|
|
206
|
+
validator.push(Validators.minLength(field.min_length));
|
|
207
|
+
}
|
|
208
|
+
if (field.max_length != undefined && field.max_length != null && field.max_length != '' && Number(field.max_length) && field.max_length > 0) {
|
|
209
|
+
validator.push(Validators.maxLength(field.max_length));
|
|
210
|
+
}
|
|
211
|
+
return validator;
|
|
212
|
+
}
|
|
213
|
+
setNewForm(tableFields, formFieldButtons, form, elements, selectedRowIndex) {
|
|
214
|
+
let responce = {
|
|
215
|
+
calculationFieldList: [],
|
|
216
|
+
showIfFieldList: [],
|
|
217
|
+
buttonIfList: [],
|
|
218
|
+
disableIfFieldList: [],
|
|
219
|
+
mendetoryIfFieldList: [],
|
|
220
|
+
gridSelectionMendetoryList: [],
|
|
221
|
+
customValidationFiels: [],
|
|
222
|
+
editorTypeFieldList: [],
|
|
223
|
+
checkBoxFieldListValue: [],
|
|
224
|
+
filePreviewFields: [],
|
|
225
|
+
staticModal: [],
|
|
226
|
+
forControl: {},
|
|
227
|
+
showGridData: {},
|
|
228
|
+
isStepper: false,
|
|
229
|
+
blankField: { fieldName: '', index: -1 }
|
|
230
|
+
};
|
|
231
|
+
for (let index = 0; index < tableFields.length; index++) {
|
|
232
|
+
const element = tableFields[index];
|
|
233
|
+
if (element == null) {
|
|
234
|
+
responce.blankField.fieldName = form.name;
|
|
235
|
+
responce.blankField.index = index + 1;
|
|
236
|
+
//this.notifyFieldValueIsNull(form.name,index+1);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
if (element.type == 'pdf_view') {
|
|
240
|
+
if (selectedRowIndex && selectedRowIndex != -1 && elements && elements.length > 0) {
|
|
241
|
+
const object = elements[selectedRowIndex];
|
|
242
|
+
responce.staticModal.push(this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, object));
|
|
243
|
+
}
|
|
244
|
+
responce.editorTypeFieldList.push(element);
|
|
245
|
+
}
|
|
246
|
+
if (element.type == 'info_html' || element.type == 'html_view') {
|
|
247
|
+
responce.editorTypeFieldList.push(element);
|
|
248
|
+
responce.filePreviewFields.push(element);
|
|
249
|
+
}
|
|
250
|
+
if (element.field_name && element.field_name != '') {
|
|
251
|
+
switch (element.type) {
|
|
252
|
+
case "list_of_checkbox":
|
|
253
|
+
this.createFormControl(responce.forControl, element, [], "list");
|
|
254
|
+
responce.checkBoxFieldListValue.push(element);
|
|
255
|
+
break;
|
|
256
|
+
case "checkbox":
|
|
257
|
+
this.createFormControl(responce.forControl, element, false, "checkbox");
|
|
258
|
+
break;
|
|
259
|
+
case "date":
|
|
260
|
+
let currentYear = new Date().getFullYear();
|
|
261
|
+
let value = "";
|
|
262
|
+
if (element.defaultValue && element.defaultValue != null && element.defaultValue != '') {
|
|
263
|
+
value = this.setDefaultDate(element);
|
|
264
|
+
}
|
|
265
|
+
if (element.datatype == 'object') {
|
|
266
|
+
this.minDate = new Date();
|
|
267
|
+
if (element.etc_fields && element.etc_fields != null) {
|
|
268
|
+
if (element.etc_fields.minDate) {
|
|
269
|
+
if (element.etc_fields.minDate == '-1') {
|
|
270
|
+
this.minDate = new Date(currentYear - 100, 0, 1);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
this.minDate.setDate(new Date().getDate() - Number(element.etc_fields.minDate));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
this.maxDate = new Date();
|
|
278
|
+
if (element.etc_fields && element.etc_fields != null) {
|
|
279
|
+
if (element.etc_fields.maxDate) {
|
|
280
|
+
if (element.etc_fields.maxDate == '-1') {
|
|
281
|
+
this.maxDate = new Date(currentYear + 25, 11, 31);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
this.maxDate.setDate(new Date().getDate() + Number(element.etc_fields.maxDate));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
this.minDate = new Date(currentYear - 100, 0, 1);
|
|
291
|
+
this.maxDate = new Date(currentYear + 25, 11, 31);
|
|
292
|
+
}
|
|
293
|
+
element['minDate'] = this.minDate;
|
|
294
|
+
element['maxDate'] = this.maxDate;
|
|
295
|
+
this.createFormControl(responce.forControl, element, value, "text");
|
|
296
|
+
break;
|
|
297
|
+
case "daterange":
|
|
298
|
+
const date_range = {};
|
|
299
|
+
let list_of_dates = [
|
|
300
|
+
{ field_name: 'start' },
|
|
301
|
+
{ field_name: 'end' }
|
|
302
|
+
];
|
|
303
|
+
if (list_of_dates.length > 0) {
|
|
304
|
+
list_of_dates.forEach((data) => {
|
|
305
|
+
this.createFormControl(date_range, data, '', "text");
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
this.createFormControl(responce.forControl, element, date_range, "group");
|
|
309
|
+
break;
|
|
310
|
+
case "list_of_fields":
|
|
311
|
+
case "group_of_fields":
|
|
312
|
+
const list_of_fields = {};
|
|
313
|
+
if (element) {
|
|
314
|
+
if (element.list_of_fields && element.list_of_fields.length > 0) {
|
|
315
|
+
for (let j = 0; j < element.list_of_fields.length; j++) {
|
|
316
|
+
const data = element.list_of_fields[j];
|
|
317
|
+
if (data == null) {
|
|
318
|
+
responce.blankField.fieldName = element.name;
|
|
319
|
+
responce.blankField.index = index + 1 + "->" + j + 1;
|
|
320
|
+
//this.notifyFieldValueIsNull(element.name,j+1);
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
if (element.type == 'list_of_fields' && element.datatype != 'key_value') {
|
|
324
|
+
data['notDisplay'] = false;
|
|
325
|
+
}
|
|
326
|
+
let modifyData = JSON.parse(JSON.stringify(data));
|
|
327
|
+
modifyData['parent'] = element.field_name;
|
|
328
|
+
//show if handling
|
|
329
|
+
if (data.show_if && data.show_if != '') {
|
|
330
|
+
modifyData['parentIndex'] = index;
|
|
331
|
+
modifyData['currentIndex'] = j;
|
|
332
|
+
responce.showIfFieldList.push(modifyData);
|
|
333
|
+
}
|
|
334
|
+
//Mendetory If handling
|
|
335
|
+
if (data.mandatory_if && data.mandatory_if != '') {
|
|
336
|
+
responce.mendetoryIfFieldList.push(modifyData);
|
|
337
|
+
}
|
|
338
|
+
//disable if handling
|
|
339
|
+
if ((data.disable_if && data.disable_if != '') || (data.disable_on_update && data.disable_on_update != '' && data.disable_on_update != undefined && data.disable_on_update != null) || (data.disable_on_add && data.disable_on_add != '' && data.disable_on_add != undefined && data.disable_on_add != null)) {
|
|
340
|
+
responce.disableIfFieldList.push(modifyData);
|
|
341
|
+
}
|
|
342
|
+
if (element.type == 'list_of_fields') {
|
|
343
|
+
modifyData.is_mandatory = false;
|
|
344
|
+
}
|
|
345
|
+
if (data.field_name && data.field_name != '' && element.datatype != "list_of_object_with_popup") {
|
|
346
|
+
// Calculation onChange handling
|
|
347
|
+
if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
|
|
348
|
+
responce.calculationFieldList.push(element);
|
|
349
|
+
}
|
|
350
|
+
switch (data.type) {
|
|
351
|
+
case "list_of_checkbox":
|
|
352
|
+
this.createFormControl(list_of_fields, modifyData, [], "list");
|
|
353
|
+
responce.checkBoxFieldListValue.push(modifyData);
|
|
354
|
+
break;
|
|
355
|
+
case "checkbox":
|
|
356
|
+
this.createFormControl(list_of_fields, modifyData, false, "checkbox");
|
|
357
|
+
break;
|
|
358
|
+
case "date":
|
|
359
|
+
let currentYear = new Date().getFullYear();
|
|
360
|
+
if (data.datatype == 'object') {
|
|
361
|
+
this.minDate = new Date();
|
|
362
|
+
if (data.etc_fields && data.etc_fields != null) {
|
|
363
|
+
if (data.etc_fields.minDate) {
|
|
364
|
+
if (data.etc_fields.minDate == '-1') {
|
|
365
|
+
this.minDate = new Date(currentYear - 100, 0, 1);
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
this.minDate.setDate(new Date().getDate() - Number(data.etc_fields.minDate));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
this.maxDate = new Date();
|
|
373
|
+
if (data.etc_fields && data.etc_fields != null) {
|
|
374
|
+
if (data.etc_fields.maxDate) {
|
|
375
|
+
if (data.etc_fields.maxDate == '-1') {
|
|
376
|
+
this.maxDate = new Date(currentYear + 25, 11, 31);
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
this.maxDate.setDate(new Date().getDate() + Number(data.etc_fields.maxDate));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
this.minDate = new Date(currentYear - 100, 0, 1);
|
|
386
|
+
this.maxDate = new Date(currentYear + 25, 11, 31);
|
|
387
|
+
}
|
|
388
|
+
data['minDate'] = this.minDate;
|
|
389
|
+
data['maxDate'] = this.maxDate;
|
|
390
|
+
this.createFormControl(list_of_fields, modifyData, '', "text");
|
|
391
|
+
break;
|
|
392
|
+
default:
|
|
393
|
+
this.createFormControl(list_of_fields, modifyData, '', "text");
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
data.field_class = this.commonFunctionService.getDivClass(data, (tableFields.length + element.list_of_fields.length));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
this.createFormControl(responce.forControl, element, list_of_fields, "group");
|
|
402
|
+
// if(element.type == 'list_of_fields'){
|
|
403
|
+
// this.list_of_fields.push(element);
|
|
404
|
+
// }
|
|
405
|
+
break;
|
|
406
|
+
// case 'html_view':
|
|
407
|
+
// const field = {
|
|
408
|
+
// field_name : 'html_view_1'
|
|
409
|
+
// }
|
|
410
|
+
// this.createFormControl(forControl, element, '', "text")
|
|
411
|
+
// break;
|
|
412
|
+
case "stepper":
|
|
413
|
+
if (element.list_of_fields && element.list_of_fields.length > 0) {
|
|
414
|
+
element.list_of_fields.forEach((step) => {
|
|
415
|
+
if (step.list_of_fields != undefined && step.list_of_fields.length > 0) {
|
|
416
|
+
const stepper_of_fields = {};
|
|
417
|
+
step.list_of_fields.forEach((data) => {
|
|
418
|
+
let modifyData = JSON.parse(JSON.stringify(data));
|
|
419
|
+
modifyData.parent = step.field_name;
|
|
420
|
+
//show if handling
|
|
421
|
+
if (data.show_if && data.show_if != '') {
|
|
422
|
+
responce.showIfFieldList.push(modifyData);
|
|
423
|
+
}
|
|
424
|
+
//mendetory if handling
|
|
425
|
+
if (data.mandatory_if && data.mandatory_if != '') {
|
|
426
|
+
responce.mendetoryIfFieldList.push(modifyData);
|
|
427
|
+
}
|
|
428
|
+
//disable if handling
|
|
429
|
+
if ((data.disable_if && data.disable_if != '') || (data.disable_on_update && data.disable_on_update != '' && data.disable_on_update != undefined && data.disable_on_update != null) || (data.disable_on_add && data.disable_on_add != '' && data.disable_on_add != undefined && data.disable_on_add != null)) {
|
|
430
|
+
responce.disableIfFieldList.push(modifyData);
|
|
431
|
+
}
|
|
432
|
+
// Calculation onChange handling
|
|
433
|
+
if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
|
|
434
|
+
responce.calculationFieldList.push(element);
|
|
435
|
+
}
|
|
436
|
+
this.createFormControl(stepper_of_fields, modifyData, '', "text");
|
|
437
|
+
if (data.tree_view_object && data.tree_view_object.field_name != "") {
|
|
438
|
+
let treeModifyData = JSON.parse(JSON.stringify(data.tree_view_object));
|
|
439
|
+
treeModifyData.is_mandatory = false;
|
|
440
|
+
this.createFormControl(stepper_of_fields, treeModifyData, '', "text");
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
this.createFormControl(responce.forControl, step, stepper_of_fields, "group");
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
responce.isStepper = true;
|
|
447
|
+
}
|
|
448
|
+
break;
|
|
449
|
+
case "pdf_view":
|
|
450
|
+
if (selectedRowIndex && selectedRowIndex != -1 && elements && elements.length > 0) {
|
|
451
|
+
const object = elements[selectedRowIndex];
|
|
452
|
+
responce.staticModal.push(this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, object));
|
|
453
|
+
}
|
|
454
|
+
break;
|
|
455
|
+
case "input_with_uploadfile":
|
|
456
|
+
element.is_disabled = true;
|
|
457
|
+
this.createFormControl(responce.forControl, element, '', "text");
|
|
458
|
+
break;
|
|
459
|
+
case "grid_selection":
|
|
460
|
+
if (element && element.gridColumns && element.gridColumns.length > 0) {
|
|
461
|
+
let colParField = JSON.parse(JSON.stringify(element));
|
|
462
|
+
colParField['mendetory_fields'] = [];
|
|
463
|
+
element.gridColumns.forEach((colField) => {
|
|
464
|
+
if (colField && colField.is_mandatory) {
|
|
465
|
+
colParField['mendetory_fields'].push(colField);
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
if (colParField && colParField['mendetory_fields'] && colParField['mendetory_fields'].length > 0) {
|
|
469
|
+
responce.gridSelectionMendetoryList.push(colParField);
|
|
470
|
+
element['mendetory_fields'] = colParField['mendetory_fields'];
|
|
471
|
+
}
|
|
472
|
+
responce.showGridData[element.field_name] = true;
|
|
473
|
+
}
|
|
474
|
+
if (element && element.addNewButtonIf && element.addNewButtonIf != '') {
|
|
475
|
+
element['fieldIndex'] = index;
|
|
476
|
+
responce.buttonIfList.push(element);
|
|
477
|
+
}
|
|
478
|
+
element['showButton'] = this.checkGridSelectionButtonCondition(element, 'add', {}, {});
|
|
479
|
+
this.createFormControl(responce.forControl, element, '', "text");
|
|
480
|
+
break;
|
|
481
|
+
case "tree_view":
|
|
482
|
+
// this.treeControl[element.field_name] = new FlatTreeControl<TodoItemFlatNode>(this.getLevel, this.isExpandable);
|
|
483
|
+
// this.dataSource[element.field_name] = new MatTreeFlatDataSource(this.treeControl[element.field_name], this.treeFlattener);
|
|
484
|
+
this.createFormControl(responce.forControl, element, '', "text");
|
|
485
|
+
break;
|
|
486
|
+
default:
|
|
487
|
+
if (element.defaultValue && element.defaultValue != null && element.defaultValue != '') {
|
|
488
|
+
const value = element.defaultValue;
|
|
489
|
+
this.createFormControl(responce.forControl, element, value, "text");
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
this.createFormControl(responce.forControl, element, '', "text");
|
|
493
|
+
}
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
if (element.tree_view_object && element.tree_view_object.field_name != "") {
|
|
497
|
+
let treeModifyData = JSON.parse(JSON.stringify(element.tree_view_object));
|
|
498
|
+
treeModifyData.is_mandatory = false;
|
|
499
|
+
this.createFormControl(responce.forControl, treeModifyData, '', "text");
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
//show if handling
|
|
503
|
+
if (element.show_if && element.show_if != '') {
|
|
504
|
+
responce.showIfFieldList.push(element);
|
|
505
|
+
}
|
|
506
|
+
//mendatory if handling
|
|
507
|
+
if (element.mandatory_if && element.mandatory_if != '') {
|
|
508
|
+
responce.mendetoryIfFieldList.push(element);
|
|
509
|
+
}
|
|
510
|
+
//Customvalidation handling
|
|
511
|
+
if (element.compareFieldName && element.compareFieldName != '') {
|
|
512
|
+
responce.customValidationFiels.push(element);
|
|
513
|
+
}
|
|
514
|
+
//disable if handling
|
|
515
|
+
if ((element.disable_if && element.disable_if != '') || (element.disable_on_update && element.disable_on_update != '' && element.disable_on_update != undefined && element.disable_on_update != null) || (element.disable_on_add && element.disable_on_add != '' && element.disable_on_add != undefined && element.disable_on_add != null)) {
|
|
516
|
+
responce.disableIfFieldList.push(element);
|
|
517
|
+
}
|
|
518
|
+
// Calculation onChange handling
|
|
519
|
+
if (element.onchange_function && element.onchange_function_param && element.onchange_function_param != "") {
|
|
520
|
+
responce.calculationFieldList.push(element);
|
|
521
|
+
}
|
|
522
|
+
element.field_class = this.commonFunctionService.getDivClass(element, tableFields.length);
|
|
523
|
+
}
|
|
524
|
+
if (formFieldButtons && formFieldButtons.length > 0) {
|
|
525
|
+
formFieldButtons.forEach((element) => {
|
|
526
|
+
if (element.field_name && element.field_name != '') {
|
|
527
|
+
switch (element.type) {
|
|
528
|
+
case "dropdown":
|
|
529
|
+
this.createFormControl(responce.forControl, element, '', "text");
|
|
530
|
+
break;
|
|
531
|
+
default:
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (element.show_if && element.show_if != '') {
|
|
536
|
+
responce.showIfFieldList.push(element);
|
|
537
|
+
}
|
|
538
|
+
if (element.mandatory_if && element.mandatory_if != '') {
|
|
539
|
+
responce.mendetoryIfFieldList.push(element);
|
|
540
|
+
}
|
|
541
|
+
if ((element.disable_if && element.disable_if != '') || (element.disable_on_update && element.disable_on_update != '' && element.disable_on_update != undefined && element.disable_on_update != null) || (element.disable_on_add && element.disable_on_add != '' && element.disable_on_add != undefined && element.disable_on_add != null)) {
|
|
542
|
+
responce.disableIfFieldList.push(element);
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
return responce;
|
|
547
|
+
}
|
|
548
|
+
checkFieldButtonCondition(tableFields) {
|
|
549
|
+
let responce = {
|
|
550
|
+
tempVal: {}
|
|
551
|
+
};
|
|
552
|
+
tableFields.forEach((element) => {
|
|
553
|
+
switch (element.type) {
|
|
554
|
+
case "typeahead":
|
|
555
|
+
if (element.datatype == 'list_of_object') {
|
|
556
|
+
responce.tempVal[element.field_name + "_add_button"] = true;
|
|
557
|
+
}
|
|
558
|
+
break;
|
|
559
|
+
case "list_of_string":
|
|
560
|
+
responce.tempVal[element.field_name + "_add_button"] = true;
|
|
561
|
+
break;
|
|
562
|
+
case "list_of_fields":
|
|
563
|
+
case "group_of_fields":
|
|
564
|
+
if (element.list_of_fields != undefined && element.list_of_fields != null && element.list_of_fields.length > 0) {
|
|
565
|
+
element.list_of_fields.forEach((child) => {
|
|
566
|
+
if (child && child != null) {
|
|
567
|
+
switch (child.type) {
|
|
568
|
+
case "typeahead":
|
|
569
|
+
if (child.datatype == 'list_of_object') {
|
|
570
|
+
responce.tempVal[element.field_name + '_' + child.field_name + "_add_button"] = true;
|
|
571
|
+
}
|
|
572
|
+
break;
|
|
573
|
+
case "list_of_string":
|
|
574
|
+
responce.tempVal[element.field_name + '_' + child.field_name + "_add_button"] = true;
|
|
575
|
+
break;
|
|
576
|
+
default:
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
break;
|
|
583
|
+
case "stepper":
|
|
584
|
+
if (element.list_of_fields != undefined && element.list_of_fields != null && element.list_of_fields.length > 0) {
|
|
585
|
+
element.list_of_fields.forEach((step) => {
|
|
586
|
+
if (step.list_of_fields != undefined && step.list_of_fields != null && step.list_of_fields.length > 0) {
|
|
587
|
+
step.list_of_fields.forEach((child) => {
|
|
588
|
+
switch (child.type) {
|
|
589
|
+
case "typeahead":
|
|
590
|
+
if (child.datatype == 'list_of_object') {
|
|
591
|
+
responce.tempVal[step.field_name + '_' + child.field_name + "_add_button"] = true;
|
|
592
|
+
}
|
|
593
|
+
break;
|
|
594
|
+
case "list_of_string":
|
|
595
|
+
responce.tempVal[step.field_name + '_' + child.field_name + "_add_button"] = true;
|
|
596
|
+
break;
|
|
597
|
+
default:
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
break;
|
|
605
|
+
default:
|
|
606
|
+
break;
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
return responce;
|
|
610
|
+
}
|
|
611
|
+
updateSelectContact(selectContact, tabFilterData, tableFields, templateForm, formValueWithCustomData, staticModal) {
|
|
612
|
+
let account = {};
|
|
613
|
+
let contact = {};
|
|
614
|
+
let payload = {};
|
|
615
|
+
let selectContactObject = {};
|
|
616
|
+
if (selectContact) {
|
|
617
|
+
selectContactObject = selectContact;
|
|
618
|
+
}
|
|
619
|
+
if (tabFilterData && tabFilterData.length > 0) {
|
|
620
|
+
tabFilterData.forEach((element) => {
|
|
621
|
+
if (element && element._id) {
|
|
622
|
+
if (element._id == selectContact) {
|
|
623
|
+
selectContactObject = element;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
if (selectContactObject) {
|
|
629
|
+
if (selectContactObject['_id']) {
|
|
630
|
+
contact = {
|
|
631
|
+
"_id": selectContactObject['_id'],
|
|
632
|
+
"name": selectContactObject['name'],
|
|
633
|
+
"code": selectContactObject['serialId']
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
if (selectContactObject['lead']) {
|
|
637
|
+
account = selectContactObject['lead'];
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
if (tableFields && tableFields.length > 0) {
|
|
641
|
+
tableFields.forEach((element) => {
|
|
642
|
+
if (element && element.field_name && element.field_name != '') {
|
|
643
|
+
let fieldName = element.field_name;
|
|
644
|
+
if (fieldName == 'account') {
|
|
645
|
+
if (account && Object.keys(account).length > 0) {
|
|
646
|
+
templateForm.controls['account'].setValue(account);
|
|
647
|
+
}
|
|
648
|
+
if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
|
|
649
|
+
payload = this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
|
|
650
|
+
if (element.onchange_api_params.indexOf("FORM_GROUP") >= 0 || element.onchange_api_params.indexOf("QTMP") >= 0) {
|
|
651
|
+
payload["data"] = formValueWithCustomData;
|
|
652
|
+
}
|
|
653
|
+
staticModal.push(payload);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
if (element.field_name == 'contact') {
|
|
657
|
+
if (contact && Object.keys(contact).length > 0) {
|
|
658
|
+
templateForm.controls['contact'].setValue(contact);
|
|
659
|
+
}
|
|
660
|
+
if (element.onchange_api_params && element.onchange_call_back_field && !element.do_not_auto_trigger_on_edit) {
|
|
661
|
+
payload = this.apiCallService.getPaylodWithCriteria(element.onchange_api_params, element.onchange_call_back_field, element.onchange_api_params_criteria, formValueWithCustomData);
|
|
662
|
+
if (element.onchange_api_params.indexOf("FORM_GROUP") >= 0 || element.onchange_api_params.indexOf("QTMP") >= 0) {
|
|
663
|
+
payload["data"] = formValueWithCustomData;
|
|
664
|
+
}
|
|
665
|
+
staticModal.push(payload);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
if (element.type == 'stepper' && element.list_of_fields && element.list_of_fields.length > 0) {
|
|
669
|
+
element.list_of_fields.forEach((stepData) => {
|
|
670
|
+
if (stepData && stepData.list_of_fields && stepData.list_of_fields.length > 0) {
|
|
671
|
+
stepData.list_of_fields.forEach((data) => {
|
|
672
|
+
let fieldName = stepData.field_name;
|
|
673
|
+
if (data.field_name == 'account') {
|
|
674
|
+
templateForm.controls[fieldName].controls['account'].setValue(account);
|
|
675
|
+
//this.templateForm.get(stepData.field_name).get('account').setValue(account);
|
|
676
|
+
if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
|
|
677
|
+
payload = this.apiCallService.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
|
|
678
|
+
if (data.onchange_api_params.indexOf("FORM_GROUP") >= 0 || data.onchange_api_params.indexOf("QTMP") >= 0) {
|
|
679
|
+
payload["data"] = formValueWithCustomData;
|
|
680
|
+
}
|
|
681
|
+
staticModal.push(payload);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
if (data.field_name == 'contact') {
|
|
685
|
+
templateForm.controls[fieldName].controls['contact'].setValue(contact);
|
|
686
|
+
if (data.onchange_api_params && data.onchange_call_back_field && !data.do_not_auto_trigger_on_edit) {
|
|
687
|
+
payload = this.apiCallService.getPaylodWithCriteria(data.onchange_api_params, data.onchange_call_back_field, data.onchange_api_params_criteria, formValueWithCustomData);
|
|
688
|
+
if (data.onchange_api_params.indexOf("FORM_GROUP") >= 0 || data.onchange_api_params.indexOf("QTMP") >= 0) {
|
|
689
|
+
payload["data"] = formValueWithCustomData;
|
|
690
|
+
}
|
|
691
|
+
staticModal.push(payload);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
return staticModal;
|
|
702
|
+
}
|
|
703
|
+
checkGridSelectionButtonCondition(field, button, selectedRow, formValue) {
|
|
704
|
+
let check = true;
|
|
705
|
+
switch (button) {
|
|
706
|
+
case 'add':
|
|
707
|
+
if (field && field.addNewButtonIf && field.addNewButtonIf != '') {
|
|
708
|
+
let modifyedField = {};
|
|
709
|
+
modifyedField['show_if'] = field.addNewButtonIf;
|
|
710
|
+
check = this.checkifService.checkShowIf(modifyedField, selectedRow, formValue);
|
|
711
|
+
}
|
|
712
|
+
break;
|
|
713
|
+
default:
|
|
714
|
+
break;
|
|
715
|
+
}
|
|
716
|
+
return check;
|
|
717
|
+
}
|
|
718
|
+
setDefaultDate(element) {
|
|
719
|
+
let value = "";
|
|
720
|
+
let today = new Date();
|
|
721
|
+
today.setHours(0, 0, 0, 0);
|
|
722
|
+
let yesterday = new Date(today);
|
|
723
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
724
|
+
yesterday.setHours(0, 0, 0, 0);
|
|
725
|
+
switch (element.defaultValue) {
|
|
726
|
+
case "Today":
|
|
727
|
+
value = today;
|
|
728
|
+
break;
|
|
729
|
+
case "Yesterday":
|
|
730
|
+
value = yesterday;
|
|
731
|
+
break;
|
|
732
|
+
default:
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
return value;
|
|
736
|
+
}
|
|
737
|
+
getFocusField(previousFormFocusField, tableFields, templateForm, focusFieldParent, checkFormFieldAutfocus) {
|
|
738
|
+
let responce = {
|
|
739
|
+
checkFormFieldAutfocus: checkFormFieldAutfocus,
|
|
740
|
+
previousFormFocusField: previousFormFocusField,
|
|
741
|
+
focusFieldParent: focusFieldParent,
|
|
742
|
+
id: ""
|
|
743
|
+
};
|
|
744
|
+
if (previousFormFocusField && previousFormFocusField._id) {
|
|
745
|
+
responce = this.focusField("", previousFormFocusField, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
if (previousFormFocusField == undefined || previousFormFocusField._id == undefined) {
|
|
749
|
+
for (const key of tableFields) {
|
|
750
|
+
if (key.type == "stepper") {
|
|
751
|
+
if (key.list_of_fields && key.list_of_fields != null && key.list_of_fields.length > 0) {
|
|
752
|
+
for (const step of key.list_of_fields) {
|
|
753
|
+
if (step.list_of_fields && step.list_of_fields != null && step.list_of_fields.length > 0) {
|
|
754
|
+
for (const field of step.list_of_fields) {
|
|
755
|
+
if (field.field_name) {
|
|
756
|
+
responce = this.focusField(step, field, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
else if (key.field_name) {
|
|
765
|
+
if (key.type == 'text') {
|
|
766
|
+
responce = this.focusField("", key, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce);
|
|
767
|
+
break;
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
responce.checkFormFieldAutfocus = false;
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
return responce;
|
|
778
|
+
}
|
|
779
|
+
focusField(parent, key, templateForm, focusFieldParent, checkFormFieldAutfocus, previousFormFocusField, responce) {
|
|
780
|
+
responce.id = key._id + "_" + key.field_name;
|
|
781
|
+
let field = {};
|
|
782
|
+
if (parent == '') {
|
|
783
|
+
if (focusFieldParent && focusFieldParent.field_name && focusFieldParent.field_name != '') {
|
|
784
|
+
parent = focusFieldParent;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
if (parent != "") {
|
|
788
|
+
field = templateForm.controls[parent.field_name].controls[key.field_name];
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
field = templateForm.controls[key.field_name];
|
|
792
|
+
}
|
|
793
|
+
if (field && field.touched) {
|
|
794
|
+
responce.checkFormFieldAutfocus = false;
|
|
795
|
+
if (previousFormFocusField && previousFormFocusField._id) {
|
|
796
|
+
responce.previousFormFocusField = {};
|
|
797
|
+
responce.focusFieldParent = {};
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
else if (field == undefined) {
|
|
801
|
+
responce.previousFormFocusField = {};
|
|
802
|
+
responce.focusFieldParent = {};
|
|
803
|
+
}
|
|
804
|
+
return responce;
|
|
805
|
+
}
|
|
806
|
+
getDonotResetFields(tableFields, donotResetFieldLists, FormValue) {
|
|
807
|
+
tableFields.forEach((tablefield) => {
|
|
808
|
+
if (tablefield.do_not_refresh_on_add && tablefield.type != "list_of_fields" && tablefield.type != "group_of_fields" && tablefield.type != "stepper") {
|
|
809
|
+
donotResetFieldLists[tablefield.field_name] = FormValue[tablefield.field_name];
|
|
810
|
+
}
|
|
811
|
+
else if (tablefield.type == "group_of_fields") {
|
|
812
|
+
if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
|
|
813
|
+
tablefield.list_of_fields.forEach((field) => {
|
|
814
|
+
if (field.do_not_refresh_on_add) {
|
|
815
|
+
donotResetFieldLists[tablefield.field_name][field.field_name] = FormValue[tablefield.field_name][field.field_name];
|
|
816
|
+
}
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
else if (tablefield.type == "stepper") {
|
|
821
|
+
if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
|
|
822
|
+
tablefield.list_of_fields.forEach((step) => {
|
|
823
|
+
if (step.list_of_fields && step.list_of_fields.length > 0) {
|
|
824
|
+
step.list_of_fields.forEach((field) => {
|
|
825
|
+
if (field.do_not_refresh_on_add) {
|
|
826
|
+
donotResetFieldLists[step.field_name][field.field_name] = FormValue[step.field_name][field.field_name];
|
|
827
|
+
}
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
});
|
|
834
|
+
return donotResetFieldLists;
|
|
835
|
+
}
|
|
836
|
+
addNewForm(selectTabIndex, isBulkUpdate, bulkuploadList, selectedRowIndex, formName, selectContactAdd) {
|
|
837
|
+
let formData = {};
|
|
838
|
+
formData['tabIndex'] = selectTabIndex;
|
|
839
|
+
formData['bulkUpdate'] = isBulkUpdate;
|
|
840
|
+
formData['bulkDataList'] = bulkuploadList;
|
|
841
|
+
formData['editedRowIndex'] = selectedRowIndex;
|
|
842
|
+
formData['formName'] = formName;
|
|
843
|
+
formData['selectContact'] = selectContactAdd;
|
|
844
|
+
this.modalService.open('form-modal', formData);
|
|
845
|
+
}
|
|
846
|
+
getFieldsFromForms(tab, formName, dinamic_form, gridButtons, tableFields, actionButtons) {
|
|
847
|
+
let responce = {
|
|
848
|
+
"fields": tableFields,
|
|
849
|
+
"buttons": actionButtons
|
|
850
|
+
};
|
|
851
|
+
let form = null;
|
|
852
|
+
if (formName != 'DINAMIC_FORM' && tab && tab.forms) {
|
|
853
|
+
form = this.commonFunctionService.getForm(tab.forms, formName, gridButtons);
|
|
854
|
+
}
|
|
855
|
+
else if (formName == 'DINAMIC_FORM') {
|
|
856
|
+
form = dinamic_form;
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
form = null;
|
|
860
|
+
}
|
|
861
|
+
if (form != null) {
|
|
862
|
+
if (form?.['tableFields'] && form?.['tableFields']?.length > 0) {
|
|
863
|
+
responce.fields = form['tableFields'];
|
|
864
|
+
}
|
|
865
|
+
if (form?.['tab_list_buttons'] && form?.['tab_list_buttons']?.length > 0) {
|
|
866
|
+
responce.buttons = form['tab_list_buttons'];
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
return responce;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
FormCreationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, deps: [{ token: i1.CommonFunctionService }, { token: i2.EnvService }, { token: i3.StorageService }, { token: i4.UntypedFormBuilder }, { token: i5.CustomvalidationService }, { token: i6.ApiCallService }, { token: i7.CheckIfService }, { token: i8.ModelService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
873
|
+
FormCreationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, providedIn: 'root' });
|
|
874
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormCreationService, decorators: [{
|
|
875
|
+
type: Injectable,
|
|
876
|
+
args: [{
|
|
877
|
+
providedIn: 'root'
|
|
878
|
+
}]
|
|
879
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.EnvService }, { type: i3.StorageService }, { type: i4.UntypedFormBuilder }, { type: i5.CustomvalidationService }, { type: i6.ApiCallService }, { type: i7.CheckIfService }, { type: i8.ModelService }]; } });
|
|
880
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jcmVhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9mb3JtL2Zvcm0tY3JlYXRpb24vZm9ybS1jcmVhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUF3QyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVN0RyxNQUFNLE9BQU8sbUJBQW1CO0lBSzlCLFlBQ1UscUJBQTJDLEVBQzNDLFVBQXFCLEVBQ3JCLGNBQTZCLEVBQzdCLFdBQStCLEVBQy9CLHVCQUErQyxFQUMvQyxjQUE2QixFQUM3QixjQUE2QixFQUM3QixZQUF5QjtRQVB6QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXNCO1FBQzNDLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBd0I7UUFDL0MsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFFL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJ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QUFFLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3RFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDN0M7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7O2lIQTcwQlUsbUJBQW1CO3FIQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpQ2FsbFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2FwaS9hcGktY2FsbC9hcGktY2FsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24tdXRpbHMvY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZW52L2Vudi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b212YWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2N1c3RvbXZhbGlkYXRpb24vY3VzdG9tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hlY2tJZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGVjay1pZi9jaGVjay1pZi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvbW9kZWwuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgbWluRGF0ZTogRGF0ZTtcclxuICBtYXhEYXRlOiBEYXRlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOkNvbW1vbkZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZW52U2VydmljZTpFbnZTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTpTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgY3VzdG9tdmFsaWRhdGlvblNlcnZpY2U6Q3VzdG9tdmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaUNhbGxTZXJ2aWNlOkFwaUNhbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGVja2lmU2VydmljZTpDaGVja0lmU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOk1vZGVsU2VydmljZVxyXG4gICkge1xyXG4gICAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciArIDI1LCAxMSwgMzEpO1xyXG4gIH1cclxuICBnZXRUZW1wRGF0YSh0ZW1wRGF0YTphbnksdGFiSW5kZXg6YW55LGN1cnJlbnRNZW51OmFueSxmb3JtTmFtZTphbnksZGluYW1pY19mb3JtOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgdGFiOnt9LFxyXG4gICAgICBjdXJyZW50TWVudTpjdXJyZW50TWVudSxcclxuICAgICAgZ3JpZF92aWV3X21vZGU6XCJcIixcclxuICAgICAgZm9ybTp7fSxcclxuICAgICAgZm9ybXM6e31cclxuICAgIH1cclxuICAgIGlmKHRlbXBEYXRhWzBdLnRlbXBsYXRlVGFicyl7XHJcbiAgICAgIHJlc3BvbmNlLnRhYiA9IHRlbXBEYXRhWzBdLnRlbXBsYXRlVGFic1t0YWJJbmRleF07XHJcbiAgICB9XHJcbiAgICBsZXQgdGFiID0gcmVzcG9uY2UudGFiXHJcbiAgICBpZiAodGFiICYmIHRhYi50YWJfbmFtZSAhPSBcIlwiICYmIHRhYi50YWJfbmFtZSAhPSBudWxsICYmIHRhYi50YWJfbmFtZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYoY3VycmVudE1lbnUgJiYgY3VycmVudE1lbnUubmFtZSAmJiBjdXJyZW50TWVudS5uYW1lICE9IHVuZGVmaW5lZCAmJiBjdXJyZW50TWVudS5uYW1lICE9IG51bGwpe1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSB7XCJuYW1lXCI6dGFiLnRhYl9uYW1lfTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLlNldEFjdGl2ZU1lbnUobWVudSk7XHJcbiAgICAgICAgcmVzcG9uY2UuY3VycmVudE1lbnUubmFtZSA9IHRhYi50YWJfbmFtZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodGFiICAmJiB0YWIuZ3JpZCAhPSBudWxsICYmIHRhYi5ncmlkICE9IHVuZGVmaW5lZCApe1xyXG4gICAgICBpZih0YWIuZ3JpZC5ncmlkX3ZpZXcgIT0gbnVsbCAmJiB0YWIuZ3JpZC5ncmlkX3ZpZXcgIT0gdW5kZWZpbmVkICYmIHRhYi5ncmlkLmdyaWRfdmlldyAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UuZ3JpZF92aWV3X21vZGU9dGFiLmdyaWQuZ3JpZF92aWV3O1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXNwb25jZS5ncmlkX3ZpZXdfbW9kZT0ndGFibGVWaWV3JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRhYiAmJiBmb3JtTmFtZSAhPSAnJyl7XHJcbiAgICAgIGlmKGZvcm1OYW1lID09ICdESU5BTUlDX0ZPUk0nKXtcclxuICAgICAgICByZXNwb25jZS5mb3JtID0gZGluYW1pY19mb3JtXHJcbiAgICAgIH1lbHNlIGlmKHRhYi5mb3JtcyAhPSBudWxsICYmIHRhYi5mb3JtcyAhPSB1bmRlZmluZWQgKXtcclxuICAgICAgICByZXNwb25jZS5mb3JtcyA9IHRhYi5mb3JtcztcclxuICAgICAgICBsZXQgZ3JpZEFjdGlvbkJ1dHRvbnMgPSBbXTtcclxuICAgICAgICBpZih0YWIuZ3JpZCAmJiB0YWIuZ3JpZC5hY3Rpb25fYnV0dG9ucyl7XHJcbiAgICAgICAgICBncmlkQWN0aW9uQnV0dG9ucyA9IHRhYi5ncmlkLmFjdGlvbl9idXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25jZS5mb3JtID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0Rm9ybShyZXNwb25jZS5mb3Jtcyxmb3JtTmFtZSxncmlkQWN0aW9uQnV0dG9ucylcclxuICAgICAgICBpZihmb3JtTmFtZSA9PSAnY2xvbmVfb2JqZWN0Jyl7XHJcbiAgICAgICAgICByZXNwb25jZS5mb3JtWydhcGlfcGFyYW1zJ10gPSBcIlFUTVA6Q0xPTkVfT0JKRUNUXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5zZXRGb3JtKCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLmZvcm0gPSB7fTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tGb3JtRGV0YWlscyhmb3JtOmFueSx0YWI6YW55LGN1cnJlbnRNZW51OmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgY3VycmVudE1lbnU6Y3VycmVudE1lbnUsXHJcbiAgICAgIGJ1bGt1cGRhdGVzOmZhbHNlLFxyXG4gICAgICBnZXRMb2NhdGlvbjpmYWxzZSxcclxuICAgICAgaGVhZGVyRmlsZWRzRGF0YTpbXSxcclxuICAgICAgdGFibGVGaWVsZHM6W10sXHJcbiAgICAgIGZvcm1GaWVsZEJ1dHRvbnM6W10sXHJcbiAgICAgIGdldFRhYmxlRmllbGQ6dHJ1ZVxyXG4gICAgfVxyXG4gICAgaWYoZm9ybSl7XHJcbiAgICAgIGlmKGZvcm0uZGV0YWlscyl7XHJcbiAgICAgICAgaWYoZm9ybS5kZXRhaWxzLmNvbGxlY3Rpb25fbmFtZSAmJiBmb3JtLmRldGFpbHMuY29sbGVjdGlvbl9uYW1lICE9ICcnICYmIChyZXNwb25jZS5jdXJyZW50TWVudSAhPSB1bmRlZmluZWQgfHwgdGhpcy5lbnZTZXJ2aWNlLmdldFJlcXVlc3RUeXBlKCkgPT0gJ1BVQkxJQycpKXtcclxuICAgICAgICAgIGlmKHJlc3BvbmNlLmN1cnJlbnRNZW51ID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIHJlc3BvbmNlLmN1cnJlbnRNZW51ID0ge307XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNwb25jZS5jdXJyZW50TWVudVsnbmFtZSddID0gZm9ybS5kZXRhaWxzLmNvbGxlY3Rpb25fbmFtZTtcclxuICAgICAgICAgIGlmKHRhYiAmJiB0YWIudGFiX25hbWUgJiYgdGFiLnRhYl9uYW1lICE9ICcnKXtcclxuICAgICAgICAgICAgcmVzcG9uY2UuY3VycmVudE1lbnVbJ3RhYl9uYW1lJ10gPSB0YWIudGFiX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZvcm0uZGV0YWlscy5idWxrX3VwZGF0ZSl7XHJcbiAgICAgICAgICByZXNwb25jZS5idWxrdXBkYXRlcyA9IHRydWU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZXNwb25jZS5idWxrdXBkYXRlcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtLmdldExvY2F0aW9uKXtcclxuICAgICAgICByZXNwb25jZS5nZXRMb2NhdGlvbiA9IGZvcm0uZ2V0TG9jYXRpb247XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLmdldExvY2F0aW9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZm9ybS5oZWFkZXJGaWVsZHMpe1xyXG4gICAgICAgIHJlc3BvbmNlLmhlYWRlckZpbGVkc0RhdGEgPSBmb3JtLmhlYWRlckZpZWxkcztcclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtWyd0YWJsZUZpZWxkcyddICYmIGZvcm1bJ3RhYmxlRmllbGRzJ10gIT0gdW5kZWZpbmVkICYmIGZvcm1bJ3RhYmxlRmllbGRzJ10gIT0gbnVsbCl7XHJcbiAgICAgICAgcmVzcG9uY2UudGFibGVGaWVsZHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1bJ3RhYmxlRmllbGRzJ10pKTtcclxuICAgICAgICByZXNwb25jZS5nZXRUYWJsZUZpZWxkID0gZmFsc2U7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3BvbmNlLnRhYmxlRmllbGRzID0gW107XHJcbiAgICAgIH1cclxuICAgICAgaWYoZm9ybS50YWJfbGlzdF9idXR0b25zICYmIGZvcm0udGFiX2xpc3RfYnV0dG9ucyAhPSB1bmRlZmluZWQgJiYgZm9ybS50YWJfbGlzdF9idXR0b25zLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIHJlc3BvbmNlLmZvcm1GaWVsZEJ1dHRvbnMgPSBmb3JtLnRhYl9saXN0X2J1dHRvbnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuXHJcbiAgfVxyXG4gIGNyZWF0ZUZvcm1Db250cm9sKGZvckNvbnRyb2w6YW55LCBmaWVsZDphbnksIG9iamVjdDphbnksIHR5cGU6c3RyaW5nKSB7XHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmaWVsZC5pc19kaXNhYmxlZCA/IHRydWUgOiAoKGZpZWxkLmRpc2FibGVfaWYgIT0gdW5kZWZpbmVkICYmIGZpZWxkLmRpc2FibGVfaWYgIT0gJycpID8gdHJ1ZSA6IGZhbHNlKTtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdFwiOlxyXG4gICAgICAgIGZvckNvbnRyb2xbZmllbGQuZmllbGRfbmFtZV0gPSB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KG9iamVjdCwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcclxuICAgICAgICAgIGZvckNvbnRyb2xbZmllbGQuZmllbGRfbmFtZV0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IG9iamVjdCwgZGlzYWJsZWQ6IGRpc2FibGVkIH0sIHRoaXMudmFsaWRhdG9yKGZpZWxkKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBcImdzdF9udW1iZXJcIjpcclxuICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSx0aGlzLnZhbGlkYXRvcihmaWVsZCksdGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkR1NUTnVtYmVyLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxyXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmFwaV9jYWxsX25hbWUpIHtcclxuICAgICAgICAgICAgICBjYXNlIFwiZ3N0X251bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSx0aGlzLnZhbGlkYXRvcihmaWVsZCksdGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkR1NUTnVtYmVyLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LHRoaXMudmFsaWRhdG9yKGZpZWxkKSx0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlLmlzVmFsaWRHU1ROdW1iZXIuYmluZCh0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlKSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LHRoaXMudmFsaWRhdG9yKGZpZWxkKSx0aGlzLmN1c3RvbXZhbGlkYXRpb25TZXJ2aWNlLmlzVmFsaWREYXRhLmJpbmQodGhpcy5jdXN0b212YWxpZGF0aW9uU2VydmljZSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogb2JqZWN0LCBkaXNhYmxlZDogZGlzYWJsZWQgfSwgdGhpcy52YWxpZGF0b3IoZmllbGQpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmb3JDb250cm9sW2ZpZWxkLmZpZWxkX25hbWVdID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiBvYmplY3QsIGRpc2FibGVkOiBkaXNhYmxlZCB9LCB0aGlzLnZhbGlkYXRvcihmaWVsZCkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImdyb3VwXCI6XHJcbiAgICAgICAgZm9yQ29udHJvbFtmaWVsZC5maWVsZF9uYW1lXSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAob2JqZWN0KVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICB2YWxpZGF0b3IoZmllbGQ6YW55KSB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBbXVxyXG4gICAgaWYgKGZpZWxkLmlzX21hbmRhdG9yeSAhPSB1bmRlZmluZWQgJiYgZmllbGQuaXNfbWFuZGF0b3J5KSB7XHJcbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgaWYgKGZpZWxkLmRhdGF0eXBlICE9ICdsaXN0X29mX29iamVjdCcgJiYgZmllbGQuZGF0YXR5cGUgIT0gJ2NoaXBzJykge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxyXG4gICAgICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZFRydWUpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgICAgIHZhbGlkYXRvci5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmaWVsZC5taW5fbGVuZ3RoICE9IHVuZGVmaW5lZCAmJiBmaWVsZC5taW5fbGVuZ3RoICE9IG51bGwgJiYgZmllbGQubWluX2xlbmd0aCAhPSAnJyAmJiBOdW1iZXIoZmllbGQubWluX2xlbmd0aCkgJiYgZmllbGQubWluX2xlbmd0aCA+IDApIHtcclxuICAgICAgdmFsaWRhdG9yLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoZmllbGQubWluX2xlbmd0aCkpXHJcbiAgICB9XHJcbiAgICBpZihmaWVsZC5tYXhfbGVuZ3RoICE9IHVuZGVmaW5lZCAmJiBmaWVsZC5tYXhfbGVuZ3RoICE9IG51bGwgJiYgZmllbGQubWF4X2xlbmd0aCAhPSAnJyAmJiBOdW1iZXIoZmllbGQubWF4X2xlbmd0aCkgJiYgZmllbGQubWF4X2xlbmd0aCA+IDApe1xyXG4gICAgICB2YWxpZGF0b3IucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChmaWVsZC5tYXhfbGVuZ3RoKSlcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0b3I7XHJcbiAgfVxyXG4gIHNldE5ld0Zvcm0odGFibGVGaWVsZHM6YW55LGZvcm1GaWVsZEJ1dHRvbnM6YW55LGZvcm06YW55LGVsZW1lbnRzOmFueSxzZWxlY3RlZFJvd0luZGV4Om51bWJlcil7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55ID0ge1xyXG4gICAgICBjYWxjdWxhdGlvbkZpZWxkTGlzdDpbXSxcclxuICAgICAgc2hvd0lmRmllbGRMaXN0OltdLFxyXG4gICAgICBidXR0b25JZkxpc3Q6W10sXHJcbiAgICAgIGRpc2FibGVJZkZpZWxkTGlzdDpbXSxcclxuICAgICAgbWVuZGV0b3J5SWZGaWVsZExpc3QgOiBbXSxcclxuICAgICAgZ3JpZFNlbGVjdGlvbk1lbmRldG9yeUxpc3Q6W10sXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25GaWVscyA6IFtdLFxyXG4gICAgICBlZGl0b3JUeXBlRmllbGRMaXN0IDogW10sXHJcbiAgICAgIGNoZWNrQm94RmllbGRMaXN0VmFsdWU6W10sXHJcbiAgICAgIGZpbGVQcmV2aWV3RmllbGRzOltdLFxyXG4gICAgICBzdGF0aWNNb2RhbDpbXSxcclxuICAgICAgZm9yQ29udHJvbDp7fSxcclxuICAgICAgc2hvd0dyaWREYXRhOnt9LFxyXG4gICAgICBpc1N0ZXBwZXI6ZmFsc2UsXHJcbiAgICAgIGJsYW5rRmllbGQ6e2ZpZWxkTmFtZTonJyxpbmRleDotMX1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZUZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRhYmxlRmllbGRzW2luZGV4XTtcclxuICAgICAgaWYoZWxlbWVudCA9PSBudWxsKXtcclxuICAgICAgICByZXNwb25jZS5ibGFua0ZpZWxkLmZpZWxkTmFtZSA9IGZvcm0ubmFtZTtcclxuICAgICAgICByZXNwb25jZS5ibGFua0ZpZWxkLmluZGV4ID0gaW5kZXgrMTtcclxuICAgICAgICAvL3RoaXMubm90aWZ5RmllbGRWYWx1ZUlzTnVsbChmb3JtLm5hbWUsaW5kZXgrMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZWxlbWVudC50eXBlID09ICdwZGZfdmlldycpe1xyXG4gICAgICAgIGlmKHNlbGVjdGVkUm93SW5kZXggJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGVsZW1lbnRzW3NlbGVjdGVkUm93SW5kZXhdO1xyXG4gICAgICAgICAgcmVzcG9uY2Uuc3RhdGljTW9kYWwucHVzaCh0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMsZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLG9iamVjdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25jZS5lZGl0b3JUeXBlRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZWxlbWVudC50eXBlID09ICdpbmZvX2h0bWwnIHx8IGVsZW1lbnQudHlwZSA9PSAnaHRtbF92aWV3Jykge1xyXG4gICAgICAgIHJlc3BvbmNlLmVkaXRvclR5cGVGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICByZXNwb25jZS5maWxlUHJldmlld0ZpZWxkcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIFtdLCBcImxpc3RcIilcclxuICAgICAgICAgICAgcmVzcG9uY2UuY2hlY2tCb3hGaWVsZExpc3RWYWx1ZS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGZhbHNlLCBcImNoZWNrYm94XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImRhdGVcIjpcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWU6YW55ID0gXCJcIjtcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kZWZhdWx0VmFsdWUgJiYgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LmRlZmF1bHRWYWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnNldERlZmF1bHREYXRlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzICYmIGVsZW1lbnQuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZXRjX2ZpZWxkcy5taW5EYXRlKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzLm1pbkRhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbkRhdGUuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSAtIE51bWJlcihlbGVtZW50LmV0Y19maWVsZHMubWluRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzICYmIGVsZW1lbnQuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZXRjX2ZpZWxkcy5tYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5ldGNfZmllbGRzLm1heERhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgKyAyNSwgMTEsIDMxKTtcclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlLnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBOdW1iZXIoZWxlbWVudC5ldGNfZmllbGRzLm1heERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyICsgMjUsIDExLCAzMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudFsnbWluRGF0ZSddID0gdGhpcy5taW5EYXRlXHJcbiAgICAgICAgICAgIGVsZW1lbnRbJ21heERhdGUnXSA9IHRoaXMubWF4RGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChyZXNwb25jZS5mb3JDb250cm9sLCBlbGVtZW50LCB2YWx1ZSwgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImRhdGVyYW5nZVwiOlxyXG4gICAgICAgICAgICBjb25zdCBkYXRlX3JhbmdlID0ge307XHJcbiAgICAgICAgICAgIGxldCBsaXN0X29mX2RhdGVzID0gW1xyXG4gICAgICAgICAgICAgIHtmaWVsZF9uYW1lIDogJ3N0YXJ0J30sXHJcbiAgICAgICAgICAgICAge2ZpZWxkX25hbWUgOiAnZW5kJ31cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBpZiAobGlzdF9vZl9kYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgbGlzdF9vZl9kYXRlcy5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKGRhdGVfcmFuZ2UsIGRhdGEsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGRhdGVfcmFuZ2UsIFwiZ3JvdXBcIilcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgY29uc3QgbGlzdF9vZl9maWVsZHMgPSB7fTtcclxuICAgICAgICAgICAgaWYoZWxlbWVudCl7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuYmxhbmtGaWVsZC5maWVsZE5hbWUgPSBlbGVtZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2UuYmxhbmtGaWVsZC5pbmRleCA9IGluZGV4KzErXCItPlwiK2orMTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMubm90aWZ5RmllbGRWYWx1ZUlzTnVsbChlbGVtZW50Lm5hbWUsaisxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50LnR5cGUgPT0gJ2xpc3Rfb2ZfZmllbGRzJyAmJiBlbGVtZW50LmRhdGF0eXBlICE9ICdrZXlfdmFsdWUnKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhWydub3REaXNwbGF5J10gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBsZXQgbW9kaWZ5RGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhWydwYXJlbnQnXSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgLy9zaG93IGlmIGhhbmRsaW5nXHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEuc2hvd19pZiAmJiBkYXRhLnNob3dfaWYgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeURhdGFbJ3BhcmVudEluZGV4J10gPSBpbmRleDtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhWydjdXJyZW50SW5kZXgnXSA9IGo7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uY2Uuc2hvd0lmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy9NZW5kZXRvcnkgSWYgaGFuZGxpbmdcclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5tYW5kYXRvcnlfaWYgJiYgZGF0YS5tYW5kYXRvcnlfaWYgIT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLm1lbmRldG9yeUlmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy9kaXNhYmxlIGlmIGhhbmRsaW5nXHJcbiAgICAgICAgICAgICAgICAgIGlmKChkYXRhLmRpc2FibGVfaWYgJiYgZGF0YS5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZGF0YS5kaXNhYmxlX29uX3VwZGF0ZSAmJiBkYXRhLmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGRhdGEuZGlzYWJsZV9vbl9hZGQgJiYgZGF0YS5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25jZS5kaXNhYmxlSWZGaWVsZExpc3QucHVzaChtb2RpZnlEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50LnR5cGUgPT0gJ2xpc3Rfb2ZfZmllbGRzJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RGF0YS5pc19tYW5kYXRvcnk9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lICYmIGRhdGEuZmllbGRfbmFtZSAhPSAnJyAmJiBlbGVtZW50LmRhdGF0eXBlICE9IFwibGlzdF9vZl9vYmplY3Rfd2l0aF9wb3B1cFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gJiYgZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbl9wYXJhbSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNhbGN1bGF0aW9uRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKGxpc3Rfb2ZfZmllbGRzLCBtb2RpZnlEYXRhLCBbXSwgXCJsaXN0XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNoZWNrQm94RmllbGRMaXN0VmFsdWUucHVzaChtb2RpZnlEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChsaXN0X29mX2ZpZWxkcywgbW9kaWZ5RGF0YSwgZmFsc2UsIFwiY2hlY2tib3hcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZGF0YXR5cGUgPT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzICYmIGRhdGEuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZXRjX2ZpZWxkcy5taW5EYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzLm1pbkRhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbkRhdGUuc2V0RGF0ZShuZXcgRGF0ZSgpLmdldERhdGUoKSAtIE51bWJlcihkYXRhLmV0Y19maWVsZHMubWluRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzICYmIGRhdGEuZXRjX2ZpZWxkcyAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZXRjX2ZpZWxkcy5tYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5ldGNfZmllbGRzLm1heERhdGUgPT0gJy0xJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgKyAyNSwgMTEsIDMxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEYXRlLnNldERhdGUobmV3IERhdGUoKS5nZXREYXRlKCkgKyBOdW1iZXIoZGF0YS5ldGNfZmllbGRzLm1heERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoY3VycmVudFllYXIgLSAxMDAsIDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyICsgMjUsIDExLCAzMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnbWluRGF0ZSddID0gdGhpcy5taW5EYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ21heERhdGUnXSA9IHRoaXMubWF4RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChsaXN0X29mX2ZpZWxkcywgbW9kaWZ5RGF0YSwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wobGlzdF9vZl9maWVsZHMsIG1vZGlmeURhdGEsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuZmllbGRfY2xhc3MgPSB0aGlzLmNvbW1vbkZ1bmN0aW9uU2VydmljZS5nZXREaXZDbGFzcyhkYXRhLCh0YWJsZUZpZWxkcy5sZW5ndGggKyBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIGxpc3Rfb2ZfZmllbGRzLCBcImdyb3VwXCIpXHJcbiAgICAgICAgICAgIC8vIGlmKGVsZW1lbnQudHlwZSA9PSAnbGlzdF9vZl9maWVsZHMnKXtcclxuICAgICAgICAgICAgLy8gICB0aGlzLmxpc3Rfb2ZfZmllbGRzLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAvLyBjYXNlICdodG1sX3ZpZXcnOlxyXG4gICAgICAgICAgLy8gICBjb25zdCBmaWVsZCA9IHtcclxuICAgICAgICAgIC8vICAgICBmaWVsZF9uYW1lIDogJ2h0bWxfdmlld18xJ1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgLy8gICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzdGVwcGVyXCI6XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQubGlzdF9vZl9maWVsZHMgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoc3RlcC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcHBlcl9vZl9maWVsZHMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChkYXRhOmFueSkgPT57XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmeURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlEYXRhLnBhcmVudCA9IHN0ZXAuZmllbGRfbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAvL3Nob3cgaWYgaGFuZGxpbmdcclxuICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnNob3dfaWYgJiYgZGF0YS5zaG93X2lmICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnNob3dJZkZpZWxkTGlzdC5wdXNoKG1vZGlmeURhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL21lbmRldG9yeSBpZiBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGEubWFuZGF0b3J5X2lmICYmIGRhdGEubWFuZGF0b3J5X2lmICE9ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLm1lbmRldG9yeUlmRmllbGRMaXN0LnB1c2gobW9kaWZ5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZGlzYWJsZSBpZiBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKChkYXRhLmRpc2FibGVfaWYgJiYgZGF0YS5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZGF0YS5kaXNhYmxlX29uX3VwZGF0ZSAmJiBkYXRhLmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGRhdGEuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGRhdGEuZGlzYWJsZV9vbl9hZGQgJiYgZGF0YS5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBkYXRhLmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmRpc2FibGVJZkZpZWxkTGlzdC5wdXNoKG1vZGlmeURhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gJiYgZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbl9wYXJhbSAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLmNhbGN1bGF0aW9uRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHN0ZXBwZXJfb2ZfZmllbGRzLCBtb2RpZnlEYXRhLCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS50cmVlX3ZpZXdfb2JqZWN0ICYmIGRhdGEudHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRyZWVNb2RpZnlEYXRhLmlzX21hbmRhdG9yeT1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woc3RlcHBlcl9vZl9maWVsZHMsIHRyZWVNb2RpZnlEYXRhICwgJycsIFwidGV4dFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgc3RlcCwgc3RlcHBlcl9vZl9maWVsZHMsIFwiZ3JvdXBcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXNwb25jZS5pc1N0ZXBwZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcInBkZl92aWV3XCIgOlxyXG4gICAgICAgICAgICBpZihzZWxlY3RlZFJvd0luZGV4ICYmIHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gZWxlbWVudHNbc2VsZWN0ZWRSb3dJbmRleF07XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2Uuc3RhdGljTW9kYWwucHVzaCh0aGlzLmFwaUNhbGxTZXJ2aWNlLmdldFBheWxvZFdpdGhDcml0ZXJpYShlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMsZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLG9iamVjdCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImlucHV0X3dpdGhfdXBsb2FkZmlsZVwiOlxyXG4gICAgICAgICAgICBlbGVtZW50LmlzX2Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbChyZXNwb25jZS5mb3JDb250cm9sLCBlbGVtZW50LCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcImdyaWRfc2VsZWN0aW9uXCI6XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5ncmlkQ29sdW1ucyAmJiBlbGVtZW50LmdyaWRDb2x1bW5zLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGxldCBjb2xQYXJGaWVsZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xyXG4gICAgICAgICAgICAgIGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ10gPSBbXTtcclxuICAgICAgICAgICAgICBlbGVtZW50LmdyaWRDb2x1bW5zLmZvckVhY2goKGNvbEZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoY29sRmllbGQgJiYgY29sRmllbGQuaXNfbWFuZGF0b3J5KXtcclxuICAgICAgICAgICAgICAgICAgY29sUGFyRmllbGRbJ21lbmRldG9yeV9maWVsZHMnXS5wdXNoKGNvbEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBpZihjb2xQYXJGaWVsZCAmJiBjb2xQYXJGaWVsZFsnbWVuZGV0b3J5X2ZpZWxkcyddICYmIGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ10ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICByZXNwb25jZS5ncmlkU2VsZWN0aW9uTWVuZGV0b3J5TGlzdC5wdXNoKGNvbFBhckZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ21lbmRldG9yeV9maWVsZHMnXSA9IGNvbFBhckZpZWxkWydtZW5kZXRvcnlfZmllbGRzJ107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLnNob3dHcmlkRGF0YVtlbGVtZW50LmZpZWxkX25hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuYWRkTmV3QnV0dG9uSWYgJiYgZWxlbWVudC5hZGROZXdCdXR0b25JZiAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgZWxlbWVudFsnZmllbGRJbmRleCddID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgcmVzcG9uY2UuYnV0dG9uSWZMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudFsnc2hvd0J1dHRvbiddID0gdGhpcy5jaGVja0dyaWRTZWxlY3Rpb25CdXR0b25Db25kaXRpb24oZWxlbWVudCwnYWRkJyx7fSx7fSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwidHJlZV92aWV3XCI6XHJcbiAgICAgICAgICAgIC8vIHRoaXMudHJlZUNvbnRyb2xbZWxlbWVudC5maWVsZF9uYW1lXSA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8VG9kb0l0ZW1GbGF0Tm9kZT4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2VbZWxlbWVudC5maWVsZF9uYW1lXSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbFtlbGVtZW50LmZpZWxkX25hbWVdLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsICcnLCBcInRleHRcIik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kZWZhdWx0VmFsdWUgJiYgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LmRlZmF1bHRWYWx1ZSAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsIHZhbHVlLCBcInRleHRcIik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgZWxlbWVudCwgJycsIFwidGV4dFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC50cmVlX3ZpZXdfb2JqZWN0ICYmIGVsZW1lbnQudHJlZV92aWV3X29iamVjdC5maWVsZF9uYW1lICE9IFwiXCIpe1xyXG4gICAgICAgICAgbGV0IHRyZWVNb2RpZnlEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50LnRyZWVfdmlld19vYmplY3QpKTtcclxuICAgICAgICAgIHRyZWVNb2RpZnlEYXRhLmlzX21hbmRhdG9yeT1mYWxzZTtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2wocmVzcG9uY2UuZm9yQ29udHJvbCwgdHJlZU1vZGlmeURhdGEgLCAnJywgXCJ0ZXh0XCIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vc2hvdyBpZiBoYW5kbGluZ1xyXG4gICAgICBpZihlbGVtZW50LnNob3dfaWYgJiYgZWxlbWVudC5zaG93X2lmICE9ICcnKXtcclxuICAgICAgICByZXNwb25jZS5zaG93SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvL21lbmRhdG9yeSBpZiBoYW5kbGluZ1xyXG4gICAgICBpZihlbGVtZW50Lm1hbmRhdG9yeV9pZiAmJiBlbGVtZW50Lm1hbmRhdG9yeV9pZiAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UubWVuZGV0b3J5SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvL0N1c3RvbXZhbGlkYXRpb24gaGFuZGxpbmdcclxuICAgICAgaWYoZWxlbWVudC5jb21wYXJlRmllbGROYW1lICYmIGVsZW1lbnQuY29tcGFyZUZpZWxkTmFtZSAhPSAnJyl7XHJcbiAgICAgICAgcmVzcG9uY2UuY3VzdG9tVmFsaWRhdGlvbkZpZWxzLnB1c2goZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgLy9kaXNhYmxlIGlmIGhhbmRsaW5nXHJcbiAgICAgIGlmKChlbGVtZW50LmRpc2FibGVfaWYgJiYgZWxlbWVudC5kaXNhYmxlX2lmICE9ICcnKSB8fCAoZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAmJiBlbGVtZW50LmRpc2FibGVfb25fdXBkYXRlICE9ICcnICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gdW5kZWZpbmVkICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gbnVsbCkgfHwgKGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgJiYgZWxlbWVudC5kaXNhYmxlX29uX2FkZCAhPSAnJyAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9IHVuZGVmaW5lZCAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9IG51bGwpKXtcclxuICAgICAgICByZXNwb25jZS5kaXNhYmxlSWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvbkNoYW5nZSBoYW5kbGluZ1xyXG4gICAgICBpZiAoZWxlbWVudC5vbmNoYW5nZV9mdW5jdGlvbiAmJiBlbGVtZW50Lm9uY2hhbmdlX2Z1bmN0aW9uX3BhcmFtICYmIGVsZW1lbnQub25jaGFuZ2VfZnVuY3Rpb25fcGFyYW0gIT0gXCJcIil7XHJcbiAgICAgICAgcmVzcG9uY2UuY2FsY3VsYXRpb25GaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICBlbGVtZW50LmZpZWxkX2NsYXNzID0gdGhpcy5jb21tb25GdW5jdGlvblNlcnZpY2UuZ2V0RGl2Q2xhc3MoZWxlbWVudCx0YWJsZUZpZWxkcy5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgaWYoZm9ybUZpZWxkQnV0dG9ucyAmJiBmb3JtRmllbGRCdXR0b25zLmxlbmd0aCA+IDApe1xyXG4gICAgICBmb3JtRmllbGRCdXR0b25zLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYoZWxlbWVudC5maWVsZF9uYW1lICYmIGVsZW1lbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKHJlc3BvbmNlLmZvckNvbnRyb2wsIGVsZW1lbnQsICcnLCBcInRleHRcIilcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC5zaG93X2lmICYmIGVsZW1lbnQuc2hvd19pZiAhPSAnJyl7XHJcbiAgICAgICAgICByZXNwb25jZS5zaG93SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZWxlbWVudC5tYW5kYXRvcnlfaWYgJiYgZWxlbWVudC5tYW5kYXRvcnlfaWYgIT0gJycpe1xyXG4gICAgICAgICAgcmVzcG9uY2UubWVuZGV0b3J5SWZGaWVsZExpc3QucHVzaChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKGVsZW1lbnQuZGlzYWJsZV9pZiAmJiBlbGVtZW50LmRpc2FibGVfaWYgIT0gJycpIHx8IChlbGVtZW50LmRpc2FibGVfb25fdXBkYXRlICYmIGVsZW1lbnQuZGlzYWJsZV9vbl91cGRhdGUgIT0gJycgJiYgZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5kaXNhYmxlX29uX3VwZGF0ZSAhPSBudWxsKSB8fCAoZWxlbWVudC5kaXNhYmxlX29uX2FkZCAmJiBlbGVtZW50LmRpc2FibGVfb25fYWRkICE9ICcnICYmIGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgIT0gdW5kZWZpbmVkICYmIGVsZW1lbnQuZGlzYWJsZV9vbl9hZGQgIT0gbnVsbCkpe1xyXG4gICAgICAgICAgcmVzcG9uY2UuZGlzYWJsZUlmRmllbGRMaXN0LnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgY2hlY2tGaWVsZEJ1dHRvbkNvbmRpdGlvbih0YWJsZUZpZWxkczphbnkpe1xyXG4gICAgbGV0IHJlc3BvbmNlOmFueT17XHJcbiAgICAgIHRlbXBWYWw6e31cclxuICAgIH1cclxuICAgIHRhYmxlRmllbGRzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ2xpc3Rfb2Zfb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImxpc3Rfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgY2FzZSBcImdyb3VwX29mX2ZpZWxkc1wiOlxyXG4gICAgICAgICAgaWYoZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoY2hpbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYoY2hpbGQgJiYgY2hpbGQgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSBcInR5cGVhaGVhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kYXRhdHlwZSA9PSAnbGlzdF9vZl9vYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW2VsZW1lbnQuZmllbGRfbmFtZSArICdfJyArIGNoaWxkLmZpZWxkX25hbWUgKyBcIl9hZGRfYnV0dG9uXCJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBWYWxbZWxlbWVudC5maWVsZF9uYW1lICsgJ18nICsgY2hpbGQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgICAgaWYoZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSB1bmRlZmluZWQgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoc3RlcDphbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICE9IHVuZGVmaW5lZCAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzICE9IG51bGwgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIHN0ZXAubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoY2hpbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0eXBlYWhlYWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kYXRhdHlwZSA9PSAnbGlzdF9vZl9vYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmNlLnRlbXBWYWxbc3RlcC5maWVsZF9uYW1lICsgJ18nICsgY2hpbGQuZmllbGRfbmFtZSArIFwiX2FkZF9idXR0b25cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rfb2Zfc3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZS50ZW1wVmFsW3N0ZXAuZmllbGRfbmFtZSArICdfJyArIGNoaWxkLmZpZWxkX25hbWUgKyBcIl9hZGRfYnV0dG9uXCJdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIHVwZGF0ZVNlbGVjdENvbnRhY3Qoc2VsZWN0Q29udGFjdDphbnksdGFiRmlsdGVyRGF0YTphbnksdGFibGVGaWVsZHM6YW55LHRlbXBsYXRlRm9ybTpVbnR5cGVkRm9ybUdyb3VwLGZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhOmFueSxzdGF0aWNNb2RhbDphbnkpe1xyXG4gICAgbGV0IGFjY291bnQ9e307XHJcbiAgICBsZXQgY29udGFjdD17fTtcclxuICAgIGxldCBwYXlsb2FkOmFueSA9IHt9O1xyXG4gICAgbGV0IHNlbGVjdENvbnRhY3RPYmplY3Q6YW55ID0ge307XHJcbiAgICBpZihzZWxlY3RDb250YWN0KXtcclxuICAgICAgc2VsZWN0Q29udGFjdE9iamVjdCA9IHNlbGVjdENvbnRhY3Q7XHJcbiAgICB9XHJcbiAgICBpZih0YWJGaWx0ZXJEYXRhICYmIHRhYkZpbHRlckRhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRhYkZpbHRlckRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuX2lkKXtcclxuICAgICAgICAgIGlmKGVsZW1lbnQuX2lkID09IHNlbGVjdENvbnRhY3Qpe1xyXG4gICAgICAgICAgICBzZWxlY3RDb250YWN0T2JqZWN0ID0gZWxlbWVudDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYoc2VsZWN0Q29udGFjdE9iamVjdCl7XHJcbiAgICAgIGlmKHNlbGVjdENvbnRhY3RPYmplY3RbJ19pZCddKXtcclxuICAgICAgICBjb250YWN0ID0ge1xyXG4gICAgICAgICAgXCJfaWRcIjpzZWxlY3RDb250YWN0T2JqZWN0WydfaWQnXSxcclxuICAgICAgICAgIFwibmFtZVwiOnNlbGVjdENvbnRhY3RPYmplY3RbJ25hbWUnXSxcclxuICAgICAgICAgIFwiY29kZVwiOnNlbGVjdENvbnRhY3RPYmplY3RbJ3NlcmlhbElkJ11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoc2VsZWN0Q29udGFjdE9iamVjdFsnbGVhZCddKXtcclxuICAgICAgICBhY2NvdW50ID0gc2VsZWN0Q29udGFjdE9iamVjdFsnbGVhZCddO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZih0YWJsZUZpZWxkcyAmJiB0YWJsZUZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgdGFibGVGaWVsZHMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQuZmllbGRfbmFtZSAmJiBlbGVtZW50LmZpZWxkX25hbWUgIT0gJycpe1xyXG4gICAgICAgICAgbGV0IGZpZWxkTmFtZSA9IGVsZW1lbnQuZmllbGRfbmFtZTtcclxuICAgICAgICAgIGlmKGZpZWxkTmFtZSA9PSAnYWNjb3VudCcpe1xyXG4gICAgICAgICAgICBpZihhY2NvdW50ICYmIE9iamVjdC5rZXlzKGFjY291bnQpLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1snYWNjb3VudCddLnNldFZhbHVlKGFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWVsZW1lbnQuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcywgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpID49IDAgfHwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJRVE1QXCIpID49IDApe1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2gocGF5bG9hZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuZmllbGRfbmFtZSA9PSAnY29udGFjdCcpe1xyXG4gICAgICAgICAgICBpZihjb250YWN0ICYmIE9iamVjdC5rZXlzKGNvbnRhY3QpLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1snY29udGFjdCddLnNldFZhbHVlKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWVsZW1lbnQuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtcywgZWxlbWVudC5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGVsZW1lbnQub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJGT1JNX0dST1VQXCIpID49IDAgfHwgZWxlbWVudC5vbmNoYW5nZV9hcGlfcGFyYW1zLmluZGV4T2YoXCJRVE1QXCIpID49IDApe1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHN0YXRpY01vZGFsLnB1c2gocGF5bG9hZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQudHlwZSA9PSAnc3RlcHBlcicgJiYgZWxlbWVudC5saXN0X29mX2ZpZWxkcyAmJiBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXBEYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKHN0ZXBEYXRhICYmIHN0ZXBEYXRhLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXBEYXRhLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgc3RlcERhdGEubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkTmFtZSA9IHN0ZXBEYXRhLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZmllbGRfbmFtZSA9PSAnYWNjb3VudCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICg8VW50eXBlZEZvcm1Hcm91cD50ZW1wbGF0ZUZvcm0uY29udHJvbHNbZmllbGROYW1lXSkuY29udHJvbHNbJ2FjY291bnQnXS5zZXRWYWx1ZShhY2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMudGVtcGxhdGVGb3JtLmdldChzdGVwRGF0YS5maWVsZF9uYW1lKS5nZXQoJ2FjY291bnQnKS5zZXRWYWx1ZShhY2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zICYmIGRhdGEub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkICYmICFkYXRhLmRvX25vdF9hdXRvX3RyaWdnZXJfb25fZWRpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRoaXMuYXBpQ2FsbFNlcnZpY2UuZ2V0UGF5bG9kV2l0aENyaXRlcmlhKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcywgZGF0YS5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQsIGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtc19jcml0ZXJpYSwgZm9ybVZhbHVlV2l0aEN1c3RvbURhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZihcIkZPUk1fR1JPVVBcIikgPj0gMCB8fCBkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMuaW5kZXhPZihcIlFUTVBcIikgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRbXCJkYXRhXCJdPWZvcm1WYWx1ZVdpdGhDdXN0b21EYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGljTW9kYWwucHVzaChwYXlsb2FkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYoZGF0YS5maWVsZF9uYW1lID09ICdjb250YWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZE5hbWVdKS5jb250cm9sc1snY29udGFjdCddLnNldFZhbHVlKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm9uY2hhbmdlX2FwaV9wYXJhbXMgJiYgZGF0YS5vbmNoYW5nZV9jYWxsX2JhY2tfZmllbGQgJiYgIWRhdGEuZG9fbm90X2F1dG9fdHJpZ2dlcl9vbl9lZGl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gdGhpcy5hcGlDYWxsU2VydmljZS5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zLCBkYXRhLm9uY2hhbmdlX2NhbGxfYmFja19maWVsZCwgZGF0YS5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBmb3JtVmFsdWVXaXRoQ3VzdG9tRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKFwiRk9STV9HUk9VUFwiKSA+PSAwIHx8IGRhdGEub25jaGFuZ2VfYXBpX3BhcmFtcy5pbmRleE9mKFwiUVRNUFwiKSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtcImRhdGFcIl09Zm9ybVZhbHVlV2l0aEN1c3RvbURhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNNb2RhbC5wdXNoKHBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YXRpY01vZGFsO1xyXG4gIH1cclxuICBjaGVja0dyaWRTZWxlY3Rpb25CdXR0b25Db25kaXRpb24oZmllbGQ6YW55LGJ1dHRvbjphbnksc2VsZWN0ZWRSb3c6YW55LGZvcm1WYWx1ZTphbnkpe1xyXG4gICAgbGV0IGNoZWNrOmFueSA9IHRydWU7XHJcbiAgICBzd2l0Y2ggKGJ1dHRvbikge1xyXG4gICAgICBjYXNlICdhZGQnOlxyXG4gICAgICAgIGlmKGZpZWxkICYmIGZpZWxkLmFkZE5ld0J1dHRvbklmICYmIGZpZWxkLmFkZE5ld0J1dHRvbklmICE9ICcnKXtcclxuICAgICAgICAgIGxldCBtb2RpZnllZEZpZWxkOmFueSA9IHt9O1xyXG4gICAgICAgICAgbW9kaWZ5ZWRGaWVsZFsnc2hvd19pZiddID0gZmllbGQuYWRkTmV3QnV0dG9uSWY7XHJcbiAgICAgICAgICBjaGVjayA9IHRoaXMuY2hlY2tpZlNlcnZpY2UuY2hlY2tTaG93SWYobW9kaWZ5ZWRGaWVsZCxzZWxlY3RlZFJvdyxmb3JtVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVjaztcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHREYXRlKGVsZW1lbnQ6YW55KXtcclxuICAgIGxldCB2YWx1ZTphbnkgPSBcIlwiO1xyXG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRvZGF5LnNldEhvdXJzKDAsMCwwLDApO1xyXG4gICAgbGV0IHllc3RlcmRheSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIHllc3RlcmRheS5zZXREYXRlKHllc3RlcmRheS5nZXREYXRlKCkgLSAxKTtcclxuICAgIHllc3RlcmRheS5zZXRIb3VycygwLDAsMCwwKTtcclxuICAgIHN3aXRjaCAoZWxlbWVudC5kZWZhdWx0VmFsdWUpIHtcclxuICAgICAgY2FzZSBcIlRvZGF5XCI6XHJcbiAgICAgICAgdmFsdWUgPSB0b2RheTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlllc3RlcmRheVwiOlxyXG4gICAgICAgIHZhbHVlID0geWVzdGVyZGF5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBnZXRGb2N1c0ZpZWxkKHByZXZpb3VzRm9ybUZvY3VzRmllbGQ6YW55LHRhYmxlRmllbGRzOmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCxmb2N1c0ZpZWxkUGFyZW50OmFueSxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2U6YW55PXtcclxuICAgICAgY2hlY2tGb3JtRmllbGRBdXRmb2N1czpjaGVja0Zvcm1GaWVsZEF1dGZvY3VzLFxyXG4gICAgICBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkOnByZXZpb3VzRm9ybUZvY3VzRmllbGQsXHJcbiAgICAgIGZvY3VzRmllbGRQYXJlbnQ6Zm9jdXNGaWVsZFBhcmVudCxcclxuICAgICAgaWQ6XCJcIlxyXG4gICAgfVxyXG4gICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCAmJiBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkLl9pZCl7XHJcbiAgICAgIHJlc3BvbmNlID0gdGhpcy5mb2N1c0ZpZWxkKFwiXCIscHJldmlvdXNGb3JtRm9jdXNGaWVsZCx0ZW1wbGF0ZUZvcm0sZm9jdXNGaWVsZFBhcmVudCxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzLHByZXZpb3VzRm9ybUZvY3VzRmllbGQscmVzcG9uY2UpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCA9PSB1bmRlZmluZWQgfHwgcHJldmlvdXNGb3JtRm9jdXNGaWVsZC5faWQgPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0YWJsZUZpZWxkcykge1xyXG4gICAgICAgICAgaWYoa2V5LnR5cGUgPT0gXCJzdGVwcGVyXCIpe1xyXG4gICAgICAgICAgICBpZihrZXkubGlzdF9vZl9maWVsZHMgJiYga2V5Lmxpc3Rfb2ZfZmllbGRzICE9IG51bGwgJiYga2V5Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBrZXkubGlzdF9vZl9maWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIGlmKHN0ZXAubGlzdF9vZl9maWVsZHMgJiYgc3RlcC5saXN0X29mX2ZpZWxkcyAhPSBudWxsICYmIHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc3RlcC5saXN0X29mX2ZpZWxkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZF9uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25jZSA9IHRoaXMuZm9jdXNGaWVsZChzdGVwLGZpZWxkLHRlbXBsYXRlRm9ybSxmb2N1c0ZpZWxkUGFyZW50LGNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMscHJldmlvdXNGb3JtRm9jdXNGaWVsZCxyZXNwb25jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmIChrZXkuZmllbGRfbmFtZSkge1xyXG4gICAgICAgICAgICBpZihrZXkudHlwZSA9PSAndGV4dCcpe1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlID0gdGhpcy5mb2N1c0ZpZWxkKFwiXCIsa2V5LHRlbXBsYXRlRm9ybSxmb2N1c0ZpZWxkUGFyZW50LGNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMscHJldmlvdXNGb3JtRm9jdXNGaWVsZCxyZXNwb25jZSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHJlc3BvbmNlLmNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuICBmb2N1c0ZpZWxkKHBhcmVudDphbnksa2V5OmFueSx0ZW1wbGF0ZUZvcm06VW50eXBlZEZvcm1Hcm91cCxmb2N1c0ZpZWxkUGFyZW50OmFueSxjaGVja0Zvcm1GaWVsZEF1dGZvY3VzOmFueSxwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkOmFueSxyZXNwb25jZTphbnkpe1xyXG4gICAgcmVzcG9uY2UuaWQgPSBrZXkuX2lkICsgXCJfXCIgKyBrZXkuZmllbGRfbmFtZTtcclxuICAgIGxldCBmaWVsZDphbnkgPSB7fTtcclxuICAgIGlmKHBhcmVudCA9PSAnJyl7XHJcbiAgICAgIGlmKGZvY3VzRmllbGRQYXJlbnQgJiYgZm9jdXNGaWVsZFBhcmVudC5maWVsZF9uYW1lICYmIGZvY3VzRmllbGRQYXJlbnQuZmllbGRfbmFtZSAhPSAnJyl7XHJcbiAgICAgICAgcGFyZW50ID0gZm9jdXNGaWVsZFBhcmVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYocGFyZW50ICE9IFwiXCIpe1xyXG4gICAgICBmaWVsZCA9ICg8VW50eXBlZEZvcm1Hcm91cD50ZW1wbGF0ZUZvcm0uY29udHJvbHNbcGFyZW50LmZpZWxkX25hbWVdKS5jb250cm9sc1trZXkuZmllbGRfbmFtZV07XHJcbiAgICB9ZWxzZXtcclxuICAgICAgZmllbGQgPSB0ZW1wbGF0ZUZvcm0uY29udHJvbHNba2V5LmZpZWxkX25hbWVdO1xyXG4gICAgfVxyXG4gICAgaWYoZmllbGQgJiYgZmllbGQudG91Y2hlZCl7XHJcbiAgICAgIHJlc3BvbmNlLmNoZWNrRm9ybUZpZWxkQXV0Zm9jdXMgPSBmYWxzZTtcclxuICAgICAgaWYocHJldmlvdXNGb3JtRm9jdXNGaWVsZCAmJiBwcmV2aW91c0Zvcm1Gb2N1c0ZpZWxkLl9pZCl7XHJcbiAgICAgICAgcmVzcG9uY2UucHJldmlvdXNGb3JtRm9jdXNGaWVsZCA9IHt9O1xyXG4gICAgICAgIHJlc3BvbmNlLmZvY3VzRmllbGRQYXJlbnQ9e307XHJcbiAgICAgIH1cclxuICAgIH1lbHNlIGlmKGZpZWxkID09IHVuZGVmaW5lZCl7XHJcbiAgICAgIHJlc3BvbmNlLnByZXZpb3VzRm9ybUZvY3VzRmllbGQgPSB7fTtcclxuICAgICAgcmVzcG9uY2UuZm9jdXNGaWVsZFBhcmVudD17fTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25jZTtcclxuICB9XHJcbiAgZ2V0RG9ub3RSZXNldEZpZWxkcyh0YWJsZUZpZWxkczphbnksZG9ub3RSZXNldEZpZWxkTGlzdHM6YW55LEZvcm1WYWx1ZTphbnkpe1xyXG4gICAgdGFibGVGaWVsZHMuZm9yRWFjaCgodGFibGVmaWVsZDphbnkpID0+IHtcclxuICAgICAgaWYodGFibGVmaWVsZC5kb19ub3RfcmVmcmVzaF9vbl9hZGQgJiYgdGFibGVmaWVsZC50eXBlICE9IFwibGlzdF9vZl9maWVsZHNcIiAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJncm91cF9vZl9maWVsZHNcIiAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJzdGVwcGVyXCIpe1xyXG4gICAgICAgIGRvbm90UmVzZXRGaWVsZExpc3RzW3RhYmxlZmllbGQuZmllbGRfbmFtZV0gPSBGb3JtVmFsdWVbdGFibGVmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgfWVsc2UgaWYodGFibGVmaWVsZC50eXBlID09IFwiZ3JvdXBfb2ZfZmllbGRzXCIpe1xyXG4gICAgICAgIGlmKHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMgJiYgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMuZm9yRWFjaCgoZmllbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCl7XHJcbiAgICAgICAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbdGFibGVmaWVsZC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVt0YWJsZWZpZWxkLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNlIGlmKHRhYmxlZmllbGQudHlwZSA9PSBcInN0ZXBwZXJcIil7XHJcbiAgICAgICAgaWYodGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcyAmJiB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChzdGVwOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgc3RlcC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCl7XHJcbiAgICAgICAgICAgICAgICAgIGRvbm90UmVzZXRGaWVsZExpc3RzW3N0ZXAuZmllbGRfbmFtZV1bZmllbGQuZmllbGRfbmFtZV0gPSBGb3JtVmFsdWVbc3RlcC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkb25vdFJlc2V0RmllbGRMaXN0cztcclxuICB9XHJcbiAgYWRkTmV3Rm9ybShzZWxlY3RUYWJJbmRleDpudW1iZXIsaXNCdWxrVXBkYXRlOmJvb2xlYW4sYnVsa3VwbG9hZExpc3Q6YW55LHNlbGVjdGVkUm93SW5kZXg6bnVtYmVyLGZvcm1OYW1lOnN0cmluZyxzZWxlY3RDb250YWN0QWRkOmFueSl7XHJcbiAgICBsZXQgZm9ybURhdGE6YW55ID0ge31cclxuICAgIGZvcm1EYXRhWyd0YWJJbmRleCddID0gc2VsZWN0VGFiSW5kZXg7XHJcbiAgICBmb3JtRGF0YVsnYnVsa1VwZGF0ZSddID0gaXNCdWxrVXBkYXRlO1xyXG4gICAgZm9ybURhdGFbJ2J1bGtEYXRhTGlzdCddID0gYnVsa3VwbG9hZExpc3Q7XHJcbiAgICBmb3JtRGF0YVsnZWRpdGVkUm93SW5kZXgnXSA9IHNlbGVjdGVkUm93SW5kZXg7XHJcbiAgICBmb3JtRGF0YVsnZm9ybU5hbWUnXSA9IGZvcm1OYW1lO1xyXG4gICAgZm9ybURhdGFbJ3NlbGVjdENvbnRhY3QnXSA9IHNlbGVjdENvbnRhY3RBZGQ7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKCdmb3JtLW1vZGFsJyxmb3JtRGF0YSlcclxuICB9XHJcbiAgZ2V0RmllbGRzRnJvbUZvcm1zKHRhYjphbnksZm9ybU5hbWU6c3RyaW5nLGRpbmFtaWNfZm9ybTphbnksZ3JpZEJ1dHRvbnM6YW55LHRhYmxlRmllbGRzOmFueSxhY3Rpb25CdXR0b25zOmFueSl7XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIFwiZmllbGRzXCIgOiB0YWJsZUZpZWxkcyxcclxuICAgICAgXCJidXR0b25zXCIgOiBhY3Rpb25CdXR0b25zXHJcbiAgICB9XHJcbiAgICBsZXQgZm9ybSA9IG51bGw7XHJcbiAgICBpZihmb3JtTmFtZSAhPSAnRElOQU1JQ19GT1JNJyAmJiB0YWIgJiYgdGFiLmZvcm1zKXtcclxuICAgICAgZm9ybSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldEZvcm0odGFiLmZvcm1zLGZvcm1OYW1lLGdyaWRCdXR0b25zKTtcclxuICAgIH1lbHNlIGlmKGZvcm1OYW1lID09ICdESU5BTUlDX0ZPUk0nKXtcclxuICAgICAgZm9ybSA9IGRpbmFtaWNfZm9ybTtcclxuICAgIH1lbHNle1xyXG4gICAgICBmb3JtID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYoZm9ybSAhPSBudWxsKXtcclxuICAgICAgaWYoZm9ybT8uWyd0YWJsZUZpZWxkcyddICYmIGZvcm0/LlsndGFibGVGaWVsZHMnXT8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmVzcG9uY2UuZmllbGRzID0gZm9ybVsndGFibGVGaWVsZHMnXTtcclxuICAgICAgfVxyXG4gICAgICBpZihmb3JtPy5bJ3RhYl9saXN0X2J1dHRvbnMnXSAmJiBmb3JtPy5bJ3RhYl9saXN0X2J1dHRvbnMnXT8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmVzcG9uY2UuYnV0dG9ucyA9IGZvcm1bJ3RhYl9saXN0X2J1dHRvbnMnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbmNlO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|