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.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,1277 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../services/storage/storage.service";
4
+ import * as i2 from "../model/model.service";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "../api/api.service";
7
+ import * as i5 from "../common-utils/core-function/core-function.service";
8
+ import * as i6 from "../env/env.service";
9
+ import * as i7 from "../notify/notification.service";
10
+ export class CommonFunctionService {
11
+ constructor(storageService, modalService, datePipe, apiService, coreFunctionService, envService, notificationService) {
12
+ this.storageService = storageService;
13
+ this.modalService = modalService;
14
+ this.datePipe = datePipe;
15
+ this.apiService = apiService;
16
+ this.coreFunctionService = coreFunctionService;
17
+ this.envService = envService;
18
+ this.notificationService = notificationService;
19
+ this.userInfo = this.storageService.GetUserInfo();
20
+ }
21
+ getRefcode() {
22
+ this.userInfo = this.storageService.GetUserInfo();
23
+ if (this.userInfo != null && this.userInfo != undefined && this.userInfo.refCode) {
24
+ return this.userInfo.refCode;
25
+ }
26
+ else {
27
+ return null;
28
+ }
29
+ }
30
+ getAppId() {
31
+ this.userInfo = this.storageService.GetUserInfo();
32
+ if (this.userInfo != null && this.userInfo != undefined && this.userInfo.appId) {
33
+ return this.userInfo.appId;
34
+ }
35
+ else {
36
+ return null;
37
+ }
38
+ }
39
+ getObjectValue(field, object) {
40
+ let result = object;
41
+ if (field && field != null && field != '' && field != " ") {
42
+ let list = field.split(".");
43
+ for (let index = 0; index < list.length; index++) {
44
+ result = result[list[index]];
45
+ if (result === null || result === undefined) {
46
+ return result;
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ return "";
52
+ }
53
+ getddnDisplayVal(val) {
54
+ if (val && val.name) {
55
+ return val.name;
56
+ }
57
+ else if (val && val.label) {
58
+ return val.label;
59
+ }
60
+ else if (val && val.field_name) {
61
+ return val.field_name;
62
+ }
63
+ else {
64
+ return val;
65
+ }
66
+ }
67
+ openTreeModal(fieldLabel, ddnField, modalName) {
68
+ const alertData = {
69
+ "event": true,
70
+ "fieldName": fieldLabel,
71
+ "ddnFieldName": ddnField
72
+ };
73
+ this.modalService.open(modalName, alertData);
74
+ }
75
+ dateFormat(value) {
76
+ return this.datePipe.transform(value, 'dd/MM/yyyy');
77
+ }
78
+ getDivClass(field, fieldsLangth) {
79
+ const fields = { ...field };
80
+ if (!fields.type) {
81
+ fields.type = "text";
82
+ }
83
+ if (fields.field_class && field.field_class != '') {
84
+ return fields.field_class;
85
+ }
86
+ switch (fields.type) {
87
+ case "list_of_checkbox":
88
+ case "list_of_fields":
89
+ case "html":
90
+ case "label":
91
+ case "grid_selection":
92
+ case "tabular_data_selector":
93
+ case "group_of_fields":
94
+ return "col-lg-12";
95
+ default:
96
+ if (fieldsLangth <= 5) {
97
+ return "col-lg-12";
98
+ }
99
+ else if (fieldsLangth <= 10) {
100
+ return "col-lg-6";
101
+ }
102
+ else {
103
+ return "col-lg-3";
104
+ }
105
+ }
106
+ }
107
+ getFixedDivClass(field, fieldsLangth) {
108
+ const fields = { ...field };
109
+ if (!fields.type) {
110
+ fields.type = "text";
111
+ }
112
+ if (fields.field_class && field.field_class != '') {
113
+ return fields.field_class;
114
+ }
115
+ }
116
+ getButtonDivClass(field) {
117
+ const fields = { ...field };
118
+ if (fields.field_class && field.field_class != '') {
119
+ return fields.field_class;
120
+ }
121
+ return;
122
+ }
123
+ getConvertedString(ja, incomingTemplate) {
124
+ let template = "" + incomingTemplate;
125
+ let reg = new RegExp("(\\[)(.*?)(\\])");
126
+ let matcher = template.match(reg);
127
+ let group = reg.exec(template);
128
+ console.log(matcher.groups);
129
+ let listMatches = [];
130
+ // while(matcher.find){
131
+ listMatches.push(matcher[2]);
132
+ // }
133
+ listMatches.forEach(element => {
134
+ let valueObj = null;
135
+ let details = matcher[2];
136
+ let valueString = this.getStringValue(details, ja);
137
+ template = template.replace("[" + matcher[2] + "]", valueString);
138
+ });
139
+ return template;
140
+ }
141
+ getStringValue(details, ja) {
142
+ //ja -> object
143
+ //deatils -> pattern
144
+ let valueConfig = details.split(",");
145
+ return this.getObjectValue(valueConfig[0], ja);
146
+ }
147
+ sanitizeObject(tableFields, formValue, validatField, formValueWithCust) {
148
+ for (let index = 0; index < tableFields.length; index++) {
149
+ const element = tableFields[index];
150
+ if (element && element.field_name) {
151
+ if (element.type != 'list_of_fields' && element.type != 'group_of_fields') {
152
+ if (element && element.datatype) {
153
+ switch (element.datatype.toLowerCase()) {
154
+ case "list_of_object":
155
+ case "list_of_object_with_popup":
156
+ case "chips":
157
+ case "chips_with_mask":
158
+ if (validatField) {
159
+ if (formValue[element.field_name] != "" && formValue[element.field_name] != null && !this.isArray(formValue[element.field_name])) {
160
+ return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
161
+ }
162
+ else if (this.applicableForValidation(element) && !this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length <= 0) {
163
+ return { 'msg': 'Please Enter ' + element.label + '. !!!' };
164
+ }
165
+ }
166
+ else if (formValue[element.field_name] == "" || !this.isArray(formValue[element.field_name])) {
167
+ formValue[element.field_name] = null;
168
+ }
169
+ break;
170
+ case "object":
171
+ if (validatField) {
172
+ if (formValue[element.field_name] != "" && formValue[element.field_name] != null && typeof formValue[element.field_name] != 'object') {
173
+ return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
174
+ }
175
+ else if (this.applicableForValidation(element) && typeof formValue[element.field_name] != 'object') {
176
+ return { 'msg': 'Please Enter ' + element.label + '. !!!' };
177
+ }
178
+ }
179
+ else if (formValue[element.field_name] == "" || (typeof formValue[element.field_name] != 'object' && element.type != 'date')) {
180
+ formValue[element.field_name] = null;
181
+ }
182
+ break;
183
+ default:
184
+ break;
185
+ }
186
+ }
187
+ }
188
+ if (element && element.type) {
189
+ switch (element.type.toLowerCase()) {
190
+ case "list_of_string":
191
+ if (validatField) {
192
+ if (formValue[element.field_name] != "" && formValue[element.field_name] != null) {
193
+ return { 'msg': 'Entered value for ' + element.label + ' is not valid. !!!' };
194
+ }
195
+ else if (this.applicableForValidation(element) && !this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length > 0) {
196
+ return { 'msg': 'Please Enter ' + element.label + '. !!!' };
197
+ }
198
+ }
199
+ else if (formValue[element.field_name] == "" || !this.isArray(formValue[element.field_name])) {
200
+ formValue[element.field_name] = null;
201
+ }
202
+ break;
203
+ case "number":
204
+ if (validatField) {
205
+ if (this.applicableForValidation(element) && formValue[element.field_name] < 0) {
206
+ return { 'msg': ' ' + element.label + ' should be greater than or equal 0. !!!' };
207
+ }
208
+ }
209
+ else if (!Number(formValue[element.field_name])) {
210
+ formValue[element.field_name] = 0;
211
+ }
212
+ break;
213
+ case "text":
214
+ case "textarea":
215
+ case "mobile":
216
+ case "email":
217
+ if (!validatField) {
218
+ if (formValue[element.field_name] == "" || formValue[element.field_name] == undefined) {
219
+ formValue[element.field_name] = null;
220
+ }
221
+ else if (typeof formValue[element.field_name] == "string") {
222
+ let value = this.coreFunctionService.removeSpaceFromString(formValue[element.field_name]);
223
+ if (value == "") {
224
+ formValue[element.field_name] = null;
225
+ }
226
+ else {
227
+ formValue[element.field_name] = value;
228
+ }
229
+ }
230
+ }
231
+ break;
232
+ case "list_of_fields":
233
+ if (validatField) {
234
+ if (this.applicableForValidation(element)) {
235
+ if (element.datatype != 'key_value') {
236
+ if (formValueWithCust[element.field_name] == null || !this.isArray(formValueWithCust[element.field_name]) || formValueWithCust[element.field_name].length <= 0) {
237
+ return { 'msg': element.label + ' is required.' };
238
+ }
239
+ }
240
+ else if (element.datatype == 'key_value') {
241
+ if (typeof formValueWithCust[element.field_name] != 'object' || Object.keys(formValueWithCust[element.field_name]).length <= 0) {
242
+ return { 'msg': element.label + ' is required.' };
243
+ }
244
+ }
245
+ }
246
+ }
247
+ else {
248
+ if (!this.isArray(formValue[element.field_name]) || formValue[element.field_name].length <= 0) {
249
+ if (formValue[element.field_name] != null) {
250
+ if (element.datatype == 'key_value' && typeof formValue[element.field_name] == 'object') {
251
+ const object = formValue[element.field_name];
252
+ const len = Object.keys(object).length;
253
+ if (len == 0) {
254
+ formValue[element.field_name] = null;
255
+ }
256
+ else if (object.key != undefined) {
257
+ if (object.key == '') {
258
+ formValue[element.field_name] = null;
259
+ }
260
+ }
261
+ }
262
+ if (element.datatype != 'key_value') {
263
+ formValue[element.field_name] = null;
264
+ }
265
+ }
266
+ }
267
+ else {
268
+ if (element.list_of_fields && element.list_of_fields) {
269
+ for (let j = 0; j < element.list_of_fields.length; j++) {
270
+ const data = element.list_of_fields[j];
271
+ if (data && data.datatype) {
272
+ switch (data.datatype.toLowerCase()) {
273
+ case "list_of_object":
274
+ case "chips":
275
+ case "chips_with_mask":
276
+ if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
277
+ formValue[element.field_name].forEach((fiedlList) => {
278
+ if (fiedlList[data.field_name] == "" || !this.isArray(fiedlList[data.field_name])) {
279
+ fiedlList[data.field_name] = null;
280
+ }
281
+ });
282
+ }
283
+ break;
284
+ case "object":
285
+ if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
286
+ formValue[element.field_name].forEach((fiedlList) => {
287
+ if (fiedlList[data.field_name] == "" || typeof fiedlList[data.field_name] != 'object') {
288
+ fiedlList[data.field_name] = null;
289
+ }
290
+ });
291
+ }
292
+ break;
293
+ default:
294
+ break;
295
+ }
296
+ }
297
+ if (data && data.type) {
298
+ switch (data.type.toLowerCase()) {
299
+ case "list_of_string":
300
+ if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
301
+ formValue[element.field_name].forEach((fiedlList) => {
302
+ if (fiedlList[data.field_name] == "" || !this.isArray(fiedlList[data.field_name])) {
303
+ fiedlList[data.field_name] = null;
304
+ }
305
+ });
306
+ }
307
+ break;
308
+ case "text":
309
+ case "textarea":
310
+ case "mobile":
311
+ case "email":
312
+ if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
313
+ formValue[element.field_name].forEach((fiedlList) => {
314
+ let value = fiedlList[data.field_name];
315
+ if (value == "") {
316
+ fiedlList[data.field_name] = null;
317
+ }
318
+ else {
319
+ value = this.coreFunctionService.removeSpaceFromString(fiedlList[data.field_name]);
320
+ fiedlList[data.field_name] = value;
321
+ }
322
+ });
323
+ }
324
+ break;
325
+ default:
326
+ if (formValue[element.field_name] && formValue[element.field_name].length > 0) {
327
+ formValue[element.field_name].forEach((fiedlList) => {
328
+ if (fiedlList[data.field_name] == "" || fiedlList[data.field_name] == undefined) {
329
+ fiedlList[data.field_name] = null;
330
+ }
331
+ });
332
+ }
333
+ break;
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+ }
340
+ break;
341
+ case "group_of_fields":
342
+ for (let j = 0; j < element.list_of_fields.length; j++) {
343
+ const data = element.list_of_fields[j];
344
+ if (data && data.datatype) {
345
+ switch (data.datatype.toLowerCase()) {
346
+ case "list_of_object":
347
+ case "chips":
348
+ case "chips_with_mask":
349
+ if (validatField) {
350
+ if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
351
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
352
+ }
353
+ else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
354
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
355
+ }
356
+ }
357
+ else if (formValue[element.field_name][data.field_name] == "" || !this.isArray(formValue[element.field_name][data.field_name])) {
358
+ formValue[element.field_name][data.field_name] = null;
359
+ }
360
+ break;
361
+ case "object":
362
+ if (validatField) {
363
+ if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
364
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
365
+ }
366
+ else if (this.applicableForValidation(data) && typeof formValue[element.field_name][data.field_name] != 'object') {
367
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
368
+ }
369
+ }
370
+ else if (formValue[element.field_name][data.field_name] == "" || typeof formValue[element.field_name][data.field_name] != 'object') {
371
+ formValue[element.field_name][data.field_name] = null;
372
+ }
373
+ break;
374
+ default:
375
+ break;
376
+ }
377
+ }
378
+ if (data && data.type) {
379
+ switch (data.type.toLowerCase()) {
380
+ case "list_of_string":
381
+ if (validatField) {
382
+ if (formValue[element.field_name][data.field_name] != "" && formValue[element.field_name][data.field_name] != null) {
383
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
384
+ }
385
+ else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
386
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
387
+ }
388
+ }
389
+ else if (formValue[element.field_name][data.field_name] == "" || !this.isArray(formValue[element.field_name][data.field_name])) {
390
+ formValue[element.field_name][data.field_name] = null;
391
+ }
392
+ break;
393
+ case "file":
394
+ if (!validatField) {
395
+ if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
396
+ formValue[element.field_name][data.field_name] = null;
397
+ }
398
+ }
399
+ break;
400
+ case "number":
401
+ if (!Number(formValue[element.field_name][data.field_name])) {
402
+ formValue[element.field_name][data.field_name] = 0;
403
+ }
404
+ break;
405
+ case "text":
406
+ case "textarea":
407
+ case "mobile":
408
+ case "email":
409
+ if (!validatField) {
410
+ if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
411
+ formValue[element.field_name][data.field_name] = null;
412
+ }
413
+ else if (typeof formValue[element.field_name][data.field_name] == "string") {
414
+ let value = formValue[element.field_name][data.field_name];
415
+ if (value == "") {
416
+ formValue[element.field_name][data.field_name] = null;
417
+ }
418
+ else {
419
+ value = this.coreFunctionService.removeSpaceFromString(formValue[element.field_name][data.field_name]);
420
+ formValue[element.field_name][data.field_name] = value;
421
+ }
422
+ }
423
+ }
424
+ break;
425
+ default:
426
+ if (formValue[element.field_name][data.field_name] == "" || formValue[element.field_name][data.field_name] == undefined) {
427
+ formValue[element.field_name][data.field_name] = null;
428
+ }
429
+ break;
430
+ }
431
+ }
432
+ }
433
+ break;
434
+ case "stepper":
435
+ for (let j = 0; j < element.list_of_fields.length; j++) {
436
+ const step = element.list_of_fields[j];
437
+ if (step.list_of_fields && step.list_of_fields != null && step.list_of_fields.length > 0) {
438
+ for (let k = 0; k < step.list_of_fields.length; k++) {
439
+ const data = step.list_of_fields[k];
440
+ switch (data.datatype) {
441
+ case "list_of_object":
442
+ case "chips":
443
+ case "chips_with_mask":
444
+ if (validatField) {
445
+ if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
446
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
447
+ }
448
+ else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
449
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
450
+ }
451
+ }
452
+ else if (formValue[data.field_name] == "" && !this.isArray(formValue[data.field_name])) {
453
+ formValue[data.field_name] = null;
454
+ }
455
+ break;
456
+ case "object":
457
+ if (validatField) {
458
+ if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
459
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
460
+ }
461
+ else if (this.applicableForValidation(data) && typeof formValue[data.field_name] != 'object') {
462
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
463
+ }
464
+ }
465
+ else if (formValue[data.field_name] == "" && typeof formValue[data.field_name] != 'object') {
466
+ formValue[data.field_name] = null;
467
+ }
468
+ break;
469
+ case "number":
470
+ if (!Number(formValue[data.field_name])) {
471
+ formValue[data.field_name] = 0;
472
+ }
473
+ break;
474
+ default:
475
+ break;
476
+ }
477
+ switch (data.type) {
478
+ case "list_of_string":
479
+ if (validatField) {
480
+ if (formValue[data.field_name] != "" && formValue[data.field_name] != null) {
481
+ return { 'msg': 'Entered value for ' + data.label + ' is not valid. !!!' };
482
+ }
483
+ else if (this.applicableForValidation(data) && !this.isArray(formValueWithCust[data.field_name]) && formValueWithCust[data.field_name].length > 0) {
484
+ return { 'msg': 'Please Enter ' + data.label + '. !!!' };
485
+ }
486
+ }
487
+ else if (formValue[data.field_name] == "" && !this.isArray(formValue[data.field_name])) {
488
+ formValue[data.field_name] = null;
489
+ }
490
+ break;
491
+ default:
492
+ break;
493
+ }
494
+ }
495
+ }
496
+ }
497
+ break;
498
+ case "list_of_checkbox":
499
+ if (validatField && element.is_mandatory) {
500
+ if (formValueWithCust[element.field_name] && this.isArray(formValueWithCust[element.field_name]) && formValueWithCust[element.field_name].length == 0) {
501
+ return { 'msg': element.label + ' is mandatory. !!!' };
502
+ }
503
+ }
504
+ break;
505
+ default:
506
+ if (validatField) {
507
+ }
508
+ else if (formValue[element.field_name] == "" || formValue[element.field_name] == undefined) {
509
+ formValue[element.field_name] = null;
510
+ }
511
+ break;
512
+ }
513
+ }
514
+ }
515
+ }
516
+ if (validatField) {
517
+ return true;
518
+ }
519
+ else {
520
+ return this.coreFunctionService.checkBlankProperties(formValue);
521
+ }
522
+ }
523
+ applicableForValidation(field) {
524
+ if (field.is_mandatory) {
525
+ if (field.show_if != '' && field.show_if != null) {
526
+ if (field['display'] || field['show']) {
527
+ return true;
528
+ }
529
+ else {
530
+ return false;
531
+ }
532
+ }
533
+ else {
534
+ return true;
535
+ }
536
+ }
537
+ else {
538
+ return false;
539
+ }
540
+ }
541
+ getDateInStringFunction(templateValue) {
542
+ let result = {};
543
+ let monthNumber;
544
+ let monthName;
545
+ let year;
546
+ const fromDate = templateValue['fromDate'];
547
+ if (fromDate && fromDate != "") {
548
+ const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
549
+ monthNumber = new Date(fromDate).getMonth();
550
+ monthName = months[monthNumber];
551
+ year = new Date(fromDate).getFullYear();
552
+ let label = monthName + '-' + year;
553
+ result['labelName'] = label;
554
+ }
555
+ return result;
556
+ }
557
+ populatefields(value, populate_fields, field, multipleFormCollection) {
558
+ let obj = {};
559
+ let check = false;
560
+ if (field && field.field_name) {
561
+ let fieldName = "";
562
+ if (field.parent && field.parent != '') {
563
+ fieldName = field.parent + '.' + field.field_name;
564
+ }
565
+ else {
566
+ fieldName = field.field_name;
567
+ }
568
+ if (field.type == "checkbox" && this.getObjectValue(fieldName, value)) {
569
+ check = true;
570
+ }
571
+ }
572
+ if (populate_fields && populate_fields.length > 0) {
573
+ populate_fields.forEach((el) => {
574
+ value = this.getFormDataInMultiformCollection(multipleFormCollection, value);
575
+ let toList = el.to.split(".");
576
+ if (toList && toList.length > 1) {
577
+ const parent = toList[0];
578
+ if (!obj[parent])
579
+ obj[parent] = {};
580
+ const child = toList[1];
581
+ if (check) {
582
+ obj[parent][child] = this.mergeMultiFieldsValues(el.from, value);
583
+ }
584
+ else {
585
+ obj[parent][child] = "";
586
+ }
587
+ }
588
+ else {
589
+ const field = toList[0];
590
+ if (check) {
591
+ obj[field] = this.mergeMultiFieldsValues(el.from, value);
592
+ }
593
+ else {
594
+ obj[field] = "";
595
+ }
596
+ }
597
+ });
598
+ }
599
+ return obj;
600
+ }
601
+ mergeMultiFieldsValues(field, object) {
602
+ let result = "";
603
+ if (field && field != null && field != '' && field != " ") {
604
+ let list = field.split("+");
605
+ for (let index = 0; index < list.length; index++) {
606
+ if (result != "") {
607
+ let lastIndex = list.length - 1;
608
+ result = result + list[lastIndex] + this.getObjectValue(list[index], object);
609
+ }
610
+ else {
611
+ result = this.getObjectValue(list[index], object);
612
+ }
613
+ }
614
+ }
615
+ return result;
616
+ }
617
+ populate_fields_for_report(templateForm) {
618
+ // templateForm.controls['reporting_fax'].setValue(templateForm.value['fax']);
619
+ templateForm.controls['reporting_mobile'].setValue(templateForm.value['mobile']);
620
+ templateForm.controls['reporting_tel'].setValue(templateForm.value['phone']);
621
+ templateForm.controls['reporting_city'].setValue(templateForm.value['city']);
622
+ templateForm.controls['reporting_state'].setValue(templateForm.value['state']);
623
+ templateForm.controls['reporting_country'].setValue(templateForm.value['country']);
624
+ // templateForm.controls['reporting_address_line2'].setValue(templateForm.value['address_line2']);
625
+ templateForm.controls['reporting_gst'].setValue(templateForm.value['gst_no']);
626
+ templateForm.controls['reporting_contact_person_email'].setValue(templateForm.value['email']);
627
+ templateForm.controls['reporting_address'].setValue(templateForm.value['address_line1']);
628
+ templateForm.controls['reporting_pincode'].setValue(templateForm.value['pincode']);
629
+ templateForm.controls['reporting_contact_person'].setValue(templateForm.value['first_name'] + " " + templateForm.value['last_name']);
630
+ templateForm.controls['reporting_company'].setValue(templateForm.value.account.name);
631
+ }
632
+ // getNetAmountWithPercent(total:number, percent:number) {
633
+ // let percentAmount = 0;
634
+ // let netAmount = 0;
635
+ // percentAmount = total * percent / 100;
636
+ // netAmount = total - percentAmount;
637
+ // return { p_amount: percentAmount, net_amount: netAmount }
638
+ // }
639
+ // claimAmountCalculation(field1:any, field2:any, field3:any) {
640
+ // let total = 0;
641
+ // if (field1 && field1 != "") {
642
+ // total = total + field1
643
+ // }
644
+ // if (field2 && field2 != "") {
645
+ // total = total + field2;
646
+ // }
647
+ // if (field3 && field3 != "") {
648
+ // total = total + field3;
649
+ // }
650
+ // return total;
651
+ // }
652
+ // array_move(arr:any, old_index:number, new_index:number) {
653
+ // if (new_index >= arr.length) {
654
+ // var k = new_index - arr.length + 1;
655
+ // while (k--) {
656
+ // arr.push(undefined);
657
+ // }
658
+ // }
659
+ // arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
660
+ // return arr; // for testing
661
+ // };
662
+ openFileUpload(fieldName, modalName, formValue, fileData) {
663
+ const alertData = {
664
+ "field": fieldName,
665
+ "event": true,
666
+ "fieldName": fieldName.field_name,
667
+ "ddnFieldName": fieldName.ddn_field,
668
+ "files": fileData,
669
+ "tableFields": null,
670
+ "defaultBucket": null,
671
+ "defaultS3Key": null
672
+ };
673
+ if (fieldName.tableFields) {
674
+ alertData['tableFields'] = fieldName.tableFields;
675
+ }
676
+ if (fieldName.defaultBucket) {
677
+ alertData['defaultBucket'] = fieldName.defaultBucket;
678
+ }
679
+ if (fieldName.defaultS3Key) {
680
+ alertData['defaultS3Key'] = fieldName.defaultS3Key;
681
+ }
682
+ this.modalService.open(modalName, alertData);
683
+ }
684
+ openAlertModal(id, type, headerMessage, bodyMessage) {
685
+ const alertData = {
686
+ "type": type,
687
+ "bodyMessage": bodyMessage,
688
+ "headerMessage": headerMessage
689
+ };
690
+ this.modalService.open(id, alertData);
691
+ }
692
+ getForm(forms, formName, gridButtons) {
693
+ if (forms[formName] && forms[formName] != undefined && forms[formName] != null && forms[formName] != '') {
694
+ return JSON.parse(JSON.stringify(forms[formName]));
695
+ }
696
+ else {
697
+ if (forms['default'] && forms['default'] != undefined && forms['default'] != null) {
698
+ if (formName == 'UPDATE') {
699
+ if (gridButtons && gridButtons.length > 0) {
700
+ let check = false;
701
+ gridButtons.forEach((button) => {
702
+ if (button && button.onclick && button.onclick.action_name && button.onclick.action_name.toUpperCase() == 'UPDATE') {
703
+ check = true;
704
+ }
705
+ });
706
+ if (check) {
707
+ return JSON.parse(JSON.stringify(forms['default']));
708
+ }
709
+ else {
710
+ return {};
711
+ }
712
+ }
713
+ else {
714
+ return {};
715
+ }
716
+ }
717
+ else {
718
+ return JSON.parse(JSON.stringify(forms['default']));
719
+ }
720
+ }
721
+ else {
722
+ return {};
723
+ }
724
+ }
725
+ }
726
+ // getTitlecase(value) {
727
+ // return this.titlecasePipe.transform(value);
728
+ // }
729
+ gotoHomePage() {
730
+ const payload = {
731
+ appName: this.envService.getAppName(),
732
+ data: {
733
+ accessToken: this.storageService.GetAccessToken()
734
+ }
735
+ };
736
+ return payload;
737
+ }
738
+ download_file(payload) {
739
+ this.apiService.GetFileData(payload);
740
+ }
741
+ getQRCode(data) {
742
+ this.apiService.GetQr(data);
743
+ }
744
+ getAuditHistory(data) {
745
+ this.apiService.getAuditHistory(data);
746
+ }
747
+ downloadFile(file) {
748
+ const payload = {
749
+ path: 'download',
750
+ data: file
751
+ };
752
+ this.apiService.DownloadFile(payload);
753
+ }
754
+ numberOnly(event) {
755
+ const charCode = (event.which) ? event.which : event.keyCode;
756
+ if (charCode > 31 && (charCode < 48 || charCode > 57)) {
757
+ return false;
758
+ }
759
+ return true;
760
+ }
761
+ viewModal(id, object, field, currentMenu, editemode) {
762
+ const alertData = {
763
+ "field": field,
764
+ "data": object,
765
+ "menu_name": currentMenu.name,
766
+ 'editemode': editemode
767
+ };
768
+ this.modalService.open(id, alertData);
769
+ }
770
+ custmizedKey(parentfield) {
771
+ let custmizedKey = parentfield.field_name;
772
+ switch (parentfield.type) {
773
+ case "list_of_fields":
774
+ case "group_of_fields":
775
+ custmizedKey = parentfield.field_name + '_' + parentfield.type;
776
+ break;
777
+ default:
778
+ custmizedKey = parentfield.field_name;
779
+ break;
780
+ }
781
+ return custmizedKey;
782
+ }
783
+ checkStorageValue(object, parent, chield) {
784
+ let check = false;
785
+ if (parent != '' && parent != undefined && parent != null) {
786
+ const parentKey = this.custmizedKey(parent);
787
+ if (object[parentKey] && object[parentKey][chield.field_name] && object[parentKey][chield.field_name].length > 0) {
788
+ check = true;
789
+ }
790
+ }
791
+ else {
792
+ if (object[chield.field_name]) {
793
+ check = true;
794
+ }
795
+ }
796
+ return check;
797
+ }
798
+ getVariableStorageValue(object, parent, chield) {
799
+ let data = [];
800
+ if (parent != '' && parent != undefined && parent != null) {
801
+ const parentKey = this.custmizedKey(parent);
802
+ if (this.checkStorageValue(object, parent, chield)) {
803
+ data = object[parentKey][chield.field_name];
804
+ }
805
+ }
806
+ else {
807
+ if (this.checkStorageValue(object, '', chield)) {
808
+ data = object[chield.field_name];
809
+ }
810
+ }
811
+ return data;
812
+ }
813
+ formSize(evt, fieldLangth) {
814
+ if (evt && evt.class && evt.class != '') {
815
+ return evt.class;
816
+ }
817
+ else if (fieldLangth <= 5) {
818
+ return '';
819
+ }
820
+ else if (fieldLangth <= 10) {
821
+ return 'modal-lg';
822
+ }
823
+ else {
824
+ return 'modal-dialog-full-width';
825
+ }
826
+ }
827
+ // price_after_disc_health_test(templateForm:any){
828
+ // let templateValue = templateForm.getRawValue();
829
+ // let discount = 0;
830
+ // discount = templateValue.discount;
831
+ // }
832
+ // setPageNumverAndSize(payload:any,page:number,){
833
+ // payload['pageNo'] = page - 1;
834
+ // payload['pageSize'] = this.itemNumOfGrid;
835
+ // return payload;
836
+ // }
837
+ getMatchingInList(list, IncomingData, existData) {
838
+ var validity = true;
839
+ list.forEach((matchcriteria) => {
840
+ if (this.getObjectValue(matchcriteria, IncomingData) == this.getObjectValue(matchcriteria, existData)) {
841
+ validity = validity && true;
842
+ }
843
+ else {
844
+ validity = validity && false;
845
+ }
846
+ });
847
+ return validity;
848
+ }
849
+ getCorrectIndex(data, indx, field, gridData, filterValue) {
850
+ let index;
851
+ if (field.matching_fields_for_grid_selection && field.matching_fields_for_grid_selection.length > 0) {
852
+ gridData.forEach((row, i) => {
853
+ var validity = true;
854
+ field.matching_fields_for_grid_selection.forEach((matchcriteria) => {
855
+ if (this.getObjectValue(matchcriteria, data) == this.getObjectValue(matchcriteria, row)) {
856
+ validity = validity && true;
857
+ }
858
+ else {
859
+ validity = validity && false;
860
+ }
861
+ });
862
+ if (validity == true) {
863
+ index = i;
864
+ }
865
+ });
866
+ }
867
+ else if (data._id != undefined) {
868
+ index = this.getIndexInArrayById(gridData, data._id);
869
+ }
870
+ else {
871
+ index = indx;
872
+ }
873
+ if (index && index != indx && filterValue == '') {
874
+ index = indx;
875
+ }
876
+ return index;
877
+ }
878
+ getIndexInArrayById(array, id, key) {
879
+ let index = -1;
880
+ if (array && array.length > 0) {
881
+ for (let i = 0; i < array.length; i++) {
882
+ const element = array[i];
883
+ if (key != undefined && key != null) {
884
+ if (this.isArray(key) && key.length > 0 && Object.keys(id).length > 0) {
885
+ if (this.getMatchingInList(key, id, element)) {
886
+ index = i;
887
+ }
888
+ }
889
+ else {
890
+ const idValue = this.getObjectValue(key, element);
891
+ if (id && id == idValue) {
892
+ index = i;
893
+ break;
894
+ }
895
+ }
896
+ }
897
+ else if (element._id && element._id == id) {
898
+ index = i;
899
+ break;
900
+ }
901
+ }
902
+ ;
903
+ }
904
+ return index;
905
+ }
906
+ openModal(id, data) {
907
+ this.modalService.open(id, data);
908
+ }
909
+ getOperatorSymbol(operator) {
910
+ switch (operator) {
911
+ case 'eq':
912
+ return '=';
913
+ default:
914
+ return '=';
915
+ }
916
+ }
917
+ // getRouthQueryToRedirectUrl(){
918
+ // const redirectUrl:any = this.storageService.getRedirectUrl();
919
+ // let searchKey = '';
920
+ // if(redirectUrl.indexOf('?') != -1 ){
921
+ // searchKey = '?';
922
+ // }
923
+ // if(redirectUrl.indexOf('%') != -1){
924
+ // searchKey = '%';
925
+ // }
926
+ // let newUrlWithQuery = '';
927
+ // if(searchKey != ''){
928
+ // const index = redirectUrl.indexOf(searchKey);
929
+ // const stringLength = redirectUrl.length;
930
+ // const queryPrams = redirectUrl.substring(index,stringLength);
931
+ // const newParam = queryPrams.replace('%3F','');
932
+ // newUrlWithQuery = newParam.replace('%3D',':');
933
+ // }
934
+ // return {newUrlWithQuery};
935
+ // }
936
+ getFormDataInMultiformCollection(multiformCollection, formValue, index) {
937
+ let data = {};
938
+ if (index >= 0 && multiformCollection && multiformCollection.length >= 1 && multiformCollection[index] && multiformCollection[index]['data']) {
939
+ data = multiformCollection[index]['data'];
940
+ }
941
+ else {
942
+ let dummyData = {};
943
+ if (multiformCollection && multiformCollection.length > 0) {
944
+ multiformCollection.forEach((element, index) => {
945
+ let currentData = {};
946
+ if (element.data) {
947
+ currentData = element.data;
948
+ }
949
+ if (index == 0) {
950
+ dummyData = currentData;
951
+ }
952
+ else {
953
+ Object.keys(currentData).forEach(key => {
954
+ dummyData[key] = currentData[key];
955
+ });
956
+ }
957
+ });
958
+ }
959
+ if (Object.keys(formValue).length > 0) {
960
+ Object.keys(formValue).forEach(key => {
961
+ dummyData[key] = formValue[key];
962
+ });
963
+ }
964
+ data = dummyData;
965
+ }
966
+ return data;
967
+ }
968
+ convertListOfStringToListObject(list_of_populated_fields, keysList, seprator) {
969
+ let listOfObjects = [];
970
+ list_of_populated_fields.forEach((element) => {
971
+ let object = {};
972
+ let source_targetList = element.split(seprator);
973
+ keysList.forEach((key, i) => {
974
+ object[key] = source_targetList[i];
975
+ });
976
+ listOfObjects.push(object);
977
+ });
978
+ return listOfObjects;
979
+ }
980
+ // Commenting unused Function
981
+ // updateUserPreference(data:object,fieldName:string,parent?:string){
982
+ // let payloadData = this.getUserPreferenceObj(data,fieldName,parent);
983
+ // let payload = {
984
+ // "curTemp" : "user_preference",
985
+ // "data" : payloadData
986
+ // }
987
+ // this.apiService.SaveFormData(payload);
988
+ // }
989
+ // getUserPreferenceByFieldName(fieldName:string){
990
+ // let data = [];
991
+ // let userPreference = this.storageService.getUserPreference();
992
+ // if(userPreference && userPreference[fieldName]){
993
+ // data = userPreference[fieldName];
994
+ // }
995
+ // return data;
996
+ // }
997
+ // getUserPreferenceObj(data:any,fieldName:string,parent?:string){
998
+ // let refObj:any = this.getReferenceObject(data);
999
+ // if(parent != ''){
1000
+ // refObj = parent;
1001
+ // }
1002
+ // if(fieldName == "favoriteMenus"){
1003
+ // refObj = data;
1004
+ // }
1005
+ // let uRef:any = {};
1006
+ // let userPreference = this.storageService.getUserPreference();
1007
+ // if(userPreference && userPreference._id && userPreference._id != null && userPreference._id != ''){
1008
+ // let fieldData = userPreference[fieldName];
1009
+ // if(fieldData && fieldData.length > 0){
1010
+ // let matchIndex = -1;
1011
+ // for (let index = 0; index < fieldData.length; index++) {
1012
+ // const element = fieldData[index];
1013
+ // if(element._id == refObj._id){
1014
+ // matchIndex = index;
1015
+ // break;
1016
+ // }
1017
+ // }
1018
+ // if(matchIndex > -1){
1019
+ // if(parent != ''){
1020
+ // let submenu = fieldData[matchIndex].submenu;
1021
+ // let submenuMatchIndex = -1;
1022
+ // if(submenu && submenu.length > 0){
1023
+ // for (let j = 0; j < submenu.length; j++) {
1024
+ // const subMenu = submenu[j];
1025
+ // if(subMenu._id == data._id){
1026
+ // submenuMatchIndex = j;
1027
+ // break;
1028
+ // }
1029
+ // }
1030
+ // }
1031
+ // if(submenuMatchIndex > -1){
1032
+ // submenu.splice(submenuMatchIndex);
1033
+ // if(fieldData[matchIndex].submenu.length == 0){
1034
+ // fieldData.splice(matchIndex);
1035
+ // }else{
1036
+ // fieldData[matchIndex].submenu = submenu;
1037
+ // }
1038
+ // }else{
1039
+ // if(submenu.length > 0){
1040
+ // fieldData[matchIndex].submenu.push(data);
1041
+ // }else{
1042
+ // fieldData[matchIndex].submenu = []
1043
+ // fieldData[matchIndex].submenu.push(data);
1044
+ // }
1045
+ // }
1046
+ // }else{
1047
+ // fieldData.splice(matchIndex, 1);
1048
+ // }
1049
+ // }else{
1050
+ // if(parent != ''){
1051
+ // refObj['submenu'] = [];
1052
+ // refObj['submenu'].push(data);
1053
+ // fieldData.push(refObj);
1054
+ // }else{
1055
+ // fieldData.push(refObj);
1056
+ // }
1057
+ // }
1058
+ // }else{
1059
+ // fieldData = [];
1060
+ // fieldData.push(refObj);
1061
+ // }
1062
+ // userPreference[fieldName] = fieldData;
1063
+ // uRef = userPreference;
1064
+ // }else{
1065
+ // let user = this.storageService.GetUserInfo();
1066
+ // let userRef = this.getReferenceObject(user);
1067
+ // let dataList = [];
1068
+ // dataList.push(refObj);
1069
+ // uRef['userId'] = userRef;
1070
+ // uRef[fieldName] = dataList;
1071
+ // }
1072
+ // return uRef
1073
+ // }
1074
+ getReferenceObject(obj) {
1075
+ let ref = {};
1076
+ ref["_id"] = obj._id;
1077
+ ref["code"] = obj.code;
1078
+ ref["name"] = obj.name;
1079
+ if (obj.version != null) {
1080
+ ref["version"] = obj.version;
1081
+ }
1082
+ return ref;
1083
+ }
1084
+ dateDiff(dateSent) {
1085
+ let obj = {};
1086
+ let currentDate = new Date();
1087
+ dateSent = new Date(dateSent);
1088
+ // let diff = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) - Date.UTC(dateSent.getFullYear(), dateSent.getMonth(), dateSent.getDate());
1089
+ let diff = currentDate.getTime() - dateSent.getTime();
1090
+ let days = Math.floor(diff / (60 * 60 * 24 * 1000));
1091
+ let hours = Math.floor(diff / (60 * 60 * 1000)) - (days * 24);
1092
+ let minutes = Math.floor(diff / (60 * 1000)) - ((days * 24 * 60) + (hours * 60));
1093
+ let seconds = Math.floor(diff / 1000) - ((days * 24 * 60 * 60) + (hours * 60 * 60) + (minutes * 60));
1094
+ obj['days'] = days;
1095
+ obj['hours'] = hours;
1096
+ obj['minutes'] = minutes;
1097
+ obj['seconds'] = seconds;
1098
+ return obj;
1099
+ }
1100
+ getDay(data) {
1101
+ let createdDate = data.createdDate;
1102
+ if (createdDate) {
1103
+ let obj = this.dateDiff(createdDate);
1104
+ if (obj && obj['days'] == 0) {
1105
+ if (obj['hours'] == 0) {
1106
+ return obj['minutes'] + " Minutes ago";
1107
+ }
1108
+ else {
1109
+ return obj['hours'] + " hours " + obj['minutes'] + " Minutes ago";
1110
+ }
1111
+ }
1112
+ else {
1113
+ return obj['days'] + " days ago";
1114
+ }
1115
+ }
1116
+ return "";
1117
+ }
1118
+ updateFieldInList(fieldName, list) {
1119
+ let modifyList = [];
1120
+ if (list && list.length > 0) {
1121
+ list.forEach((element) => {
1122
+ let value = JSON.parse(JSON.stringify(element));
1123
+ value[fieldName] = true;
1124
+ modifyList.push(value);
1125
+ });
1126
+ }
1127
+ return modifyList;
1128
+ }
1129
+ // manufactured_as_customer(templateForm: FormGroup) {
1130
+ // (<FormGroup>templateForm.controls["sample_details"]).controls["mfg_by"].patchValue(templateForm.value.account.name);
1131
+ // }
1132
+ // supplied_as_customer(templateForm: FormGroup) {
1133
+ // (<FormGroup>templateForm.controls["sample_details"]).controls["supplied_by"].patchValue(templateForm.value.account.name);
1134
+ // }
1135
+ funModeTravelChange(value) {
1136
+ let obj1 = {
1137
+ distanceInKm: '',
1138
+ localTa: ''
1139
+ };
1140
+ let obj = {
1141
+ claimSheet: obj1
1142
+ };
1143
+ return obj;
1144
+ }
1145
+ print(data) {
1146
+ let popupWin;
1147
+ popupWin = window.open('', '_blank', 'top=0,left=0,height=100%,width=auto');
1148
+ popupWin.document.write('<div class="noprint" style="text-align:right;"><a onClick="window.print()" style="text-align: right;display: inline-block;cursor: pointer;border: 2px solid #4285f4!important;background-color: transparent!important;color: #4285f4!important;box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12);padding: 7px 25px;font-size: .81rem;transition: .2s ease-in-out;margin: .375rem;text-transform: uppercase;">Print</a></div><style>@media print{.noprint{display:none;}}</style>' + data);
1149
+ popupWin.document.close();
1150
+ popupWin.print();
1151
+ }
1152
+ isArray(obj) {
1153
+ return Array.isArray(obj);
1154
+ }
1155
+ donotResetField(tableFields, FormValue) {
1156
+ let donotResetFieldLists = {};
1157
+ tableFields.forEach((tablefield) => {
1158
+ if (tablefield.do_not_refresh_on_add && tablefield.type != "list_of_fields" && tablefield.type != "group_of_fields" && tablefield.type != "stepper") {
1159
+ donotResetFieldLists[tablefield.field_name] = FormValue[tablefield.field_name];
1160
+ }
1161
+ else if (tablefield.type == "group_of_fields") {
1162
+ if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
1163
+ tablefield.list_of_fields.forEach((field) => {
1164
+ if (field.do_not_refresh_on_add) {
1165
+ donotResetFieldLists[tablefield.field_name][field.field_name] = FormValue[tablefield.field_name][field.field_name];
1166
+ }
1167
+ });
1168
+ }
1169
+ }
1170
+ else if (tablefield.type == "stepper") {
1171
+ if (tablefield.list_of_fields && tablefield.list_of_fields.length > 0) {
1172
+ tablefield.list_of_fields.forEach((step) => {
1173
+ if (step.list_of_fields && step.list_of_fields.length > 0) {
1174
+ step.list_of_fields.forEach((field) => {
1175
+ if (field.do_not_refresh_on_add) {
1176
+ donotResetFieldLists[step.field_name][field.field_name] = FormValue[step.field_name][field.field_name];
1177
+ }
1178
+ });
1179
+ }
1180
+ });
1181
+ }
1182
+ }
1183
+ });
1184
+ return donotResetFieldLists;
1185
+ }
1186
+ // modifyFileSetValue(files:any){
1187
+ // let fileName = '';
1188
+ // let fileLength = files.length;
1189
+ // let file = files[0];
1190
+ // if(fileLength == 1 && (file.fileName || file.rollName)){
1191
+ // fileName = file.fileName || file.rollName;
1192
+ // }else if(fileLength > 1){
1193
+ // fileName = fileLength + " Files";
1194
+ // }
1195
+ // return fileName;
1196
+ // }
1197
+ // modifyUploadFiles(files:any){
1198
+ // const fileList:any = [];
1199
+ // if(files && files.length > 0){
1200
+ // files.forEach((element:any) => {
1201
+ // if(element._id){
1202
+ // fileList.push(element)
1203
+ // }else{
1204
+ // if(!element.uploadData){
1205
+ // fileList.push({uploadData:[element]});
1206
+ // }else{
1207
+ // fileList.push(element);
1208
+ // }
1209
+ // }
1210
+ // });
1211
+ // }
1212
+ // return fileList;
1213
+ // }
1214
+ getFirstCharOfString(char) {
1215
+ if (this.coreFunctionService.isNotBlank(char)) {
1216
+ return char.charAt(0);
1217
+ }
1218
+ else {
1219
+ return '';
1220
+ }
1221
+ }
1222
+ removeItem(data, column, i) {
1223
+ data[column.field_name].splice(i, 1);
1224
+ return data[column.field_name];
1225
+ }
1226
+ checkObjecOrString(data) {
1227
+ if (data._id) {
1228
+ return data._id;
1229
+ }
1230
+ else {
1231
+ return data;
1232
+ }
1233
+ }
1234
+ copyGridCellText(value) {
1235
+ if (value) {
1236
+ navigator.clipboard.writeText(value);
1237
+ this.notificationService.notify("bg-success", "Text Copied");
1238
+ }
1239
+ }
1240
+ copyGridColumnText(head, data, elements) {
1241
+ let columnData = "";
1242
+ if (data.length > 0) {
1243
+ let field_name = head.field_name;
1244
+ if (head.type == "info" && elements && elements.length > 0) {
1245
+ if (head.gridColumns) {
1246
+ let childGridColumn = head.gridColumns;
1247
+ let childFieldName = childGridColumn[0]['field_name'];
1248
+ columnData = elements.map((ele) => {
1249
+ let childData;
1250
+ if (ele[field_name] && this.isArray(ele[field_name]) && ele[field_name].length > 0) {
1251
+ childData = ele[field_name].map((chidData) => {
1252
+ return chidData[childFieldName];
1253
+ }).join('\n').trim();
1254
+ }
1255
+ return childData;
1256
+ }).join('\n').trim();
1257
+ }
1258
+ }
1259
+ else {
1260
+ columnData = data.map((ele) => {
1261
+ if (ele[field_name] != undefined)
1262
+ return ele[field_name];
1263
+ }).join('\n').trim();
1264
+ }
1265
+ navigator.clipboard.writeText(columnData);
1266
+ }
1267
+ }
1268
+ }
1269
+ CommonFunctionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, deps: [{ token: i1.StorageService }, { token: i2.ModelService }, { token: i3.DatePipe }, { token: i4.ApiService }, { token: i5.CoreFunctionService }, { token: i6.EnvService }, { token: i7.NotificationService }], target: i0.ɵɵFactoryTarget.Injectable });
1270
+ CommonFunctionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, providedIn: 'root' });
1271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonFunctionService, decorators: [{
1272
+ type: Injectable,
1273
+ args: [{
1274
+ providedIn: 'root'
1275
+ }]
1276
+ }], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.ModelService }, { type: i3.DatePipe }, { type: i4.ApiService }, { type: i5.CoreFunctionService }, { type: i6.EnvService }, { type: i7.NotificationService }]; } });
1277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWZ1bmN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFjM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUloQyxZQUNVLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLFFBQWtCLEVBQ2xCLFVBQXFCLEVBQ3JCLG1CQUF1QyxFQUN2QyxVQUFxQixFQUNyQixtQkFBdUM7UUFOdkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDckIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUUvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNoRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1NBQzlCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUNELFFBQVE7UUFD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dGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kZWwvbW9kZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudlNlcnZpY2UgfSBmcm9tICcuLi9lbnYvZW52LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb21tb25GdW5jdGlvblNlcnZpY2Uge1xyXG4gIHVzZXJJbmZvOiBhbnk7XHJcbiAgbG9jYWxUYXM6YW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGVsU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6Q29yZUZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZW52U2VydmljZTpFbnZTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOk5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgIHRoaXMudXNlckluZm8gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLkdldFVzZXJJbmZvKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZjb2RlKCkge1xyXG4gICAgdGhpcy51c2VySW5mbyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuR2V0VXNlckluZm8oKTtcclxuICAgIGlmICh0aGlzLnVzZXJJbmZvICE9IG51bGwgJiYgdGhpcy51c2VySW5mbyAhPSB1bmRlZmluZWQgJiYgdGhpcy51c2VySW5mby5yZWZDb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLnJlZkNvZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0QXBwSWQoKSB7XHJcbiAgICB0aGlzLnVzZXJJbmZvID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpO1xyXG4gICAgaWYgKHRoaXMudXNlckluZm8gIT0gbnVsbCAmJiB0aGlzLnVzZXJJbmZvICE9IHVuZGVmaW5lZCAmJiB0aGlzLnVzZXJJbmZvLmFwcElkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLmFwcElkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldE9iamVjdFZhbHVlKGZpZWxkOmFueSwgb2JqZWN0OmFueSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdDtcclxuICAgIGlmIChmaWVsZCAmJiBmaWVsZCAhPSBudWxsICYmIGZpZWxkICE9ICcnICYmIGZpZWxkICE9IFwiIFwiKSB7XHJcblxyXG4gICAgICBsZXQgbGlzdCA9IGZpZWxkLnNwbGl0KFwiLlwiKVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHRbbGlzdFtpbmRleF1dXHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgZ2V0ZGRuRGlzcGxheVZhbCh2YWw6YW55KSB7XHJcbiAgICBpZiAodmFsICYmIHZhbC5uYW1lKSB7XHJcbiAgICAgIHJldHVybiB2YWwubmFtZTtcclxuICAgIH0gZWxzZSBpZiAodmFsICYmIHZhbC5sYWJlbCkge1xyXG4gICAgICByZXR1cm4gdmFsLmxhYmVsO1xyXG4gICAgfSBlbHNlIGlmICh2YWwgJiYgdmFsLmZpZWxkX25hbWUpIHtcclxuICAgICAgcmV0dXJuIHZhbC5maWVsZF9uYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcbiAgb3BlblRyZWVNb2RhbChmaWVsZExhYmVsOmFueSwgZGRuRmllbGQ6YW55LCBtb2RhbE5hbWU6YW55KSB7XHJcbiAgICBjb25zdCBhbGVydERhdGEgPSB7XHJcbiAgICAgIFwiZXZlbnRcIjogdHJ1ZSxcclxuICAgICAgXCJmaWVsZE5hbWVcIjogZmllbGRMYWJlbCxcclxuICAgICAgXCJkZG5GaWVsZE5hbWVcIjogZGRuRmllbGRcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWxOYW1lLCBhbGVydERhdGEpO1xyXG4gIH1cclxuICBkYXRlRm9ybWF0KHZhbHVlOmFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eScpO1xyXG4gIH1cclxuICBnZXREaXZDbGFzcyhmaWVsZDphbnksZmllbGRzTGFuZ3RoOmFueSl7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB7Li4uZmllbGR9XHJcbiAgICBpZiAoIWZpZWxkcy50eXBlKSB7XHJcbiAgICAgIGZpZWxkcy50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICB9XHJcbiAgICBpZihmaWVsZHMuZmllbGRfY2xhc3MgJiYgZmllbGQuZmllbGRfY2xhc3MgIT0gJycpe1xyXG4gICAgICByZXR1cm4gZmllbGRzLmZpZWxkX2NsYXNzO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChmaWVsZHMudHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9jaGVja2JveFwiOlxyXG4gICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgY2FzZSBcImh0bWxcIjpcclxuICAgICAgY2FzZSBcImxhYmVsXCI6XHJcbiAgICAgIGNhc2UgXCJncmlkX3NlbGVjdGlvblwiOlxyXG4gICAgICBjYXNlIFwidGFidWxhcl9kYXRhX3NlbGVjdG9yXCI6XHJcbiAgICAgIGNhc2UgXCJncm91cF9vZl9maWVsZHNcIjpcclxuICAgICAgICByZXR1cm4gXCJjb2wtbGctMTJcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZihmaWVsZHNMYW5ndGggPD0gNSl7XHJcbiAgICAgICAgICByZXR1cm4gXCJjb2wtbGctMTJcIjtcclxuICAgICAgICB9ZWxzZSBpZihmaWVsZHNMYW5ndGggPD0gMTApe1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLWxnLTZcIjtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1sZy0zXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRGaXhlZERpdkNsYXNzKGZpZWxkOmFueSxmaWVsZHNMYW5ndGg6YW55KXtcclxuICAgIGNvbnN0IGZpZWxkcyA9IHsuLi5maWVsZH1cclxuICAgIGlmICghZmllbGRzLnR5cGUpIHtcclxuICAgICAgZmllbGRzLnR5cGUgPSBcInRleHRcIjtcclxuICAgIH1cclxuICAgIGlmKGZpZWxkcy5maWVsZF9jbGFzcyAmJiBmaWVsZC5maWVsZF9jbGFzcyAhPSAnJyl7XHJcbiAgICAgIHJldHVybiBmaWVsZHMuZmllbGRfY2xhc3M7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEJ1dHRvbkRpdkNsYXNzKGZpZWxkOmFueSl7XHJcbiAgICBjb25zdCBmaWVsZHMgPSB7Li4uZmllbGR9XHJcbiAgICBpZihmaWVsZHMuZmllbGRfY2xhc3MgJiYgZmllbGQuZmllbGRfY2xhc3MgIT0gJycpe1xyXG4gICAgICByZXR1cm4gZmllbGRzLmZpZWxkX2NsYXNzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuO1xyXG5cclxuICB9XHJcbiAgZ2V0Q29udmVydGVkU3RyaW5nKGphOmFueSwgaW5jb21pbmdUZW1wbGF0ZTphbnkpe1xyXG4gICAgbGV0IHRlbXBsYXRlID0gXCJcIiArIGluY29taW5nVGVtcGxhdGU7XHJcbiAgICBsZXQgcmVnID0gbmV3IFJlZ0V4cChcIihcXFxcWykoLio/KShcXFxcXSlcIik7XHJcblxyXG4gICAgbGV0IG1hdGNoZXI6YW55ID0gdGVtcGxhdGUubWF0Y2gocmVnKTtcclxuICAgIGxldCBncm91cCA9IHJlZy5leGVjKHRlbXBsYXRlKTtcclxuICAgIGNvbnNvbGUubG9nKG1hdGNoZXIuZ3JvdXBzKTtcclxuXHJcbiAgICBsZXQgbGlzdE1hdGNoZXMgPSBbXTtcclxuICAgIC8vIHdoaWxlKG1hdGNoZXIuZmluZCl7XHJcbiAgICAgIGxpc3RNYXRjaGVzLnB1c2gobWF0Y2hlclsyXSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgbGlzdE1hdGNoZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgbGV0IHZhbHVlT2JqID0gbnVsbDtcclxuICAgICAgbGV0IGRldGFpbHMgPSBtYXRjaGVyWzJdO1xyXG4gICAgICBsZXQgdmFsdWVTdHJpbmcgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKGRldGFpbHMsIGphKTtcclxuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5yZXBsYWNlKFwiW1wiICsgbWF0Y2hlclsyXSArIFwiXVwiLCB2YWx1ZVN0cmluZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgfVxyXG4gIGdldFN0cmluZ1ZhbHVlKGRldGFpbHM6YW55LGphOmFueSl7XHJcbiAgICAvL2phIC0+IG9iamVjdFxyXG4gICAgLy9kZWF0aWxzIC0+IHBhdHRlcm5cclxuICAgIGxldCB2YWx1ZUNvbmZpZyA9IGRldGFpbHMuc3BsaXQoXCIsXCIpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0VmFsdWUodmFsdWVDb25maWdbMF0sIGphKVxyXG4gIH1cclxuXHJcblxyXG4gIHNhbml0aXplT2JqZWN0KHRhYmxlRmllbGRzOmFueSwgZm9ybVZhbHVlOmFueSwgdmFsaWRhdEZpZWxkOmFueSxmb3JtVmFsdWVXaXRoQ3VzdD86YW55KSB7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFibGVGaWVsZHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0YWJsZUZpZWxkc1tpbmRleF07XHJcbiAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5maWVsZF9uYW1lKXtcclxuICAgICAgICBpZihlbGVtZW50LnR5cGUgIT0gJ2xpc3Rfb2ZfZmllbGRzJyAmJiBlbGVtZW50LnR5cGUgIT0gJ2dyb3VwX29mX2ZpZWxkcycpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmRhdGF0eXBlKXtcclxuICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LmRhdGF0eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9vYmplY3RcIjpcclxuICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9vYmplY3Rfd2l0aF9wb3B1cFwiOlxyXG4gICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gIT0gbnVsbCAmJiAgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZWxlbWVudC5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihlbGVtZW50KSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J1BsZWFzZSBFbnRlciAnKyBlbGVtZW50LmxhYmVsICsgJy4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSBudWxsICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytlbGVtZW50LmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGVsZW1lbnQpICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSAnb2JqZWN0Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGVsZW1lbnQubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCAodHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9ICdvYmplY3QnICYmIGVsZW1lbnQudHlwZSAhPSAnZGF0ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQudHlwZSl7XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICBpZihmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2VsZW1lbnQubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGVsZW1lbnQpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZWxlbWVudC5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGVsZW1lbnQubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9PSBcIlwiIHx8ICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuYXBwbGljYWJsZUZvclZhbGlkYXRpb24oZWxlbWVudCkgJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV08MCl7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6JyAnICtlbGVtZW50LmxhYmVsICsgJyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIDAuICEhISd9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYgKCFOdW1iZXIoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IDA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwibW9iaWxlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgIGlmKCF2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnJlbW92ZVNwYWNlRnJvbVN0cmluZyhmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihlbGVtZW50KSl7XHJcbiAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZGF0YXR5cGUgIT0gJ2tleV92YWx1ZScpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gbnVsbCB8fCAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pIHx8IGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzogZWxlbWVudC5sYWJlbCArICcgaXMgcmVxdWlyZWQuJ31cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVsZW1lbnQuZGF0YXR5cGUgPT0gJ2tleV92YWx1ZScpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBmb3JtVmFsdWVXaXRoQ3VzdFtlbGVtZW50LmZpZWxkX25hbWVdICE9ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pLmxlbmd0aCA8PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6IGVsZW1lbnQubGFiZWwgKyAnIGlzIHJlcXVpcmVkLid9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSkgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhdHlwZSA9PSAna2V5X3ZhbHVlJyAmJiB0eXBlb2YgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5rZXkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3Qua2V5ID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGF0eXBlICE9ICdrZXlfdmFsdWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZihlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzICYmIGVsZW1lbnQubGlzdF9vZl9maWVsZHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEuZGF0YXR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0uZm9yRWFjaCgoZmllZGxMaXN0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCB0eXBlb2YgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEudHlwZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlzdF9vZl9zdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibW9iaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gJiYgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5mb3JFYWNoKChmaWVkbExpc3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnJlbW92ZVNwYWNlRnJvbVN0cmluZyhmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdLmZvckVhY2goKGZpZWRsTGlzdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWRsTGlzdFtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgZmllZGxMaXN0W2RhdGEuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVkbExpc3RbZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ3JvdXBfb2ZfZmllbGRzXCI6XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50Lmxpc3Rfb2ZfZmllbGRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICBpZihkYXRhICYmIGRhdGEuZGF0YXR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlwc193aXRoX21hc2tcIjpcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZGF0YS5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGRhdGEubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9PSBcIlwiIHx8ICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytkYXRhLmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmIHR5cGVvZiBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdICE9ICdvYmplY3QnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgdHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS50eXBlKXtcclxuICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSAhPSBcIlwiICYmIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonRW50ZXJlZCB2YWx1ZSBmb3IgJytkYXRhLmxhYmVsKycgaXMgbm90IHZhbGlkLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgIXRoaXMuaXNBcnJheShmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZighdmFsaWRhdEZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlcihmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1vYmlsZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoIXZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5yZW1vdmVTcGFjZUZyb21TdHJpbmcoZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV1bZGF0YS5maWVsZF9uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiB8fCBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic3RlcHBlclwiOlxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5saXN0X29mX2ZpZWxkcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IGVsZW1lbnQubGlzdF9vZl9maWVsZHNbal07XHJcbiAgICAgICAgICAgICAgICBpZihzdGVwLmxpc3Rfb2ZfZmllbGRzICYmIHN0ZXAubGlzdF9vZl9maWVsZHMgIT0gbnVsbCAmJiBzdGVwLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXAubGlzdF9vZl9maWVsZHMubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gc3RlcC5saXN0X29mX2ZpZWxkc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEuZGF0YXR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX29iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaXBzXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hpcHNfd2l0aF9tYXNrXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRGaWVsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gXCJcIiAmJiBmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J0VudGVyZWQgdmFsdWUgZm9yICcrZGF0YS5sYWJlbCsnIGlzIG5vdCB2YWxpZC4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGRhdGEpICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXSkgJiYgZm9ybVZhbHVlV2l0aEN1c3RbZGF0YS5maWVsZF9uYW1lXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7J21zZyc6J1BsZWFzZSBFbnRlciAnKyBkYXRhLmxhYmVsICsgJy4gISEhJ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSA9PSBcIlwiICYmICF0aGlzLmlzQXJyYXkoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2RhdGEubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiB0eXBlb2YgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gJ29iamVjdCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzonUGxlYXNlIEVudGVyICcrIGRhdGEubGFiZWwgKyAnLiAhISEnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdID09IFwiXCIgJiYgdHlwZW9mIGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlcihmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZGF0YS5maWVsZF9uYW1lXSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX3N0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWxpZGF0RmllbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdICE9IFwiXCIgJiYgZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidFbnRlcmVkIHZhbHVlIGZvciAnK2RhdGEubGFiZWwrJyBpcyBub3QgdmFsaWQuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hcHBsaWNhYmxlRm9yVmFsaWRhdGlvbihkYXRhKSAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2RhdGEuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geydtc2cnOidQbGVhc2UgRW50ZXIgJysgZGF0YS5sYWJlbCArICcuICEhISd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoZm9ybVZhbHVlW2RhdGEuZmllbGRfbmFtZV0gPT0gXCJcIiAmJiAhdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtkYXRhLmZpZWxkX25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0X29mX2NoZWNrYm94XCI6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkICYmIGVsZW1lbnQuaXNfbWFuZGF0b3J5KXtcclxuICAgICAgICAgICAgICAgIGlmKGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0gJiYgdGhpcy5pc0FycmF5KGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0pICYmIGZvcm1WYWx1ZVdpdGhDdXN0W2VsZW1lbnQuZmllbGRfbmFtZV0ubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsnbXNnJzogZWxlbWVudC5sYWJlbCArICcgaXMgbWFuZGF0b3J5LiAhISEnfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgaWYodmFsaWRhdEZpZWxkKXtcclxuXHJcbiAgICAgICAgICAgICAgfWVsc2UgaWYgKGZvcm1WYWx1ZVtlbGVtZW50LmZpZWxkX25hbWVdID09IFwiXCIgfHwgZm9ybVZhbHVlW2VsZW1lbnQuZmllbGRfbmFtZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbZWxlbWVudC5maWVsZF9uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodmFsaWRhdEZpZWxkKXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5jaGVja0JsYW5rUHJvcGVydGllcyhmb3JtVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFwcGxpY2FibGVGb3JWYWxpZGF0aW9uKGZpZWxkOmFueSl7XHJcbiAgICBpZihmaWVsZC5pc19tYW5kYXRvcnkpe1xyXG4gICAgICBpZihmaWVsZC5zaG93X2lmICE9ICcnICYmIGZpZWxkLnNob3dfaWYgIT0gbnVsbCl7XHJcbiAgICAgICAgaWYoZmllbGRbJ2Rpc3BsYXknXSB8fCBmaWVsZFsnc2hvdyddKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RGF0ZUluU3RyaW5nRnVuY3Rpb24odGVtcGxhdGVWYWx1ZTphbnkpe1xyXG4gICAgbGV0IHJlc3VsdDphbnkgPSB7fVxyXG4gICAgbGV0IG1vbnRoTnVtYmVyOmFueTtcclxuICAgIGxldCBtb250aE5hbWU6YW55O1xyXG4gICAgbGV0IHllYXI6IGFueTtcclxuICAgIGNvbnN0IGZyb21EYXRlID0gdGVtcGxhdGVWYWx1ZVsnZnJvbURhdGUnXTtcclxuICAgICAgaWYoZnJvbURhdGUgJiYgZnJvbURhdGUgIT0gXCJcIikge1xyXG4gICAgICBjb25zdCBtb250aHMgPSBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXTtcclxuICAgICAgbW9udGhOdW1iZXIgPSBuZXcgRGF0ZShmcm9tRGF0ZSkuZ2V0TW9udGgoKTtcclxuICAgICAgbW9udGhOYW1lID0gbW9udGhzW21vbnRoTnVtYmVyXTtcclxuICAgICAgeWVhciA9IG5ldyBEYXRlKGZyb21EYXRlKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBsZXQgbGFiZWwgPSBtb250aE5hbWUrJy0nK3llYXI7XHJcbiAgICAgIHJlc3VsdFsnbGFiZWxOYW1lJ10gPSBsYWJlbDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgcG9wdWxhdGVmaWVsZHModmFsdWU6YW55LCBwb3B1bGF0ZV9maWVsZHM6YW55LGZpZWxkOmFueSxtdWx0aXBsZUZvcm1Db2xsZWN0aW9uPzphbnkpIHtcclxuICAgIGxldCBvYmo6YW55ID0ge31cclxuICAgIGxldCBjaGVjayA9IGZhbHNlO1xyXG4gICAgaWYoZmllbGQgJiYgZmllbGQuZmllbGRfbmFtZSl7XHJcbiAgICAgIGxldCBmaWVsZE5hbWUgPSBcIlwiO1xyXG4gICAgICBpZihmaWVsZC5wYXJlbnQgICYmIGZpZWxkLnBhcmVudCAhPSAnJyl7XHJcbiAgICAgICAgZmllbGROYW1lID0gZmllbGQucGFyZW50KycuJytmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGZpZWxkLnR5cGUgPT0gXCJjaGVja2JveFwiICYmIHRoaXMuZ2V0T2JqZWN0VmFsdWUoZmllbGROYW1lLHZhbHVlKSl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihwb3B1bGF0ZV9maWVsZHMgJiYgcG9wdWxhdGVfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICBwb3B1bGF0ZV9maWVsZHMuZm9yRWFjaCgoZWw6YW55KSA9PntcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpcGxlRm9ybUNvbGxlY3Rpb24sIHZhbHVlKTtcclxuICAgICAgICBsZXQgdG9MaXN0ID0gZWwudG8uc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGlmKHRvTGlzdCAmJiB0b0xpc3QubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0b0xpc3RbMF07XHJcbiAgICAgICAgICBpZiAoIW9ialtwYXJlbnRdKSBvYmpbcGFyZW50XSA9IHt9O1xyXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSB0b0xpc3RbMV07XHJcbiAgICAgICAgICBpZihjaGVjayl7XHJcbiAgICAgICAgICAgIG9ialtwYXJlbnRdW2NoaWxkXSA9dGhpcy5tZXJnZU11bHRpRmllbGRzVmFsdWVzKGVsLmZyb20sIHZhbHVlKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBvYmpbcGFyZW50XVtjaGlsZF0gPSBcIlwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0b0xpc3RbMF07XHJcbiAgICAgICAgICBpZihjaGVjayl7XHJcbiAgICAgICAgICAgIG9ialtmaWVsZF0gPXRoaXMubWVyZ2VNdWx0aUZpZWxkc1ZhbHVlcyhlbC5mcm9tLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JqW2ZpZWxkXSA9IFwiXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBtZXJnZU11bHRpRmllbGRzVmFsdWVzKGZpZWxkOmFueSwgb2JqZWN0OmFueSl7XHJcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgIGlmKGZpZWxkICYmIGZpZWxkICE9IG51bGwgJiYgZmllbGQgIT0gJycgJiYgZmllbGQgIT0gXCIgXCIpe1xyXG4gICAgICBsZXQgbGlzdCA9IGZpZWxkLnNwbGl0KFwiK1wiKVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZihyZXN1bHQgIT0gXCJcIil7XHJcbiAgICAgICAgICBsZXQgbGFzdEluZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbGlzdFtsYXN0SW5kZXhdICsgdGhpcy5nZXRPYmplY3RWYWx1ZShsaXN0W2luZGV4XSwgb2JqZWN0KTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUobGlzdFtpbmRleF0sIG9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVfZmllbGRzX2Zvcl9yZXBvcnQodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XHJcbiAgICAvLyB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19mYXgnXS5zZXRWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWVbJ2ZheCddKTtcclxuICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1sncmVwb3J0aW5nX21vYmlsZSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnbW9iaWxlJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfdGVsJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydwaG9uZSddKTtcclxuXHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jaXR5J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydjaXR5J10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfc3RhdGUnXS5zZXRWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWVbJ3N0YXRlJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfY291bnRyeSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnY291bnRyeSddKTtcclxuXHJcbiAgICAvLyB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19hZGRyZXNzX2xpbmUyJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydhZGRyZXNzX2xpbmUyJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfZ3N0J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydnc3Rfbm8nXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jb250YWN0X3BlcnNvbl9lbWFpbCddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsnZW1haWwnXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19hZGRyZXNzJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydhZGRyZXNzX2xpbmUxJ10pO1xyXG4gICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWydyZXBvcnRpbmdfcGluY29kZSddLnNldFZhbHVlKHRlbXBsYXRlRm9ybS52YWx1ZVsncGluY29kZSddKTtcclxuICAgIHRlbXBsYXRlRm9ybS5jb250cm9sc1sncmVwb3J0aW5nX2NvbnRhY3RfcGVyc29uJ10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlWydmaXJzdF9uYW1lJ10rXCIgXCIrdGVtcGxhdGVGb3JtLnZhbHVlWydsYXN0X25hbWUnXSk7XHJcbiAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbJ3JlcG9ydGluZ19jb21wYW55J10uc2V0VmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlLmFjY291bnQubmFtZSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGdldE5ldEFtb3VudFdpdGhQZXJjZW50KHRvdGFsOm51bWJlciwgcGVyY2VudDpudW1iZXIpIHtcclxuICAvLyAgIGxldCBwZXJjZW50QW1vdW50ID0gMDtcclxuICAvLyAgIGxldCBuZXRBbW91bnQgPSAwO1xyXG4gIC8vICAgcGVyY2VudEFtb3VudCA9IHRvdGFsICogcGVyY2VudCAvIDEwMDtcclxuICAvLyAgIG5ldEFtb3VudCA9IHRvdGFsIC0gcGVyY2VudEFtb3VudDtcclxuICAvLyAgIHJldHVybiB7IHBfYW1vdW50OiBwZXJjZW50QW1vdW50LCBuZXRfYW1vdW50OiBuZXRBbW91bnQgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gY2xhaW1BbW91bnRDYWxjdWxhdGlvbihmaWVsZDE6YW55LCBmaWVsZDI6YW55LCBmaWVsZDM6YW55KSB7XHJcbiAgLy8gICBsZXQgdG90YWwgPSAwO1xyXG4gIC8vICAgaWYgKGZpZWxkMSAmJiBmaWVsZDEgIT0gXCJcIikge1xyXG4gIC8vICAgICB0b3RhbCA9IHRvdGFsICsgZmllbGQxXHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZmllbGQyICYmIGZpZWxkMiAhPSBcIlwiKSB7XHJcbiAgLy8gICAgIHRvdGFsID0gdG90YWwgKyBmaWVsZDI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoZmllbGQzICYmIGZpZWxkMyAhPSBcIlwiKSB7XHJcbiAgLy8gICAgIHRvdGFsID0gdG90YWwgKyBmaWVsZDM7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdG90YWw7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhcnJheV9tb3ZlKGFycjphbnksIG9sZF9pbmRleDpudW1iZXIsIG5ld19pbmRleDpudW1iZXIpIHtcclxuICAvLyAgIGlmIChuZXdfaW5kZXggPj0gYXJyLmxlbmd0aCkge1xyXG4gIC8vICAgICB2YXIgayA9IG5ld19pbmRleCAtIGFyci5sZW5ndGggKyAxO1xyXG4gIC8vICAgICB3aGlsZSAoay0tKSB7XHJcbiAgLy8gICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgYXJyLnNwbGljZShuZXdfaW5kZXgsIDAsIGFyci5zcGxpY2Uob2xkX2luZGV4LCAxKVswXSk7XHJcbiAgLy8gICByZXR1cm4gYXJyOyAvLyBmb3IgdGVzdGluZ1xyXG4gIC8vIH07XHJcblxyXG4gIG9wZW5GaWxlVXBsb2FkKGZpZWxkTmFtZTphbnksIG1vZGFsTmFtZTphbnksIGZvcm1WYWx1ZTphbnksIGZpbGVEYXRhOmFueSkge1xyXG4gICAgY29uc3QgYWxlcnREYXRhID0ge1xyXG4gICAgICBcImZpZWxkXCIgOmZpZWxkTmFtZSxcclxuICAgICAgXCJldmVudFwiOiB0cnVlLFxyXG4gICAgICBcImZpZWxkTmFtZVwiOiBmaWVsZE5hbWUuZmllbGRfbmFtZSxcclxuICAgICAgXCJkZG5GaWVsZE5hbWVcIjogZmllbGROYW1lLmRkbl9maWVsZCxcclxuICAgICAgXCJmaWxlc1wiIDogZmlsZURhdGEsXHJcbiAgICAgIFwidGFibGVGaWVsZHNcIjpudWxsLFxyXG4gICAgICBcImRlZmF1bHRCdWNrZXRcIjpudWxsICxcclxuICAgICAgXCJkZWZhdWx0UzNLZXlcIjogbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKGZpZWxkTmFtZS50YWJsZUZpZWxkcykge1xyXG4gICAgICBhbGVydERhdGFbJ3RhYmxlRmllbGRzJ10gPSBmaWVsZE5hbWUudGFibGVGaWVsZHM7XHJcbiAgICB9XHJcbiAgICBpZiAoZmllbGROYW1lLmRlZmF1bHRCdWNrZXQpIHtcclxuICAgICAgYWxlcnREYXRhWydkZWZhdWx0QnVja2V0J10gPSBmaWVsZE5hbWUuZGVmYXVsdEJ1Y2tldDtcclxuICAgIH1cclxuICAgIGlmIChmaWVsZE5hbWUuZGVmYXVsdFMzS2V5KSB7XHJcbiAgICAgIGFsZXJ0RGF0YVsnZGVmYXVsdFMzS2V5J10gPSBmaWVsZE5hbWUuZGVmYXVsdFMzS2V5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihtb2RhbE5hbWUsIGFsZXJ0RGF0YSk7XHJcbiAgfVxyXG4gIG9wZW5BbGVydE1vZGFsKGlkOnN0cmluZywgdHlwZTphbnksIGhlYWRlck1lc3NhZ2U6YW55LCBib2R5TWVzc2FnZTphbnkpIHtcclxuICAgIGNvbnN0IGFsZXJ0RGF0YSA9IHtcclxuICAgICAgXCJ0eXBlXCI6IHR5cGUsXHJcbiAgICAgIFwiYm9keU1lc3NhZ2VcIjogYm9keU1lc3NhZ2UsXHJcbiAgICAgIFwiaGVhZGVyTWVzc2FnZVwiOiBoZWFkZXJNZXNzYWdlXHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGlkLCBhbGVydERhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybShmb3JtczphbnksIGZvcm1OYW1lOmFueSxncmlkQnV0dG9uczphbnkpIHtcclxuICAgIGlmIChmb3Jtc1tmb3JtTmFtZV0gJiYgZm9ybXNbZm9ybU5hbWVdICE9IHVuZGVmaW5lZCAmJiBmb3Jtc1tmb3JtTmFtZV0gIT0gbnVsbCAmJiBmb3Jtc1tmb3JtTmFtZV0gIT0gJycpIHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZm9ybXNbZm9ybU5hbWVdKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZm9ybXNbJ2RlZmF1bHQnXSAmJiBmb3Jtc1snZGVmYXVsdCddICE9IHVuZGVmaW5lZCAmJiBmb3Jtc1snZGVmYXVsdCddICE9IG51bGwpIHtcclxuICAgICAgICBpZihmb3JtTmFtZSA9PSAnVVBEQVRFJyl7XHJcbiAgICAgICAgICBpZihncmlkQnV0dG9ucyAmJiBncmlkQnV0dG9ucy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyaWRCdXR0b25zLmZvckVhY2goKGJ1dHRvbjphbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZihidXR0b24gJiYgYnV0dG9uLm9uY2xpY2sgJiYgYnV0dG9uLm9uY2xpY2suYWN0aW9uX25hbWUgJiYgYnV0dG9uLm9uY2xpY2suYWN0aW9uX25hbWUudG9VcHBlckNhc2UoKSA9PSAnVVBEQVRFJyl7XHJcbiAgICAgICAgICAgICAgICBjaGVjayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYoY2hlY2spe1xyXG4gICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1zWydkZWZhdWx0J10pKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1zWydkZWZhdWx0J10pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHt9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8gZ2V0VGl0bGVjYXNlKHZhbHVlKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy50aXRsZWNhc2VQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgLy8gfVxyXG5cclxuXHJcblxyXG4gIGdvdG9Ib21lUGFnZSgpIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGFwcE5hbWU6IHRoaXMuZW52U2VydmljZS5nZXRBcHBOYW1lKCksXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5zdG9yYWdlU2VydmljZS5HZXRBY2Nlc3NUb2tlbigpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwYXlsb2FkO1xyXG4gIH1cclxuICBkb3dubG9hZF9maWxlKHBheWxvYWQ6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRGaWxlRGF0YShwYXlsb2FkKTtcclxuICB9XHJcbiAgZ2V0UVJDb2RlKGRhdGE6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5HZXRRcihkYXRhKTtcclxuICB9XHJcbiAgZ2V0QXVkaXRIaXN0b3J5KGRhdGE6b2JqZWN0KXtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXRBdWRpdEhpc3RvcnkoZGF0YSk7XHJcbiAgfVxyXG4gIGRvd25sb2FkRmlsZShmaWxlOnN0cmluZykge1xyXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgcGF0aDogJ2Rvd25sb2FkJyxcclxuICAgICAgZGF0YTogZmlsZVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLkRvd25sb2FkRmlsZShwYXlsb2FkKTtcclxuICB9XHJcbiAgbnVtYmVyT25seShldmVudDphbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNoYXJDb2RlID0gKGV2ZW50LndoaWNoKSA/IGV2ZW50LndoaWNoIDogZXZlbnQua2V5Q29kZTtcclxuICAgIGlmIChjaGFyQ29kZSA+IDMxICYmIChjaGFyQ29kZSA8IDQ4IHx8IGNoYXJDb2RlID4gNTcpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuICB9XHJcbiAgdmlld01vZGFsKGlkOmFueSwgb2JqZWN0OmFueSwgZmllbGQ6YW55LCBjdXJyZW50TWVudTphbnksIGVkaXRlbW9kZTphbnkpIHtcclxuICAgIGNvbnN0IGFsZXJ0RGF0YSA9IHtcclxuICAgICAgXCJmaWVsZFwiOiBmaWVsZCxcclxuICAgICAgXCJkYXRhXCI6IG9iamVjdCxcclxuICAgICAgXCJtZW51X25hbWVcIjogY3VycmVudE1lbnUubmFtZSxcclxuICAgICAgJ2VkaXRlbW9kZSc6IGVkaXRlbW9kZVxyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihpZCwgYWxlcnREYXRhKTtcclxuICB9XHJcbiAgY3VzdG1pemVkS2V5KHBhcmVudGZpZWxkOmFueSl7XHJcbiAgICBsZXQgY3VzdG1pemVkS2V5ID0gcGFyZW50ZmllbGQuZmllbGRfbmFtZTtcclxuICAgIHN3aXRjaCAocGFyZW50ZmllbGQudHlwZSkge1xyXG4gICAgICBjYXNlIFwibGlzdF9vZl9maWVsZHNcIjpcclxuICAgICAgY2FzZSBcImdyb3VwX29mX2ZpZWxkc1wiOlxyXG4gICAgICAgIGN1c3RtaXplZEtleSA9IHBhcmVudGZpZWxkLmZpZWxkX25hbWUrJ18nK3BhcmVudGZpZWxkLnR5cGVcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjdXN0bWl6ZWRLZXkgPSBwYXJlbnRmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1c3RtaXplZEtleTtcclxuICB9XHJcbiAgY2hlY2tTdG9yYWdlVmFsdWUob2JqZWN0OmFueSxwYXJlbnQ6YW55LGNoaWVsZDphbnkpe1xyXG4gICAgbGV0IGNoZWNrID0gZmFsc2U7XHJcbiAgICBpZihwYXJlbnQgIT0gJycgJiYgcGFyZW50ICE9IHVuZGVmaW5lZCAmJiBwYXJlbnQgIT0gbnVsbCl7XHJcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuY3VzdG1pemVkS2V5KHBhcmVudCk7XHJcbiAgICAgIGlmKG9iamVjdFtwYXJlbnRLZXldICYmIG9iamVjdFtwYXJlbnRLZXldW2NoaWVsZC5maWVsZF9uYW1lXSAmJiBvYmplY3RbcGFyZW50S2V5XVtjaGllbGQuZmllbGRfbmFtZV0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgaWYob2JqZWN0W2NoaWVsZC5maWVsZF9uYW1lXSl7XHJcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hlY2s7XHJcbiAgfVxyXG4gIGdldFZhcmlhYmxlU3RvcmFnZVZhbHVlKG9iamVjdDphbnkscGFyZW50OmFueSxjaGllbGQ6YW55KTogQXJyYXk8YW55PntcclxuICAgIGxldCBkYXRhOmFueSA9IFtdO1xyXG4gICAgaWYocGFyZW50ICE9ICcnICYmIHBhcmVudCAhPSB1bmRlZmluZWQgJiYgcGFyZW50ICE9IG51bGwpe1xyXG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmN1c3RtaXplZEtleShwYXJlbnQpO1xyXG4gICAgICBpZih0aGlzLmNoZWNrU3RvcmFnZVZhbHVlKG9iamVjdCxwYXJlbnQsY2hpZWxkKSl7XHJcbiAgICAgICAgZGF0YSA9IG9iamVjdFtwYXJlbnRLZXldW2NoaWVsZC5maWVsZF9uYW1lXVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmKHRoaXMuY2hlY2tTdG9yYWdlVmFsdWUob2JqZWN0LCcnLGNoaWVsZCkpe1xyXG4gICAgICAgIGRhdGEgPSBvYmplY3RbY2hpZWxkLmZpZWxkX25hbWVdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcbiAgZm9ybVNpemUoZXZ0OmFueSxmaWVsZExhbmd0aDpudW1iZXIpe1xyXG4gICAgaWYoZXZ0ICYmIGV2dC5jbGFzcyAmJiBldnQuY2xhc3MhPSAnJyl7XHJcbiAgICAgIHJldHVybiBldnQuY2xhc3M7XHJcbiAgICB9ZWxzZSBpZihmaWVsZExhbmd0aCA8PSA1KXtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfWVsc2UgaWYoZmllbGRMYW5ndGggPD0gMTApe1xyXG4gICAgICByZXR1cm4gJ21vZGFsLWxnJztcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHJldHVybiAnbW9kYWwtZGlhbG9nLWZ1bGwtd2lkdGgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHJpY2VfYWZ0ZXJfZGlzY19oZWFsdGhfdGVzdCh0ZW1wbGF0ZUZvcm06YW55KXtcclxuICAvLyAgIGxldCB0ZW1wbGF0ZVZhbHVlID0gdGVtcGxhdGVGb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgLy8gICBsZXQgZGlzY291bnQgPSAwO1xyXG4gIC8vICAgZGlzY291bnQgPSB0ZW1wbGF0ZVZhbHVlLmRpc2NvdW50O1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0UGFnZU51bXZlckFuZFNpemUocGF5bG9hZDphbnkscGFnZTpudW1iZXIsKXtcclxuICAvLyAgIHBheWxvYWRbJ3BhZ2VObyddID0gcGFnZSAtIDE7XHJcbiAgLy8gICBwYXlsb2FkWydwYWdlU2l6ZSddID0gdGhpcy5pdGVtTnVtT2ZHcmlkO1xyXG4gIC8vICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgLy8gfVxyXG4gIGdldE1hdGNoaW5nSW5MaXN0KGxpc3Q6YW55LEluY29taW5nRGF0YTphbnksZXhpc3REYXRhOmFueSl7XHJcbiAgICB2YXIgdmFsaWRpdHkgPSB0cnVlO1xyXG4gICAgbGlzdC5mb3JFYWNoKChtYXRjaGNyaXRlcmlhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0VmFsdWUobWF0Y2hjcml0ZXJpYSwgSW5jb21pbmdEYXRhKSA9PSB0aGlzLmdldE9iamVjdFZhbHVlKG1hdGNoY3JpdGVyaWEsIGV4aXN0RGF0YSkpIHtcclxuICAgICAgICB2YWxpZGl0eSA9IHZhbGlkaXR5ICYmIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGl0eSAmJiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmFsaWRpdHk7XHJcbiAgfVxyXG4gIGdldENvcnJlY3RJbmRleChkYXRhOmFueSwgaW5keDpudW1iZXIsZmllbGQ6YW55LGdyaWREYXRhOmFueSxmaWx0ZXJWYWx1ZTphbnkpe1xyXG4gICAgbGV0IGluZGV4O1xyXG4gICAgaWYgKGZpZWxkLm1hdGNoaW5nX2ZpZWxkc19mb3JfZ3JpZF9zZWxlY3Rpb24gJiYgZmllbGQubWF0Y2hpbmdfZmllbGRzX2Zvcl9ncmlkX3NlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGdyaWREYXRhLmZvckVhY2goKHJvdzphbnksIGk6bnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdmFyIHZhbGlkaXR5ID0gdHJ1ZTtcclxuICAgICAgICBmaWVsZC5tYXRjaGluZ19maWVsZHNfZm9yX2dyaWRfc2VsZWN0aW9uLmZvckVhY2goKG1hdGNoY3JpdGVyaWE6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRPYmplY3RWYWx1ZShtYXRjaGNyaXRlcmlhLCBkYXRhKSA9PSB0aGlzLmdldE9iamVjdFZhbHVlKG1hdGNoY3JpdGVyaWEsIHJvdykpIHtcclxuICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGl0eSAmJiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRpdHkgJiYgZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHZhbGlkaXR5ID09IHRydWUpIHtcclxuICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfWVsc2UgaWYgKGRhdGEuX2lkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpbmRleCA9IHRoaXMuZ2V0SW5kZXhJbkFycmF5QnlJZChncmlkRGF0YSwgZGF0YS5faWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5kZXggPSBpbmR4O1xyXG4gICAgfVxyXG4gICAgaWYoaW5kZXggJiYgaW5kZXggIT0gaW5keCAmJiBmaWx0ZXJWYWx1ZSA9PSAnJyl7XHJcbiAgICAgIGluZGV4ID0gaW5keDtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcbiAgZ2V0SW5kZXhJbkFycmF5QnlJZChhcnJheTphbnksaWQ6YW55LGtleT86YW55KXtcclxuICAgIGxldCBpbmRleCA9IC0xO1xyXG4gICAgaWYoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID4gMCl7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaV07XHJcbiAgICAgICAgaWYoa2V5ICE9IHVuZGVmaW5lZCAmJiBrZXkgIT0gbnVsbCl7XHJcbiAgICAgICAgICBpZih0aGlzLmlzQXJyYXkoa2V5KSAmJiBrZXkubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhpZCkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE1hdGNoaW5nSW5MaXN0KGtleSxpZCxlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkVmFsdWUgPSB0aGlzLmdldE9iamVjdFZhbHVlKGtleSxlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYoaWQgJiYgaWQgPT0gaWRWYWx1ZSl7XHJcbiAgICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYoZWxlbWVudC5faWQgJiYgZWxlbWVudC5faWQgPT0gaWQpe1xyXG4gICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuICBvcGVuTW9kYWwoaWQ6YW55LCBkYXRhOmFueSl7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGlkLCBkYXRhKTtcclxuICB9XHJcbiAgZ2V0T3BlcmF0b3JTeW1ib2wob3BlcmF0b3I6YW55KXtcclxuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuICAgICAgY2FzZSAnZXEnOlxyXG4gICAgICAgIHJldHVybiAnPSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICc9JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldFJvdXRoUXVlcnlUb1JlZGlyZWN0VXJsKCl7XHJcbiAgLy8gICBjb25zdCByZWRpcmVjdFVybDphbnkgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFJlZGlyZWN0VXJsKCk7XHJcbiAgLy8gICAgIGxldCBzZWFyY2hLZXkgPSAnJztcclxuICAvLyAgICAgaWYocmVkaXJlY3RVcmwuaW5kZXhPZignPycpICE9IC0xICl7XHJcbiAgLy8gICAgICAgc2VhcmNoS2V5ID0gJz8nO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmKHJlZGlyZWN0VXJsLmluZGV4T2YoJyUnKSAhPSAtMSl7XHJcbiAgLy8gICAgICAgc2VhcmNoS2V5ID0gJyUnO1xyXG4gIC8vICAgICB9XHJcblxyXG4gIC8vICAgICBsZXQgbmV3VXJsV2l0aFF1ZXJ5ID0gJyc7XHJcbiAgLy8gICAgIGlmKHNlYXJjaEtleSAhPSAnJyl7XHJcbiAgLy8gICAgICAgY29uc3QgaW5kZXggPSByZWRpcmVjdFVybC5pbmRleE9mKHNlYXJjaEtleSk7XHJcbiAgLy8gICAgICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gcmVkaXJlY3RVcmwubGVuZ3RoO1xyXG4gIC8vICAgICAgIGNvbnN0IHF1ZXJ5UHJhbXMgPSByZWRpcmVjdFVybC5zdWJzdHJpbmcoaW5kZXgsc3RyaW5nTGVuZ3RoKTtcclxuICAvLyAgICAgICBjb25zdCBuZXdQYXJhbSA9IHF1ZXJ5UHJhbXMucmVwbGFjZSgnJTNGJywnJyk7XHJcbiAgLy8gICAgICAgbmV3VXJsV2l0aFF1ZXJ5ID0gbmV3UGFyYW0ucmVwbGFjZSgnJTNEJywnOicpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIHJldHVybiB7bmV3VXJsV2l0aFF1ZXJ5fTtcclxuICAvLyB9XHJcblxyXG4gIGdldEZvcm1EYXRhSW5NdWx0aWZvcm1Db2xsZWN0aW9uKG11bHRpZm9ybUNvbGxlY3Rpb246YW55LGZvcm1WYWx1ZTphbnksaW5kZXg/OmFueSl7XHJcbiAgICBsZXQgZGF0YTphbnkgPSB7fTtcclxuICAgICAgaWYoaW5kZXg+PTAgJiYgbXVsdGlmb3JtQ29sbGVjdGlvbiAmJiBtdWx0aWZvcm1Db2xsZWN0aW9uLmxlbmd0aCA+PSAxICYmIG11bHRpZm9ybUNvbGxlY3Rpb25baW5kZXhdICYmIG11bHRpZm9ybUNvbGxlY3Rpb25baW5kZXhdWydkYXRhJ10pe1xyXG4gICAgICAgICBkYXRhID0gbXVsdGlmb3JtQ29sbGVjdGlvbltpbmRleF1bJ2RhdGEnXTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgbGV0IGR1bW15RGF0YTphbnkgPSB7fTtcclxuICAgICAgICBpZihtdWx0aWZvcm1Db2xsZWN0aW9uICYmIG11bHRpZm9ybUNvbGxlY3Rpb24ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIG11bHRpZm9ybUNvbGxlY3Rpb24uZm9yRWFjaCgoZWxlbWVudDphbnksaW5kZXg6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJlbnREYXRhOmFueSA9e307XHJcbiAgICAgICAgICAgICAgaWYoZWxlbWVudC5kYXRhKXtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gZWxlbWVudC5kYXRhO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihpbmRleCA9PSAwKXtcclxuICAgICAgICAgICAgICAgIGR1bW15RGF0YSA9IGN1cnJlbnREYXRhO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudERhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgZHVtbXlEYXRhW2tleV0gPSBjdXJyZW50RGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGZvcm1WYWx1ZSkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgZHVtbXlEYXRhW2tleV0gPSBmb3JtVmFsdWVba2V5XTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhID0gZHVtbXlEYXRhO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29udmVydExpc3RPZlN0cmluZ1RvTGlzdE9iamVjdChsaXN0X29mX3BvcHVsYXRlZF9maWVsZHM6YW55LGtleXNMaXN0OmFueSxzZXByYXRvcjphbnkpe1xyXG4gICAgbGV0IGxpc3RPZk9iamVjdHM6YW55ID0gW107XHJcbiAgICBsaXN0X29mX3BvcHVsYXRlZF9maWVsZHMuZm9yRWFjaCgoZWxlbWVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgb2JqZWN0OmFueSA9IHt9XHJcbiAgICBsZXQgc291cmNlX3RhcmdldExpc3Q6YW55ID0gZWxlbWVudC5zcGxpdChzZXByYXRvcik7XHJcbiAgICBrZXlzTGlzdC5mb3JFYWNoKChrZXk6IHN0cmluZyxpOiBzdHJpbmcpID0+IHtcclxuICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2VfdGFyZ2V0TGlzdFtpXTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxpc3RPZk9iamVjdHMucHVzaChvYmplY3QpO1xyXG4gIH0pO1xyXG4gICByZXR1cm4gbGlzdE9mT2JqZWN0cztcclxuICB9XHJcblxyXG4gIC8vIENvbW1lbnRpbmcgdW51c2VkIEZ1bmN0aW9uXHJcbiAgLy8gdXBkYXRlVXNlclByZWZlcmVuY2UoZGF0YTpvYmplY3QsZmllbGROYW1lOnN0cmluZyxwYXJlbnQ/OnN0cmluZyl7XHJcbiAgLy8gICBsZXQgcGF5bG9hZERhdGEgPSB0aGlzLmdldFVzZXJQcmVmZXJlbmNlT2JqKGRhdGEsZmllbGROYW1lLHBhcmVudCk7XHJcbiAgLy8gICBsZXQgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgXCJjdXJUZW1wXCIgOiBcInVzZXJfcHJlZmVyZW5jZVwiLFxyXG4gIC8vICAgICBcImRhdGFcIiA6IHBheWxvYWREYXRhXHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLmFwaVNlcnZpY2UuU2F2ZUZvcm1EYXRhKHBheWxvYWQpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0VXNlclByZWZlcmVuY2VCeUZpZWxkTmFtZShmaWVsZE5hbWU6c3RyaW5nKXtcclxuICAvLyAgIGxldCBkYXRhID0gW107XHJcbiAgLy8gICBsZXQgdXNlclByZWZlcmVuY2UgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJQcmVmZXJlbmNlKCk7XHJcbiAgLy8gICBpZih1c2VyUHJlZmVyZW5jZSAmJiB1c2VyUHJlZmVyZW5jZVtmaWVsZE5hbWVdKXtcclxuICAvLyAgICAgZGF0YSA9IHVzZXJQcmVmZXJlbmNlW2ZpZWxkTmFtZV07XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZGF0YTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldFVzZXJQcmVmZXJlbmNlT2JqKGRhdGE6YW55LGZpZWxkTmFtZTpzdHJpbmcscGFyZW50PzpzdHJpbmcpe1xyXG4gIC8vICAgbGV0IHJlZk9iajphbnkgPSB0aGlzLmdldFJlZmVyZW5jZU9iamVjdChkYXRhKTtcclxuICAvLyAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgIHJlZk9iaiA9IHBhcmVudDtcclxuICAvLyAgIH1cclxuICAvLyAgIGlmKGZpZWxkTmFtZSA9PSBcImZhdm9yaXRlTWVudXNcIil7XHJcbiAgLy8gICAgIHJlZk9iaiA9IGRhdGE7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdVJlZjphbnkgPSB7fTtcclxuICAvLyAgIGxldCB1c2VyUHJlZmVyZW5jZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlclByZWZlcmVuY2UoKTtcclxuICAvLyAgIGlmKHVzZXJQcmVmZXJlbmNlICYmIHVzZXJQcmVmZXJlbmNlLl9pZCAmJiB1c2VyUHJlZmVyZW5jZS5faWQgIT0gbnVsbCAmJiB1c2VyUHJlZmVyZW5jZS5faWQgIT0gJycpe1xyXG4gIC8vICAgICBsZXQgZmllbGREYXRhID0gdXNlclByZWZlcmVuY2VbZmllbGROYW1lXTtcclxuICAvLyAgICAgaWYoZmllbGREYXRhICYmIGZpZWxkRGF0YS5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgICBsZXQgbWF0Y2hJbmRleCA9IC0xO1xyXG4gIC8vICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWVsZERhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBlbGVtZW50ID0gZmllbGREYXRhW2luZGV4XTtcclxuICAvLyAgICAgICAgIGlmKGVsZW1lbnQuX2lkID09IHJlZk9iai5faWQpe1xyXG4gIC8vICAgICAgICAgICBtYXRjaEluZGV4ID0gaW5kZXg7XHJcbiAgLy8gICAgICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBpZihtYXRjaEluZGV4ICA+IC0xKXtcclxuICAvLyAgICAgICAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgICAgICAgIGxldCBzdWJtZW51ID0gZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnU7XHJcbiAgLy8gICAgICAgICAgIGxldCBzdWJtZW51TWF0Y2hJbmRleCA9IC0xO1xyXG4gIC8vICAgICAgICAgICBpZihzdWJtZW51ICYmIHN1Ym1lbnUubGVuZ3RoID4gMCl7XHJcbiAgLy8gICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdWJtZW51Lmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zdCBzdWJNZW51ID0gc3VibWVudVtqXTtcclxuICAvLyAgICAgICAgICAgICAgIGlmKHN1Yk1lbnUuX2lkID09IGRhdGEuX2lkKXtcclxuICAvLyAgICAgICAgICAgICAgICAgc3VibWVudU1hdGNoSW5kZXggPSBqO1xyXG4gIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgaWYoc3VibWVudU1hdGNoSW5kZXggPiAtMSl7XHJcbiAgLy8gICAgICAgICAgICAgc3VibWVudS5zcGxpY2Uoc3VibWVudU1hdGNoSW5kZXgpO1xyXG4gIC8vICAgICAgICAgICAgIGlmKGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51Lmxlbmd0aCA9PSAwKXtcclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YS5zcGxpY2UobWF0Y2hJbmRleCk7XHJcbiAgLy8gICAgICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgICAgICBmaWVsZERhdGFbbWF0Y2hJbmRleF0uc3VibWVudSA9IHN1Ym1lbnU7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICBpZihzdWJtZW51Lmxlbmd0aCA+IDApe1xyXG4gIC8vICAgICAgICAgICAgICAgZmllbGREYXRhW21hdGNoSW5kZXhdLnN1Ym1lbnUucHVzaChkYXRhKTtcclxuICAvLyAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51ID0gW11cclxuICAvLyAgICAgICAgICAgICAgIGZpZWxkRGF0YVttYXRjaEluZGV4XS5zdWJtZW51LnB1c2goZGF0YSk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgZmllbGREYXRhLnNwbGljZShtYXRjaEluZGV4LCAxKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgIGlmKHBhcmVudCAhPSAnJyl7XHJcbiAgLy8gICAgICAgICAgIHJlZk9ialsnc3VibWVudSddID0gW107XHJcbiAgLy8gICAgICAgICAgIHJlZk9ialsnc3VibWVudSddLnB1c2goZGF0YSk7XHJcbiAgLy8gICAgICAgICAgIGZpZWxkRGF0YS5wdXNoKHJlZk9iaik7XHJcbiAgLy8gICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgZmllbGREYXRhLnB1c2gocmVmT2JqKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1lbHNle1xyXG4gIC8vICAgICAgIGZpZWxkRGF0YSA9IFtdO1xyXG4gIC8vICAgICAgIGZpZWxkRGF0YS5wdXNoKHJlZk9iaik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdXNlclByZWZlcmVuY2VbZmllbGROYW1lXSA9IGZpZWxkRGF0YTtcclxuICAvLyAgICAgdVJlZiA9IHVzZXJQcmVmZXJlbmNlO1xyXG4gIC8vICAgfWVsc2V7XHJcbiAgLy8gICAgIGxldCB1c2VyID0gdGhpcy5zdG9yYWdlU2VydmljZS5HZXRVc2VySW5mbygpO1xyXG4gIC8vICAgICBsZXQgdXNlclJlZiA9IHRoaXMuZ2V0UmVmZXJlbmNlT2JqZWN0KHVzZXIpO1xyXG4gIC8vICAgICBsZXQgZGF0YUxpc3QgPSBbXTtcclxuICAvLyAgICAgZGF0YUxpc3QucHVzaChyZWZPYmopO1xyXG4gIC8vICAgICB1UmVmWyd1c2VySWQnXSA9IHVzZXJSZWY7XHJcbiAgLy8gICAgIHVSZWZbZmllbGROYW1lXSA9IGRhdGFMaXN0O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHVSZWZcclxuICAvLyB9XHJcbiAgZ2V0UmVmZXJlbmNlT2JqZWN0KG9iajphbnkpe1xyXG4gICAgbGV0IHJlZjphbnkgPSB7fVxyXG4gICAgcmVmW1wiX2lkXCJdPW9iai5faWQ7XHJcbiAgICByZWZbXCJjb2RlXCJdID0gb2JqLmNvZGU7XHJcbiAgICByZWZbXCJuYW1lXCJdID0gb2JqLm5hbWU7XHJcbiAgICBpZihvYmoudmVyc2lvbiAhPSBudWxsKXtcclxuICAgICAgcmVmW1widmVyc2lvblwiXSA9IG9iai52ZXJzaW9uXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmO1xyXG4gIH1cclxuICBkYXRlRGlmZihkYXRlU2VudDphbnkpe1xyXG4gICAgbGV0IG9iajphbnk9e307XHJcbiAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZGF0ZVNlbnQgPSBuZXcgRGF0ZShkYXRlU2VudCk7XHJcbiAgICAvLyBsZXQgZGlmZiA9IERhdGUuVVRDKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCksIGN1cnJlbnREYXRlLmdldERhdGUoKSkgLSBEYXRlLlVUQyhkYXRlU2VudC5nZXRGdWxsWWVhcigpLCBkYXRlU2VudC5nZXRNb250aCgpLCBkYXRlU2VudC5nZXREYXRlKCkpO1xyXG4gICAgbGV0IGRpZmYgPSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSBkYXRlU2VudC5nZXRUaW1lKCk7XHJcbiAgICBsZXQgZGF5cyA9IE1hdGguZmxvb3IoZGlmZiAvICg2MCAqIDYwICogMjQgKiAxMDAwKSk7XHJcbiAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKGRpZmYgLyAoNjAgKiA2MCAqIDEwMDApKSAtIChkYXlzICogMjQpO1xyXG4gICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyAoNjAgKiAxMDAwKSkgLSAoKGRheXMgKiAyNCAqIDYwKSArIChob3VycyAqIDYwKSk7XHJcbiAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoZGlmZiAvIDEwMDApIC0gKChkYXlzICogMjQgKiA2MCAqIDYwKSArIChob3VycyAqIDYwICogNjApICsgKG1pbnV0ZXMgKiA2MCkpO1xyXG4gICAgb2JqWydkYXlzJ10gPSBkYXlzO1xyXG4gICAgb2JqWydob3VycyddID0gaG91cnM7XHJcbiAgICBvYmpbJ21pbnV0ZXMnXSA9IG1pbnV0ZXM7XHJcbiAgICBvYmpbJ3NlY29uZHMnXSA9IHNlY29uZHM7XHJcblxyXG4gICAgIHJldHVybiBvYmo7XHJcbiAgIH1cclxuICAgZ2V0RGF5KGRhdGE6YW55KTpTdHJpbmd7XHJcbiAgICBsZXQgY3JlYXRlZERhdGUgPSBkYXRhLmNyZWF0ZWREYXRlO1xyXG4gICAgaWYoY3JlYXRlZERhdGUpe1xyXG4gICAgICBsZXQgb2JqID0gdGhpcy5kYXRlRGlmZihjcmVhdGVkRGF0ZSk7XHJcbiAgICAgIGlmKG9iaiAmJiBvYmpbJ2RheXMnXSA9PSAwKXtcclxuICAgICAgICBpZihvYmpbJ2hvdXJzJ10gPT0gMCl7XHJcbiAgICAgICAgICByZXR1cm4gb2JqWydtaW51dGVzJ10rXCIgTWludXRlcyBhZ29cIjtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiBvYmpbJ2hvdXJzJ10gK1wiIGhvdXJzIFwiK29ialsnbWludXRlcyddK1wiIE1pbnV0ZXMgYWdvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICByZXR1cm4gb2JqWydkYXlzJ10gK1wiIGRheXMgYWdvXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuICB1cGRhdGVGaWVsZEluTGlzdChmaWVsZE5hbWU6YW55LGxpc3Q6YW55KXtcclxuICAgIGxldCBtb2RpZnlMaXN0OmFueSA9IFtdO1xyXG4gICAgaWYobGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDApe1xyXG4gICAgICBsaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xyXG4gICAgICAgIHZhbHVlW2ZpZWxkTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgIG1vZGlmeUxpc3QucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZGlmeUxpc3Q7XHJcbiAgfVxyXG4gIC8vIG1hbnVmYWN0dXJlZF9hc19jdXN0b21lcih0ZW1wbGF0ZUZvcm06IEZvcm1Hcm91cCkge1xyXG4gIC8vICAgKDxGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW1wic2FtcGxlX2RldGFpbHNcIl0pLmNvbnRyb2xzW1wibWZnX2J5XCJdLnBhdGNoVmFsdWUodGVtcGxhdGVGb3JtLnZhbHVlLmFjY291bnQubmFtZSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzdXBwbGllZF9hc19jdXN0b21lcih0ZW1wbGF0ZUZvcm06IEZvcm1Hcm91cCkge1xyXG4gIC8vICAgKDxGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW1wic2FtcGxlX2RldGFpbHNcIl0pLmNvbnRyb2xzW1wic3VwcGxpZWRfYnlcIl0ucGF0Y2hWYWx1ZSh0ZW1wbGF0ZUZvcm0udmFsdWUuYWNjb3VudC5uYW1lKTtcclxuICAvLyB9XHJcblxyXG4gIGZ1bk1vZGVUcmF2ZWxDaGFuZ2UodmFsdWU6YW55KXtcclxuXHJcbiAgICBsZXQgb2JqMSA9IHtcclxuICAgICAgZGlzdGFuY2VJbkttOicnLFxyXG4gICAgICBsb2NhbFRhOicnXHJcbiAgICB9XHJcbiAgICBsZXQgb2JqID0ge1xyXG4gICAgICBjbGFpbVNoZWV0Om9iajFcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG4gIHByaW50KGRhdGE6YW55KTogdm9pZCB7XHJcbiAgICBsZXQgcG9wdXBXaW47XHJcbiAgICBwb3B1cFdpbiA9IHdpbmRvdy5vcGVuKCcnLCAnX2JsYW5rJywgJ3RvcD0wLGxlZnQ9MCxoZWlnaHQ9MTAwJSx3aWR0aD1hdXRvJyk7XHJcbiAgICBwb3B1cFdpbiEuZG9jdW1lbnQud3JpdGUoJzxkaXYgY2xhc3M9XCJub3ByaW50XCIgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPjxhIG9uQ2xpY2s9XCJ3aW5kb3cucHJpbnQoKVwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO2N1cnNvcjogcG9pbnRlcjtib3JkZXI6IDJweCBzb2xpZCAjNDI4NWY0IWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Y29sb3I6ICM0Mjg1ZjQhaW1wb3J0YW50O2JveC1zaGFkb3c6IDAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwgMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtwYWRkaW5nOiA3cHggMjVweDtmb250LXNpemU6IC44MXJlbTt0cmFuc2l0aW9uOiAuMnMgZWFzZS1pbi1vdXQ7bWFyZ2luOiAuMzc1cmVtO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCI+UHJpbnQ8L2E+PC9kaXY+PHN0eWxlPkBtZWRpYSBwcmludHsubm9wcmludHtkaXNwbGF5Om5vbmU7fX08L3N0eWxlPicrZGF0YSk7XHJcbiAgICBwb3B1cFdpbiEuZG9jdW1lbnQuY2xvc2UoKTtcclxuICAgIHBvcHVwV2luIS5wcmludCgpXHJcbiAgfVxyXG4gIGlzQXJyYXkob2JqIDogYW55ICkge1xyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKVxyXG4gIH1cclxuXHJcbiAgZG9ub3RSZXNldEZpZWxkKHRhYmxlRmllbGRzOmFueSxGb3JtVmFsdWU6YW55KXtcclxuICAgIGxldCBkb25vdFJlc2V0RmllbGRMaXN0czphbnk9e307XHJcbiAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKCh0YWJsZWZpZWxkOmFueSkgPT4ge1xyXG4gICAgICBpZih0YWJsZWZpZWxkLmRvX25vdF9yZWZyZXNoX29uX2FkZCAmJiB0YWJsZWZpZWxkLnR5cGUgIT0gXCJsaXN0X29mX2ZpZWxkc1wiICYmIHRhYmxlZmllbGQudHlwZSAhPSBcImdyb3VwX29mX2ZpZWxkc1wiICYmIHRhYmxlZmllbGQudHlwZSAhPSBcInN0ZXBwZXJcIil7XHJcbiAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbdGFibGVmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVt0YWJsZWZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICB9ZWxzZSBpZih0YWJsZWZpZWxkLnR5cGUgPT0gXCJncm91cF9vZl9maWVsZHNcIil7XHJcbiAgICAgICAgaWYodGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcyAmJiB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGFibGVmaWVsZC5saXN0X29mX2ZpZWxkcy5mb3JFYWNoKChmaWVsZDphbnkpID0+IHtcclxuICAgICAgICAgICAgaWYoZmllbGQuZG9fbm90X3JlZnJlc2hfb25fYWRkKXtcclxuICAgICAgICAgICAgICBkb25vdFJlc2V0RmllbGRMaXN0c1t0YWJsZWZpZWxkLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdID0gRm9ybVZhbHVlW3RhYmxlZmllbGQuZmllbGRfbmFtZV1bZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2UgaWYodGFibGVmaWVsZC50eXBlID09IFwic3RlcHBlclwiKXtcclxuICAgICAgICBpZih0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzICYmIHRhYmxlZmllbGQubGlzdF9vZl9maWVsZHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICB0YWJsZWZpZWxkLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKHN0ZXA6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKHN0ZXAubGlzdF9vZl9maWVsZHMgJiYgc3RlcC5saXN0X29mX2ZpZWxkcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBzdGVwLmxpc3Rfb2ZfZmllbGRzLmZvckVhY2goKGZpZWxkOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZmllbGQuZG9fbm90X3JlZnJlc2hfb25fYWRkKXtcclxuICAgICAgICAgICAgICAgICAgZG9ub3RSZXNldEZpZWxkTGlzdHNbc3RlcC5maWVsZF9uYW1lXVtmaWVsZC5maWVsZF9uYW1lXSA9IEZvcm1WYWx1ZVtzdGVwLmZpZWxkX25hbWVdW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRvbm90UmVzZXRGaWVsZExpc3RzO1xyXG4gIH1cclxuXHJcbiAgLy8gbW9kaWZ5RmlsZVNldFZhbHVlKGZpbGVzOmFueSl7XHJcbiAgLy8gICBsZXQgZmlsZU5hbWUgPSAnJztcclxuICAvLyAgIGxldCBmaWxlTGVuZ3RoID0gZmlsZXMubGVuZ3RoO1xyXG4gIC8vICAgbGV0IGZpbGUgPSBmaWxlc1swXTtcclxuICAvLyAgIGlmKGZpbGVMZW5ndGggPT0gMSAmJiAoZmlsZS5maWxlTmFtZSB8fCBmaWxlLnJvbGxOYW1lKSl7XHJcbiAgLy8gICAgIGZpbGVOYW1lID0gZmlsZS5maWxlTmFtZSB8fCBmaWxlLnJvbGxOYW1lO1xyXG4gIC8vICAgfWVsc2UgaWYoZmlsZUxlbmd0aCA+IDEpe1xyXG4gIC8vICAgICBmaWxlTmFtZSA9IGZpbGVMZW5ndGggKyBcIiBGaWxlc1wiO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGZpbGVOYW1lO1xyXG4gIC8vIH1cclxuICAvLyBtb2RpZnlVcGxvYWRGaWxlcyhmaWxlczphbnkpe1xyXG4gIC8vICAgY29uc3QgZmlsZUxpc3Q6YW55ID0gW107XHJcbiAgLy8gICBpZihmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKXtcclxuICAvLyAgICAgZmlsZXMuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAvLyAgICAgICBpZihlbGVtZW50Ll9pZCl7XHJcbiAgLy8gICAgICAgICBmaWxlTGlzdC5wdXNoKGVsZW1lbnQpXHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICBpZighZWxlbWVudC51cGxvYWREYXRhKXtcclxuICAvLyAgICAgICAgICAgZmlsZUxpc3QucHVzaCh7dXBsb2FkRGF0YTpbZWxlbWVudF19KTtcclxuICAvLyAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICBmaWxlTGlzdC5wdXNoKGVsZW1lbnQpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZmlsZUxpc3Q7XHJcbiAgLy8gfVxyXG4gIGdldEZpcnN0Q2hhck9mU3RyaW5nKGNoYXI6YW55KXtcclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGNoYXIpKXtcclxuICAgICAgcmV0dXJuIGNoYXIuY2hhckF0KDApXHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVJdGVtKGRhdGE6YW55LGNvbHVtbjphbnksaTpudW1iZXIpe1xyXG4gICAgZGF0YVtjb2x1bW4uZmllbGRfbmFtZV0uc3BsaWNlKGksMSk7XHJcbiAgICByZXR1cm4gZGF0YVtjb2x1bW4uZmllbGRfbmFtZV07XHJcbiAgfVxyXG4gIGNoZWNrT2JqZWNPclN0cmluZyhkYXRhOmFueSl7XHJcbiAgICBpZihkYXRhLl9pZCl7XHJcbiAgICAgIHJldHVybiBkYXRhLl9pZDtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvcHlHcmlkQ2VsbFRleHQodmFsdWU6YW55KXtcclxuICAgIGlmKHZhbHVlKXtcclxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KFwiYmctc3VjY2Vzc1wiLFwiVGV4dCBDb3BpZWRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5R3JpZENvbHVtblRleHQoaGVhZDphbnksZGF0YTphbnksZWxlbWVudHM/OmFueSl7XHJcbiAgICBsZXQgY29sdW1uRGF0YSA9IFwiXCI7XHJcbiAgICBpZihkYXRhLmxlbmd0aD4wKXtcclxuICAgICAgbGV0IGZpZWxkX25hbWU9aGVhZC5maWVsZF9uYW1lO1xyXG4gICAgICBpZihoZWFkLnR5cGUgPT0gXCJpbmZvXCIgJiYgZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoPjApe1xyXG4gICAgICAgIGlmKGhlYWQuZ3JpZENvbHVtbnMpe1xyXG4gICAgICAgICAgbGV0IGNoaWxkR3JpZENvbHVtbiA9IGhlYWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICBsZXQgY2hpbGRGaWVsZE5hbWUgPSBjaGlsZEdyaWRDb2x1bW5bMF1bJ2ZpZWxkX25hbWUnXTtcclxuICAgICAgICAgIGNvbHVtbkRhdGE9ZWxlbWVudHMubWFwKChlbGU6YW55KT0+e1xyXG4gICAgICAgICAgICBsZXQgY2hpbGREYXRhO1xyXG4gICAgICAgICAgICBpZihlbGVbZmllbGRfbmFtZV0gJiYgdGhpcy5pc0FycmF5KGVsZVtmaWVsZF9uYW1lXSkgJiYgZWxlW2ZpZWxkX25hbWVdLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgIGNoaWxkRGF0YT0gZWxlW2ZpZWxkX25hbWVdLm1hcCgoY2hpZERhdGE6YW55KSA9PntcclxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlkRGF0YVtjaGlsZEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgfSkuam9pbignXFxuJykudHJpbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZERhdGE7XHJcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb2x1bW5EYXRhPWRhdGEubWFwKChlbGU6YW55KT0+e1xyXG4gICAgICAgICAgaWYoZWxlW2ZpZWxkX25hbWVdIT11bmRlZmluZWQpIHJldHVybiBlbGVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgfSkuam9pbignXFxuJykudHJpbSgpO1xyXG4gICAgICB9XHJcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbHVtbkRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=