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,611 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { mergeMap } from 'rxjs/operators';
3
+ import { from } from 'rxjs'; //fromPromise
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../data-share/data-share.service";
6
+ import * as i2 from "@angular/common/http";
7
+ import * as i3 from "../env/env.service";
8
+ import * as i4 from "../model/model.service";
9
+ import * as i5 from "../storage/storage.service";
10
+ import * as i6 from "./../common-utils/core-function/core-function.service";
11
+ export class ApiService {
12
+ constructor(dataShareService, http, envService, modalService, stroageService, coreFunctionService) {
13
+ this.dataShareService = dataShareService;
14
+ this.http = http;
15
+ this.envService = envService;
16
+ this.modalService = modalService;
17
+ this.stroageService = stroageService;
18
+ this.coreFunctionService = coreFunctionService;
19
+ this.serverReq = false;
20
+ }
21
+ getStatiData(payloads) {
22
+ this.dataShareService.setReqResponce(true);
23
+ let reqLength = payloads.length;
24
+ let responceCount = 0;
25
+ from(payloads)
26
+ .pipe(mergeMap((payload) => this.staticDataCall([payload])))
27
+ .subscribe((res) => {
28
+ this.setStaticData(res['success']);
29
+ responceCount = responceCount + 1;
30
+ if (responceCount == reqLength) {
31
+ this.dataShareService.setReqResponce(false);
32
+ }
33
+ }, (error) => {
34
+ console.log(error);
35
+ });
36
+ }
37
+ staticDataCall(payload) {
38
+ let api = this.envService.getApi('GET_STATIC_DATA');
39
+ return this.http.post(api, payload);
40
+ }
41
+ setStaticData(data) {
42
+ const staticData = this.dataShareService.getStatiData();
43
+ const currentData = {};
44
+ if (data && data.length > 0) {
45
+ data.forEach((element) => {
46
+ if (element.adkeys) {
47
+ if (element.adkeys.totalRows && element.adkeys.totalRows != '') {
48
+ staticData[element.field] = [];
49
+ currentData[element.field] = [];
50
+ for (let index = 0; index < element.adkeys.totalRows; index++) {
51
+ staticData[element.field].push(element.data);
52
+ currentData[element.field].push(element.data);
53
+ }
54
+ }
55
+ if (element.adkeys.index && element.adkeys.index != '') {
56
+ if (staticData[element.field] && staticData[element.field].length > 0) {
57
+ const index = element.adkeys.index;
58
+ staticData[element.field][index] = element.data;
59
+ currentData[element.field][index] = element.data;
60
+ }
61
+ }
62
+ }
63
+ else {
64
+ staticData[element.field] = element.data;
65
+ currentData[element.field] = element.data;
66
+ }
67
+ });
68
+ }
69
+ if (data && data['staticDataMessgae'] != null && data['staticDataMessgae'] != '') {
70
+ staticData['staticDataMessgae'] = data['staticDataMessgae'];
71
+ currentData['staticDataMessgae'] = data['staticDataMessgae'];
72
+ }
73
+ this.dataShareService.shareStaticData(staticData, currentData);
74
+ }
75
+ ResetStaticData(keyName) {
76
+ let staticData = this.dataShareService.getStatiData();
77
+ staticData[keyName.field] = null;
78
+ this.dataShareService.shareStaticData(staticData, {});
79
+ }
80
+ resetStaticAllData() {
81
+ this.dataShareService.shareStaticData({}, {});
82
+ }
83
+ getGridCountData(payloads) {
84
+ from(payloads)
85
+ .pipe(mergeMap((payload) => this.gridCountDataCall([payload])))
86
+ .subscribe((res) => {
87
+ this.setGridCountData(res['success']);
88
+ }, (error) => {
89
+ console.log(error);
90
+ });
91
+ }
92
+ getTabCountData(payloads) {
93
+ let api = this.envService.getApi('GET_COUNT_DATA');
94
+ this.http.post(api, payloads).subscribe((respData) => {
95
+ this.setGridCountData(respData['success']);
96
+ }, (error) => {
97
+ console.log(error);
98
+ });
99
+ }
100
+ gridCountDataCall(payload) {
101
+ let api = this.envService.getApi('GET_COUNT_DATA');
102
+ return this.http.post(api, payload);
103
+ }
104
+ setGridCountData(data) {
105
+ const localGridCount = this.stroageService.GetTabCounts();
106
+ const gridCountData = this.dataShareService.getGridCountData();
107
+ const count = {};
108
+ const dataCount = {};
109
+ if (data.length > 0) {
110
+ data.forEach((element) => {
111
+ gridCountData[element.field] = element.data_size;
112
+ count[element.field] = element.data_size;
113
+ localGridCount[element.field] = element.data_size;
114
+ });
115
+ }
116
+ dataCount['gridCountData'] = gridCountData;
117
+ dataCount['count'] = count;
118
+ this.stroageService.SetTabCounts(localGridCount);
119
+ this.dataShareService.shareGridCountData(dataCount);
120
+ }
121
+ resetGridCountAllData() {
122
+ this.dataShareService.shareGridCountData({ count: {}, gridCountData: {} });
123
+ }
124
+ getGridData(payload) {
125
+ let api = this.envService.getApi('GET_GRID_DATA');
126
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
127
+ this.dataShareService.shareGridData(respData);
128
+ }, (error) => {
129
+ console.log(error);
130
+ });
131
+ }
132
+ resetGridData() {
133
+ this.dataShareService.shareGridData([]);
134
+ }
135
+ getDashletMster(payload) {
136
+ let api = this.envService.getApi('GET_GRID_DATA');
137
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
138
+ this.dataShareService.shareDashletMaster(respData);
139
+ }, (error) => {
140
+ console.log(error);
141
+ });
142
+ }
143
+ getMongoDashletMster(payload) {
144
+ let api = this.envService.getApi('GET_GRID_DATA');
145
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
146
+ this.dataShareService.shareMongoChart(respData);
147
+ }, (error) => {
148
+ console.log(error);
149
+ });
150
+ }
151
+ getMongoDashbord(payload) {
152
+ let api = this.envService.getApi('GET_GRID_DATA');
153
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
154
+ this.dataShareService.shareMongoDashbord(respData);
155
+ }, (error) => {
156
+ console.log(error);
157
+ });
158
+ }
159
+ GetTempMenu(payload) {
160
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
161
+ this.http.post(api, payload).subscribe((respData) => {
162
+ this.dataShareService.shareMenuData(respData);
163
+ }, (error) => {
164
+ console.log(error);
165
+ });
166
+ }
167
+ resetMenuData() {
168
+ this.dataShareService.shareMenuData([]);
169
+ }
170
+ GetTempData(payload) {
171
+ let moduleName = payload['module'];
172
+ let name = this.coreFunctionService.getTempNameFromPayload(payload);
173
+ let template = this.stroageService.getTemplate(name, moduleName);
174
+ if (template) {
175
+ this.dataShareService.shareTempData([template]);
176
+ }
177
+ else {
178
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
179
+ this.http.post(api, payload).subscribe((respData) => {
180
+ this.dataShareService.shareTempData(respData);
181
+ let preparedTempList = this.coreFunctionService.prepareTemplate(respData, moduleName);
182
+ this.stroageService.storeAllTemplate(preparedTempList);
183
+ }, (error) => {
184
+ console.log(error);
185
+ });
186
+ }
187
+ }
188
+ resetTempData() {
189
+ this.dataShareService.shareTempData([]);
190
+ }
191
+ deleteGridRow(payload) {
192
+ let api = this.envService.getApi('DELETE_GRID_ROW');
193
+ this.http.post(api + '/' + payload.curTemp, payload).subscribe((response) => {
194
+ this.dataShareService.setDeleteGridRowResponce(response);
195
+ });
196
+ }
197
+ SaveFormData(payload) {
198
+ let api = this.envService.getApi('SAVE_FORM_DATA');
199
+ this.saveCall(api + '/' + payload.curTemp, payload);
200
+ }
201
+ SendEmail(payload) {
202
+ let api = this.envService.getApi('SEND_EMAIL');
203
+ this.saveCall(api + '/' + payload.curTemp, payload);
204
+ }
205
+ DynamicApiCall(payload) {
206
+ let api = this.envService.getBaseUrl();
207
+ let list = payload.path.split("/");
208
+ let callName = list[list.length - 1];
209
+ switch (callName) {
210
+ case "gsd":
211
+ this.getStatiData(payload.data);
212
+ break;
213
+ default:
214
+ this.saveCall(api + payload.path, payload);
215
+ }
216
+ }
217
+ saveCall(api, payload) {
218
+ this.http.post(api, payload.data).subscribe((respData) => {
219
+ this.dataShareService.setSaveResponce(respData);
220
+ }, (error) => {
221
+ console.log(error);
222
+ });
223
+ }
224
+ ResetSaveResponce() {
225
+ this.dataShareService.setSaveResponce('');
226
+ }
227
+ GetFilterGridData(payload) {
228
+ let api = this.envService.getApi('GET_GRID_DATA');
229
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
230
+ this.dataShareService.shareGridData(respData);
231
+ }, (error) => {
232
+ console.log(error);
233
+ });
234
+ }
235
+ GetTypeaheadData(payload) {
236
+ let api = this.envService.getApi('GET_STATIC_DATA');
237
+ this.http.post(api, payload).subscribe((respData) => {
238
+ let currentstaticData = [];
239
+ let result = [];
240
+ currentstaticData = respData['success'];
241
+ if (currentstaticData.length > 0) {
242
+ result = currentstaticData[0].data;
243
+ }
244
+ this.dataShareService.setTypeAheadData(result);
245
+ }, (error) => {
246
+ console.log(error);
247
+ });
248
+ }
249
+ clearTypeaheadData() {
250
+ this.dataShareService.setTypeAheadData([]);
251
+ }
252
+ GetForm(payload) {
253
+ let endPoint = '';
254
+ if (this.envService.getRequestType() == 'PUBLIC') {
255
+ endPoint = 'GET_FORM_PUBLIC';
256
+ }
257
+ else {
258
+ endPoint = 'GET_FORM';
259
+ }
260
+ let api = this.envService.getApi(endPoint);
261
+ if (payload._id && payload._id != undefined && payload._id != null && payload._id != '') {
262
+ api = api + '/' + payload._id;
263
+ }
264
+ this.http.post(api, payload.data).subscribe((respData) => {
265
+ let dinamicForm;
266
+ if (respData && respData['success'] != null) {
267
+ const object = JSON.parse(JSON.stringify(respData['success']));
268
+ object['view_mode'] = "inlineFormView";
269
+ dinamicForm = {
270
+ DINAMIC_FORM: object
271
+ };
272
+ }
273
+ this.dataShareService.setForm(dinamicForm);
274
+ }, (error) => {
275
+ console.log(error);
276
+ });
277
+ }
278
+ GetNestedForm(payload) {
279
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
280
+ this.http.post(api, payload).subscribe((respData) => {
281
+ this.dataShareService.setNestedForm(respData[0]);
282
+ }, (error) => {
283
+ console.log(error);
284
+ });
285
+ }
286
+ GetHostName(payload) {
287
+ let api = this.envService.getApi('GET_GRID_DATA');
288
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
289
+ this.dataShareService.setHostData(respData['data']);
290
+ }, (error) => {
291
+ console.log(error);
292
+ });
293
+ }
294
+ GetDashletData(payloads) {
295
+ //this.dataShareService.setDashletData({});
296
+ from(payloads)
297
+ .pipe(mergeMap((payload) => this.dashletDataCall(payload)))
298
+ .subscribe((res) => {
299
+ this.SetDashletData(res);
300
+ }, (error) => {
301
+ console.log(error);
302
+ });
303
+ }
304
+ dashletDataCall(payload) {
305
+ let api = this.envService.getApi('GET_DASHLET_DATA');
306
+ return this.http.post(api + '/' + payload._id, payload.data);
307
+ }
308
+ SetDashletData(respData) {
309
+ let currentStaticData = [];
310
+ let getDashletData = this.dataShareService.getDashletData();
311
+ const dashletData = JSON.parse(JSON.stringify(getDashletData));
312
+ currentStaticData.push(respData);
313
+ if (currentStaticData.length > 0) {
314
+ currentStaticData.forEach(element => {
315
+ if (element && element.field != undefined && element.field != null) {
316
+ dashletData[element.field] = element.data;
317
+ }
318
+ });
319
+ }
320
+ this.dataShareService.setDashletData(dashletData);
321
+ }
322
+ GetExportExclLink(payload) {
323
+ let api = this.envService.getApi('EXPORT_GRID_DATA');
324
+ this.http.post(api, payload.data, payload.responce).subscribe((respData) => {
325
+ this.dataShareService.setExportExcelLink(respData);
326
+ }, (error) => {
327
+ this.modalService.close('download-progress-modal');
328
+ console.log(error);
329
+ });
330
+ }
331
+ GetExportCVSLink(payload) {
332
+ let api = this.envService.getApi('CSV_EXPORT_GRID_DATA');
333
+ this.http.post(api, payload.data, payload.responce).subscribe((respData) => {
334
+ this.dataShareService.setExportCVSLink(respData);
335
+ }, (error) => {
336
+ this.modalService.close('download-progress-modal');
337
+ console.log(error);
338
+ });
339
+ }
340
+ resetGetExportExclLink() {
341
+ this.dataShareService.setExportExcelLink('');
342
+ }
343
+ GetProductList(payload) {
344
+ let api = this.envService.getApi('GET_PARAMETER_LIST');
345
+ this.http.post(api, payload).subscribe((respData) => {
346
+ this.dataShareService.setProductList(respData);
347
+ }, (error) => {
348
+ console.log(error);
349
+ });
350
+ }
351
+ GetPreviewHtml(payload) {
352
+ let api = this.envService.getApi('GET_PREVIEW_HTML');
353
+ this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
354
+ this.dataShareService.setPreviewHtml(respData['success']);
355
+ }, (error) => {
356
+ console.log(error);
357
+ });
358
+ }
359
+ resetPreviewHtml() {
360
+ this.dataShareService.setPreviewHtml('');
361
+ }
362
+ UpdateProductBranch(payload) {
363
+ let api = this.envService.getApi('SAVE_PARAMETER_LIST');
364
+ this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
365
+ this.dataShareService.setUpdateProductBranch(respData);
366
+ }, (error) => {
367
+ console.log(error);
368
+ });
369
+ }
370
+ GetJobSchedules(payload) {
371
+ let api = this.envService.getApi('GET_GRID_DATA');
372
+ this.http.post(api + '/' + payload._id, payload.data).subscribe((respData) => {
373
+ this.dataShareService.setJobScheduleData(respData);
374
+ }, (error) => {
375
+ console.log(error);
376
+ });
377
+ }
378
+ GetPdfData(payload) {
379
+ let api = this.envService.getApi('GET_PDF');
380
+ this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
381
+ var contentDisposition = respData.headers.get('Content-Disposition');
382
+ var filename = "";
383
+ let matches = /filename="(.*?)"/g.exec(contentDisposition);
384
+ if (matches != null && matches[1]) {
385
+ filename = matches[1].replace(/['"]/g, '');
386
+ filename = filename.substring(filename.indexOf("=") + 1, filename.length);
387
+ }
388
+ this.dataShareService.setDownloadPdfData({ data: respData.body, filename: filename });
389
+ }, (error) => {
390
+ console.log(error);
391
+ });
392
+ }
393
+ ResetPdfData() {
394
+ this.dataShareService.setDownloadPdfData('');
395
+ }
396
+ GetFileData(payload) {
397
+ let api = this.envService.getApi('GET_FILE');
398
+ this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
399
+ var contentDisposition = respData.headers.get('Content-Disposition');
400
+ var filename = "";
401
+ let matches = /filename="(.*?)"/g.exec(contentDisposition);
402
+ if (matches != null && matches[1]) {
403
+ filename = matches[1].replace(/['"]/g, '');
404
+ filename = filename.substring(filename.indexOf("=") + 1, filename.length);
405
+ }
406
+ this.dataShareService.setFileData({ data: respData.body, filename: filename });
407
+ }, (error) => {
408
+ console.log(error);
409
+ });
410
+ }
411
+ PrintTemplate(payload) {
412
+ let api = this.envService.getApi('GET_FILE');
413
+ this.http.post(api + '/' + payload._id, payload.data, { responseType: 'arraybuffer', observe: 'response' }).subscribe((respData) => {
414
+ var contentDisposition = respData.headers.get('Content-Disposition');
415
+ var filename = "";
416
+ let matches = /filename="(.*?)"/g.exec(contentDisposition);
417
+ if (matches != null && matches[1]) {
418
+ filename = matches[1].replace(/['"]/g, '');
419
+ filename = filename.substring(filename.indexOf("=") + 1, filename.length);
420
+ }
421
+ this.dataShareService.setPrintTemplate({ data: respData.body, filename: filename });
422
+ }, (error) => {
423
+ console.log(error);
424
+ });
425
+ }
426
+ ResetFileData() {
427
+ this.dataShareService.setFileData('');
428
+ }
429
+ DownloadFile(payload) {
430
+ let api = this.envService.getApi('DOWNLOAD_PDF');
431
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
432
+ this.dataShareService.setFileDownloadUrl(respData['success']);
433
+ }, (error) => {
434
+ console.log(error);
435
+ });
436
+ }
437
+ ResetDownloadUrl() {
438
+ this.dataShareService.setFileDownloadUrl('');
439
+ }
440
+ FileUpload(payload) {
441
+ let api = this.envService.getApi('GET_PDF');
442
+ this.http.post(api + '/' + payload._id, payload.data, payload.responce).subscribe((respData) => {
443
+ console.log(respData);
444
+ }, (error) => {
445
+ console.log(error);
446
+ });
447
+ }
448
+ GetChartData(payload) {
449
+ let api = this.envService.getApi('GET_CHART_DATA');
450
+ this.http.post(api, payload).subscribe((respData) => {
451
+ this.dataShareService.setChartData(respData);
452
+ }, (error) => {
453
+ console.log(error);
454
+ });
455
+ }
456
+ GetQr(payload) {
457
+ let api = this.envService.getApi('GET_QR_CODE');
458
+ this.http.post(api + payload['number'], payload, { responseType: 'blob' }).subscribe((respData) => {
459
+ this.dataShareService.setFileData({ data: respData, filename: "qr-" + payload['from'] + "-" + (payload['to'] - 1) });
460
+ }, (error) => {
461
+ console.log(error);
462
+ });
463
+ }
464
+ getAuditVersionList(payload) {
465
+ let api = this.envService.getApi('AUDIT_VERSION_LIST');
466
+ this.http.get(api + "/" + payload).subscribe((respData) => {
467
+ this.dataShareService.setAuditVersionList(respData);
468
+ }, (error) => {
469
+ console.log(error);
470
+ });
471
+ }
472
+ getAuditHistory(payload) {
473
+ let api = this.envService.getApi('AUDIT_HISTORY');
474
+ this.http.post(api + "/" + payload['path'], payload.data).subscribe((respData) => {
475
+ this.dataShareService.setAuditHistoryData(respData);
476
+ }, (error) => {
477
+ console.log(error);
478
+ });
479
+ }
480
+ getAplicationsThemeSetting(payload) {
481
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
482
+ this.http.post(api, payload).subscribe((respData) => {
483
+ if (JSON.stringify(respData) != "{}") {
484
+ this.dataShareService.setThemeSetting(respData);
485
+ }
486
+ }, (error) => {
487
+ console.log(error);
488
+ });
489
+ }
490
+ getAplicationsSetting(payload) {
491
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
492
+ this.http.post(api, payload).subscribe((respData) => {
493
+ if (JSON.stringify(respData) != "{}") {
494
+ this.dataShareService.setApplicationSetting(respData);
495
+ }
496
+ }, (error) => {
497
+ console.log(error);
498
+ });
499
+ }
500
+ fieldDinamicApi(api, payload) {
501
+ const host = this.envService.getBaseUrl();
502
+ this.http.post(host + api, payload).subscribe((respData) => {
503
+ this.dataShareService.setFieldDinamicApiResponce(respData);
504
+ }, (error) => {
505
+ console.log(error);
506
+ });
507
+ }
508
+ getNextFormData(payload) {
509
+ let api = this.envService.getApi('GET_GRID_DATA');
510
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
511
+ if (JSON.stringify(respData) != "{}") {
512
+ this.dataShareService.setNextFormData(respData);
513
+ }
514
+ }, (error) => {
515
+ console.log(error);
516
+ });
517
+ }
518
+ gitVersion(payload) {
519
+ let api = this.envService.getApi('GIT_VERSION');
520
+ this.http.get(api).subscribe((respData) => {
521
+ this.dataShareService.setGitVersion(respData);
522
+ }, (error) => {
523
+ console.log(error);
524
+ });
525
+ }
526
+ getReportLoadGridData(payload) {
527
+ let api = this.envService.getApi('GET_GRID_DATA');
528
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
529
+ this.dataShareService.setReportLoadGridData(respData);
530
+ }, (error) => {
531
+ console.log(error);
532
+ });
533
+ }
534
+ getFavouriteData(payload) {
535
+ let api = this.envService.getApi('GET_GRID_DATA');
536
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
537
+ if (respData && respData['data'] && respData['data'].length > 0) {
538
+ const userPreference = respData['data'][0];
539
+ this.stroageService.setUserPreference(userPreference);
540
+ this.dataShareService.setUserPreference(userPreference);
541
+ }
542
+ else {
543
+ this.dataShareService.setUserPreference(respData['data']);
544
+ }
545
+ }, (error) => {
546
+ console.log(error);
547
+ });
548
+ }
549
+ getUserNotification(payload) {
550
+ let api = this.envService.getApi('GET_GRID_DATA');
551
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
552
+ this.dataShareService.shareUserNotification(respData);
553
+ }, (error) => {
554
+ console.log(error);
555
+ });
556
+ }
557
+ getUserNotificationSetting() {
558
+ let api = this.envService.getApi('GET_NOTIFICATION_SETTING');
559
+ this.http.post(api, {}).subscribe((respData) => {
560
+ this.dataShareService.shareUserNotificationSetting(respData);
561
+ }, (error) => {
562
+ console.log(error);
563
+ });
564
+ }
565
+ resetUserNotification() {
566
+ this.dataShareService.shareUserNotification([]);
567
+ }
568
+ getDownloadManual(payload) {
569
+ let api = this.envService.getApi('DOWNLOAD_MANUAL');
570
+ this.http.post(api, payload).subscribe((respData) => {
571
+ const url = respData.fileUrl;
572
+ this.dataShareService.sharePublicUrlFromS3(url);
573
+ }, (error) => {
574
+ console.log(error);
575
+ });
576
+ }
577
+ getGridRunningData(payload) {
578
+ let api = this.envService.getApi('GET_GRID_DATA');
579
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
580
+ this.dataShareService.shareGridRunningData(respData);
581
+ }, (error) => {
582
+ console.log(error);
583
+ });
584
+ }
585
+ // For app
586
+ getDatabyCollectionName(payload) {
587
+ let api = this.envService.getApi('GET_GRID_DATA');
588
+ this.http.post(api + '/' + payload.path, payload.data).subscribe((respData) => {
589
+ this.dataShareService.collectionData(respData);
590
+ }, (error) => {
591
+ console.log(error);
592
+ });
593
+ }
594
+ GetChildGrid(payload) {
595
+ let api = this.envService.getApi('GET_CUSTOM_TEMPLATE');
596
+ this.http.post(api, payload).subscribe((respData) => {
597
+ this.dataShareService.setChildGrid(respData[0]);
598
+ }, (error) => {
599
+ console.log(error);
600
+ });
601
+ }
602
+ }
603
+ ApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, deps: [{ token: i1.DataShareService }, { token: i2.HttpClient }, { token: i3.EnvService }, { token: i4.ModelService }, { token: i5.StorageService }, { token: i6.CoreFunctionService }], target: i0.ɵɵFactoryTarget.Injectable });
604
+ ApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, providedIn: 'root' });
605
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ApiService, decorators: [{
606
+ type: Injectable,
607
+ args: [{
608
+ providedIn: 'root'
609
+ }]
610
+ }], ctorParameters: function () { return [{ type: i1.DataShareService }, { type: i2.HttpClient }, { type: i3.EnvService }, { type: i4.ModelService }, { type: i5.StorageService }, { type: i6.CoreFunctionService }]; } });
611
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2FwaS9hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBdUIsUUFBUSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxNQUFNLENBQUMsQ0FBQSxhQUFhOzs7Ozs7OztBQVN6RCxNQUFNLE9BQU8sVUFBVTtJQUd2QixZQUNVLGdCQUFrQyxFQUNsQyxJQUFlLEVBQ2YsVUFBc0IsRUFDdEIsWUFBMEIsRUFDMUIsY0FBOEIsRUFDOUIsbUJBQXVDO1FBTHZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFSL0MsY0FBUyxHQUFXLEtBQUssQ0FBQztJQVN2QixDQUFDO0lBRU4sWUFBWSxDQUFDLFFBQVk7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2IsSUFBSSxDQUNILFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBQyxFQUFFLENBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2hDO2FBQ0EsU0FBUyxDQUNS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cG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL2NvbW1vbi11dGlscy9jb3JlLWZ1bmN0aW9uL2NvcmUtZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBtYXAsIHRhcCwgc3dpdGNoTWFwLCBtZXJnZU1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZnJvbSwgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJzsvL2Zyb21Qcm9taXNlXHJcbmltcG9ydCB7IERhdGFTaGFyZVNlcnZpY2UgfSBmcm9tICcuLi9kYXRhLXNoYXJlL2RhdGEtc2hhcmUuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudlNlcnZpY2UgfSBmcm9tICcuLi9lbnYvZW52LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RlbC9tb2RlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcGlTZXJ2aWNlIHtcclxuICBzZXJ2ZXJSZXE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuY29uc3RydWN0b3IoXHJcbiAgcHJpdmF0ZSBkYXRhU2hhcmVTZXJ2aWNlOiBEYXRhU2hhcmVTZXJ2aWNlLFxyXG4gIHByaXZhdGUgaHR0cDpIdHRwQ2xpZW50LFxyXG4gIHByaXZhdGUgZW52U2VydmljZTogRW52U2VydmljZSxcclxuICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kZWxTZXJ2aWNlLFxyXG4gIHByaXZhdGUgc3Ryb2FnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gIHByaXZhdGUgY29yZUZ1bmN0aW9uU2VydmljZTpDb3JlRnVuY3Rpb25TZXJ2aWNlXHJcbiApIHsgfVxyXG5cclxuZ2V0U3RhdGlEYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFJlcVJlc3BvbmNlKHRydWUpO1xyXG4gIGxldCByZXFMZW5ndGggPSBwYXlsb2Fkcy5sZW5ndGg7XHJcbiAgbGV0IHJlc3BvbmNlQ291bnQgPSAwO1xyXG4gIGZyb20ocGF5bG9hZHMpXHJcbiAgLnBpcGUoXHJcbiAgICBtZXJnZU1hcCgocGF5bG9hZCk9PlxyXG4gICAgICB0aGlzLnN0YXRpY0RhdGFDYWxsKFtwYXlsb2FkXSkpXHJcbiAgICApXHJcbiAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGljRGF0YShyZXNbJ3N1Y2Nlc3MnXSlcclxuICAgICAgICByZXNwb25jZUNvdW50ID0gcmVzcG9uY2VDb3VudCArIDE7XHJcbiAgICAgICAgaWYocmVzcG9uY2VDb3VudCA9PSByZXFMZW5ndGgpe1xyXG4gICAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFJlcVJlc3BvbmNlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuc3RhdGljRGF0YUNhbGwocGF5bG9hZDpvYmplY3Qpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfU1RBVElDX0RBVEEnKTtcclxuICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkKVxyXG59XHJcbnNldFN0YXRpY0RhdGEoZGF0YTphbnkpe1xyXG4gIGNvbnN0IHN0YXRpY0RhdGE6YW55ID0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFN0YXRpRGF0YSgpO1xyXG4gIGNvbnN0IGN1cnJlbnREYXRhOmFueSA9IHt9O1xyXG4gIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKXtcclxuICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgaWYoZWxlbWVudC5hZGtleXMpe1xyXG4gICAgICAgICAgaWYoZWxlbWVudC5hZGtleXMudG90YWxSb3dzICYmIGVsZW1lbnQuYWRrZXlzLnRvdGFsUm93cyAhPSAnJyl7XHJcbiAgICAgICAgICAgICAgc3RhdGljRGF0YVtlbGVtZW50LmZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnREYXRhW2VsZW1lbnQuZmllbGRdID0gW107XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnQuYWRrZXlzLnRvdGFsUm93czsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICBzdGF0aWNEYXRhW2VsZW1lbnQuZmllbGRdLnB1c2goZWxlbWVudC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgY3VycmVudERhdGFbZWxlbWVudC5maWVsZF0ucHVzaChlbGVtZW50LmRhdGEpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGVsZW1lbnQuYWRrZXlzLmluZGV4ICYmIGVsZW1lbnQuYWRrZXlzLmluZGV4ICE9ICcnKXtcclxuICAgICAgICAgICAgICBpZihzdGF0aWNEYXRhW2VsZW1lbnQuZmllbGRdICYmIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF0ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudC5hZGtleXMuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF1baW5kZXhdID0gZWxlbWVudC5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YVtlbGVtZW50LmZpZWxkXVtpbmRleF0gPSBlbGVtZW50LmRhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAgIHN0YXRpY0RhdGFbZWxlbWVudC5maWVsZF0gPSBlbGVtZW50LmRhdGE7XHJcbiAgICAgICAgICBjdXJyZW50RGF0YVtlbGVtZW50LmZpZWxkXSA9IGVsZW1lbnQuZGF0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmKGRhdGEgJiYgZGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSAhPSBudWxsICYmIGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ10gIT0gJycpe1xyXG4gICAgc3RhdGljRGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSA9IGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ107XHJcbiAgICBjdXJyZW50RGF0YVsnc3RhdGljRGF0YU1lc3NnYWUnXSA9IGRhdGFbJ3N0YXRpY0RhdGFNZXNzZ2FlJ107XHJcbiAgfVxyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoc3RhdGljRGF0YSxjdXJyZW50RGF0YSk7XHJcbn1cclxuXHJcblJlc2V0U3RhdGljRGF0YShrZXlOYW1lOmFueSl7XHJcbiAgbGV0IHN0YXRpY0RhdGE6YW55ID0gdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLmdldFN0YXRpRGF0YSgpO1xyXG4gIHN0YXRpY0RhdGFba2V5TmFtZS5maWVsZF0gPSBudWxsO1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoc3RhdGljRGF0YSx7fSk7XHJcbn1cclxuXHJcbnJlc2V0U3RhdGljQWxsRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVN0YXRpY0RhdGEoe30se30pXHJcbn1cclxuXHJcbmdldEdyaWRDb3VudERhdGEocGF5bG9hZHM6c3RyaW5nKXtcclxuICBmcm9tKHBheWxvYWRzKVxyXG4gIC5waXBlKFxyXG4gICAgbWVyZ2VNYXAoKHBheWxvYWQpPT5cclxuICAgICAgdGhpcy5ncmlkQ291bnREYXRhQ2FsbChbcGF5bG9hZF0pKVxyXG4gICAgKVxyXG4gICAgLnN1YnNjcmliZShcclxuICAgICAgKHJlczphbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNldEdyaWRDb3VudERhdGEocmVzWydzdWNjZXNzJ10pXHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcik9PntcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuZ2V0VGFiQ291bnREYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DT1VOVF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2Fkcykuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNldEdyaWRDb3VudERhdGEocmVzcERhdGFbJ3N1Y2Nlc3MnXSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ3JpZENvdW50RGF0YUNhbGwocGF5bG9hZDpvYmplY3Qpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfQ09VTlRfREFUQScpO1xyXG4gIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGksIHBheWxvYWQpXHJcbn1cclxuXHJcbnNldEdyaWRDb3VudERhdGEoZGF0YTphbnkpe1xyXG4gIGNvbnN0IGxvY2FsR3JpZENvdW50OmFueSA9IHRoaXMuc3Ryb2FnZVNlcnZpY2UuR2V0VGFiQ291bnRzKCk7XHJcbiAgY29uc3QgZ3JpZENvdW50RGF0YTphbnkgPSB0aGlzLmRhdGFTaGFyZVNlcnZpY2UuZ2V0R3JpZENvdW50RGF0YSgpO1xyXG4gIGNvbnN0IGNvdW50OmFueSA9IHt9O1xyXG4gIGNvbnN0IGRhdGFDb3VudDphbnkgPSB7fTtcclxuICBpZihkYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBncmlkQ291bnREYXRhW2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICAgIGNvdW50W2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICAgIGxvY2FsR3JpZENvdW50W2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhX3NpemU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZGF0YUNvdW50WydncmlkQ291bnREYXRhJ10gPSBncmlkQ291bnREYXRhO1xyXG4gIGRhdGFDb3VudFsnY291bnQnXSA9IGNvdW50O1xyXG4gIHRoaXMuc3Ryb2FnZVNlcnZpY2UuU2V0VGFiQ291bnRzKGxvY2FsR3JpZENvdW50KVxyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWRDb3VudERhdGEoZGF0YUNvdW50KTtcclxufVxyXG5yZXNldEdyaWRDb3VudEFsbERhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVHcmlkQ291bnREYXRhKHsgY291bnQ6IHt9LCBncmlkQ291bnREYXRhOiB7fX0pXHJcbn1cclxuZ2V0R3JpZERhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZUdyaWREYXRhKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5yZXNldEdyaWREYXRhKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlR3JpZERhdGEoW10pXHJcbn1cclxuZ2V0RGFzaGxldE1zdGVyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVEYXNobGV0TWFzdGVyKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmdldE1vbmdvRGFzaGxldE1zdGVyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVNb25nb0NoYXJ0KHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmdldE1vbmdvRGFzaGJvcmQocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZU1vbmdvRGFzaGJvcmQocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbkdldFRlbXBNZW51KHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlTWVudURhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxucmVzZXRNZW51RGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZU1lbnVEYXRhKFtdKVxyXG59XHJcbkdldFRlbXBEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgbW9kdWxlTmFtZSA9IHBheWxvYWRbJ21vZHVsZSddO1xyXG4gIGxldCBuYW1lID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmdldFRlbXBOYW1lRnJvbVBheWxvYWQocGF5bG9hZCk7XHJcbiAgbGV0IHRlbXBsYXRlID0gdGhpcy5zdHJvYWdlU2VydmljZS5nZXRUZW1wbGF0ZShuYW1lLG1vZHVsZU5hbWUpO1xyXG4gIGlmKHRlbXBsYXRlKXtcclxuICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKFt0ZW1wbGF0ZV0pO1xyXG4gIH1lbHNle1xyXG4gICAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DVVNUT01fVEVNUExBVEUnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKHJlc3BEYXRhKTtcclxuICAgICAgICAgIGxldCBwcmVwYXJlZFRlbXBMaXN0ID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLnByZXBhcmVUZW1wbGF0ZShyZXNwRGF0YSxtb2R1bGVOYW1lKTtcclxuICAgICAgICAgIHRoaXMuc3Ryb2FnZVNlcnZpY2Uuc3RvcmVBbGxUZW1wbGF0ZShwcmVwYXJlZFRlbXBMaXN0KVxyXG4gICAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIClcclxuICB9XHJcbn1cclxucmVzZXRUZW1wRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zaGFyZVRlbXBEYXRhKFtdKVxyXG59XHJcbmRlbGV0ZUdyaWRSb3cocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdERUxFVEVfR1JJRF9ST1cnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkrICcvJyArIHBheWxvYWQuY3VyVGVtcCxwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERlbGV0ZUdyaWRSb3dSZXNwb25jZShyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5TYXZlRm9ybURhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdTQVZFX0ZPUk1fREFUQScpO1xyXG4gIHRoaXMuc2F2ZUNhbGwoYXBpKyAnLycgKyBwYXlsb2FkLmN1clRlbXAscGF5bG9hZClcclxufVxyXG5TZW5kRW1haWwocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdTRU5EX0VNQUlMJyk7XHJcbiAgdGhpcy5zYXZlQ2FsbChhcGkrICcvJyArIHBheWxvYWQuY3VyVGVtcCxwYXlsb2FkKVxyXG59XHJcbkR5bmFtaWNBcGlDYWxsKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEJhc2VVcmwoKTtcclxuICBsZXQgbGlzdCA9IHBheWxvYWQucGF0aC5zcGxpdChcIi9cIik7XHJcbiAgbGV0IGNhbGxOYW1lID0gbGlzdFtsaXN0Lmxlbmd0aC0xXTtcclxuICBzd2l0Y2goY2FsbE5hbWUpe1xyXG4gICAgY2FzZSBcImdzZFwiOlxyXG4gICAgICB0aGlzLmdldFN0YXRpRGF0YShwYXlsb2FkLmRhdGEpO1xyXG4gICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICB0aGlzLnNhdmVDYWxsKGFwaStwYXlsb2FkLnBhdGgscGF5bG9hZClcclxuICB9XHJcblxyXG59XHJcbnNhdmVDYWxsKGFwaTpzdHJpbmcscGF5bG9hZDphbnkpe1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0U2F2ZVJlc3BvbmNlKHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblJlc2V0U2F2ZVJlc3BvbmNlKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFNhdmVSZXNwb25jZSgnJylcclxufVxyXG5HZXRGaWx0ZXJHcmlkRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlR3JpZERhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0VHlwZWFoZWFkRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9TVEFUSUNfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICBsZXQgY3VycmVudHN0YXRpY0RhdGE6YW55PVtdO1xyXG4gICAgICBsZXQgcmVzdWx0ID1bXTtcclxuICAgICAgY3VycmVudHN0YXRpY0RhdGE9cmVzcERhdGFbJ3N1Y2Nlc3MnXTtcclxuICAgICAgaWYoY3VycmVudHN0YXRpY0RhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICByZXN1bHQgPSBjdXJyZW50c3RhdGljRGF0YVswXS5kYXRhXHJcbiAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFR5cGVBaGVhZERhdGEocmVzdWx0KVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbmNsZWFyVHlwZWFoZWFkRGF0YSgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRUeXBlQWhlYWREYXRhKFtdKVxyXG59XHJcbkdldEZvcm0ocGF5bG9hZDphbnkpe1xyXG4gIGxldCBlbmRQb2ludCA9ICcnO1xyXG4gIGlmKHRoaXMuZW52U2VydmljZS5nZXRSZXF1ZXN0VHlwZSgpID09ICdQVUJMSUMnKXtcclxuICAgIGVuZFBvaW50ID0gJ0dFVF9GT1JNX1BVQkxJQyc7XHJcbiAgfWVsc2V7XHJcbiAgICBlbmRQb2ludCA9ICdHRVRfRk9STSc7XHJcbiAgfVxyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKGVuZFBvaW50KTtcclxuICBpZihwYXlsb2FkLl9pZCAmJiBwYXlsb2FkLl9pZCAhPSB1bmRlZmluZWQgJiYgcGF5bG9hZC5faWQgIT0gbnVsbCAmJnBheWxvYWQuX2lkICE9ICcnKXtcclxuICAgICAgYXBpID0gYXBpICsgJy8nICsgcGF5bG9hZC5faWQ7XHJcbiAgfVxyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgIGxldCBkaW5hbWljRm9ybTtcclxuICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ3N1Y2Nlc3MnXSAhPSBudWxsKXtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcERhdGFbJ3N1Y2Nlc3MnXSkpO1xyXG4gICAgICAgICAgb2JqZWN0Wyd2aWV3X21vZGUnXSA9IFwiaW5saW5lRm9ybVZpZXdcIjtcclxuICAgICAgICAgIGRpbmFtaWNGb3JtID0ge1xyXG4gICAgICAgICAgICAgIERJTkFNSUNfRk9STSA6IG9iamVjdFxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZvcm0oZGluYW1pY0Zvcm0pXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbkdldE5lc3RlZEZvcm0ocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfQ1VTVE9NX1RFTVBMQVRFJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE5lc3RlZEZvcm0ocmVzcERhdGFbMF0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5HZXRIb3N0TmFtZShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRIb3N0RGF0YShyZXNwRGF0YVsnZGF0YSddKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldERhc2hsZXREYXRhKHBheWxvYWRzOmFueSl7XHJcbiAgLy90aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RGFzaGxldERhdGEoe30pO1xyXG4gIGZyb20ocGF5bG9hZHMpXHJcbiAgLnBpcGUoXHJcbiAgICBtZXJnZU1hcCgocGF5bG9hZCk9PlxyXG4gICAgICB0aGlzLmRhc2hsZXREYXRhQ2FsbChwYXlsb2FkKSlcclxuICAgIClcclxuICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLlNldERhc2hsZXREYXRhKHJlcylcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5kYXNobGV0RGF0YUNhbGwocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfREFTSExFVF9EQVRBJyk7XHJcbiAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpO1xyXG59XHJcblNldERhc2hsZXREYXRhKHJlc3BEYXRhOmFueSl7XHJcbiAgbGV0IGN1cnJlbnRTdGF0aWNEYXRhPVtdO1xyXG4gIGxldCBnZXREYXNobGV0RGF0YSA9IHRoaXMuZGF0YVNoYXJlU2VydmljZS5nZXREYXNobGV0RGF0YSgpO1xyXG4gIGNvbnN0IGRhc2hsZXREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXREYXNobGV0RGF0YSkpO1xyXG4gIGN1cnJlbnRTdGF0aWNEYXRhLnB1c2gocmVzcERhdGEpO1xyXG4gIGlmKGN1cnJlbnRTdGF0aWNEYXRhLmxlbmd0aCA+IDApe1xyXG4gICAgICBjdXJyZW50U3RhdGljRGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYoZWxlbWVudCAmJiBlbGVtZW50LmZpZWxkICE9IHVuZGVmaW5lZCAmJiBlbGVtZW50LmZpZWxkICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgIGRhc2hsZXREYXRhW2VsZW1lbnQuZmllbGRdID0gZWxlbWVudC5kYXRhXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERhc2hsZXREYXRhKGRhc2hsZXREYXRhKTtcclxufVxyXG5cclxuR2V0RXhwb3J0RXhjbExpbmsocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdFWFBPUlRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLCBwYXlsb2FkLmRhdGEsIHBheWxvYWQucmVzcG9uY2UpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRFeHBvcnRFeGNlbExpbmsocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2UoJ2Rvd25sb2FkLXByb2dyZXNzLW1vZGFsJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldEV4cG9ydENWU0xpbmsocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdDU1ZfRVhQT1JUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnJlc3BvbmNlKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RXhwb3J0Q1ZTTGluayhyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5jbG9zZSgnZG93bmxvYWQtcHJvZ3Jlc3MtbW9kYWwnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbnJlc2V0R2V0RXhwb3J0RXhjbExpbmsoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RXhwb3J0RXhjZWxMaW5rKCcnKTtcclxufVxyXG5HZXRQcm9kdWN0TGlzdChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9QQVJBTUVURVJfTElTVCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFByb2R1Y3RMaXN0KHJlc3BEYXRhKVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFByZXZpZXdIdG1sKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX1BSRVZJRVdfSFRNTCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YTphbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0UHJldmlld0h0bWwocmVzcERhdGFbJ3N1Y2Nlc3MnXSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxucmVzZXRQcmV2aWV3SHRtbCgpe1xyXG4gIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRQcmV2aWV3SHRtbCgnJyk7XHJcbn1cclxuVXBkYXRlUHJvZHVjdEJyYW5jaChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ1NBVkVfUEFSQU1FVEVSX0xJU1QnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0VXBkYXRlUHJvZHVjdEJyYW5jaChyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0Sm9iU2NoZWR1bGVzKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRKb2JTY2hlZHVsZURhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFBkZkRhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfUERGJyk7XHJcbiAgdGhpcy5odHRwLnBvc3Q8SHR0cFJlc3BvbnNlPGFueT4+KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIGFzICdqc29uJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAnYm9keScgfSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdmFyIGNvbnRlbnREaXNwb3NpdGlvbjphbnkgPSByZXNwRGF0YS5oZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAvZmlsZW5hbWU9XCIoLio/KVwiL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5pbmRleE9mKFwiPVwiKSArIDEsIGZpbGVuYW1lLmxlbmd0aClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldERvd25sb2FkUGRmRGF0YSh7IGRhdGE6IHJlc3BEYXRhLmJvZHksIGZpbGVuYW1lOiBmaWxlbmFtZSB9KTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5SZXNldFBkZkRhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RG93bmxvYWRQZGZEYXRhKCcnKTtcclxufVxyXG5HZXRGaWxlRGF0YShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9GSUxFJyk7XHJcbiAgdGhpcy5odHRwLnBvc3Q8SHR0cFJlc3BvbnNlPGFueT4+KGFwaSArICcvJyArIHBheWxvYWQuX2lkLCBwYXlsb2FkLmRhdGEsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIGFzICdqc29uJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyBhcyAnYm9keScgfSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdmFyIGNvbnRlbnREaXNwb3NpdGlvbjphbnkgPSByZXNwRGF0YS5oZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAvZmlsZW5hbWU9XCIoLio/KVwiL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5pbmRleE9mKFwiPVwiKSArIDEsIGZpbGVuYW1lLmxlbmd0aClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEYXRhKHsgZGF0YTogcmVzcERhdGEuYm9keSwgZmlsZW5hbWU6IGZpbGVuYW1lIH0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblByaW50VGVtcGxhdGUocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfRklMRScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0PEh0dHBSZXNwb25zZTxhbnk+PihhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhLCB7IHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyBhcyAnanNvbicsIG9ic2VydmU6ICdyZXNwb25zZScgYXMgJ2JvZHknIH0pLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHZhciBjb250ZW50RGlzcG9zaXRpb246YW55ID0gcmVzcERhdGEuaGVhZGVycy5nZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcclxuICAgICAgICB2YXIgZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgIGxldCBtYXRjaGVzID0gL2ZpbGVuYW1lPVwiKC4qPylcIi9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcclxuICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsICYmIG1hdGNoZXNbMV0pIHtcclxuICAgICAgICAgICAgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUuaW5kZXhPZihcIj1cIikgKyAxLCBmaWxlbmFtZS5sZW5ndGgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRQcmludFRlbXBsYXRlKHsgZGF0YTogcmVzcERhdGEuYm9keSwgZmlsZW5hbWU6IGZpbGVuYW1lIH0pO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblJlc2V0RmlsZURhdGEoKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RmlsZURhdGEoJycpO1xyXG59XHJcbkRvd25sb2FkRmlsZShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0RPV05MT0FEX1BERicpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEb3dubG9hZFVybChyZXNwRGF0YVsnc3VjY2VzcyddKTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5SZXNldERvd25sb2FkVXJsKCl7XHJcbiAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldEZpbGVEb3dubG9hZFVybCgnJyk7XHJcbn1cclxuRmlsZVVwbG9hZChwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9QREYnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLl9pZCwgcGF5bG9hZC5kYXRhLCBwYXlsb2FkLnJlc3BvbmNlKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuR2V0Q2hhcnREYXRhKHBheWxvYWQ6b2JqZWN0KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NIQVJUX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGksIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRDaGFydERhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbkdldFFyKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX1FSX0NPREUnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyBwYXlsb2FkWydudW1iZXInXSwgcGF5bG9hZCx7cmVzcG9uc2VUeXBlOiAnYmxvYid9ICkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRGaWxlRGF0YSh7IGRhdGE6IHJlc3BEYXRhLCBmaWxlbmFtZTogXCJxci1cIitwYXlsb2FkWydmcm9tJ10rXCItXCIrKHBheWxvYWRbJ3RvJ10tMSkgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbmdldEF1ZGl0VmVyc2lvbkxpc3QocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdBVURJVF9WRVJTSU9OX0xJU1QnKTtcclxuICB0aGlzLmh0dHAuZ2V0KGFwaSArXCIvXCIrIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0QXVkaXRWZXJzaW9uTGlzdChyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcbmdldEF1ZGl0SGlzdG9yeShwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0FVRElUX0hJU1RPUlknKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgK1wiL1wiKyBwYXlsb2FkWydwYXRoJ10sIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRBdWRpdEhpc3RvcnlEYXRhKHJlc3BEYXRhKTtcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0QXBsaWNhdGlvbnNUaGVtZVNldHRpbmcocGF5bG9hZDpvYmplY3QpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIGlmKEpTT04uc3RyaW5naWZ5KHJlc3BEYXRhKSAhPSBcInt9XCIpe1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRUaGVtZVNldHRpbmcocmVzcERhdGEpXHJcbiAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5nZXRBcGxpY2F0aW9uc1NldHRpbmcocGF5bG9hZDpvYmplY3QpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0NVU1RPTV9URU1QTEFURScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgIGlmKEpTT04uc3RyaW5naWZ5KHJlc3BEYXRhKSAhPSBcInt9XCIpe1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRBcHBsaWNhdGlvblNldHRpbmcocmVzcERhdGEpXHJcbiAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5maWVsZERpbmFtaWNBcGkoYXBpOmFueSxwYXlsb2FkOm9iamVjdCl7XHJcbiAgY29uc3QgaG9zdCA9IHRoaXMuZW52U2VydmljZS5nZXRCYXNlVXJsKCk7XHJcbiAgdGhpcy5odHRwLnBvc3QoaG9zdCthcGksIHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0RmllbGREaW5hbWljQXBpUmVzcG9uY2UocmVzcERhdGEpXHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5nZXROZXh0Rm9ybURhdGEocGF5bG9hZDphbnkpIHtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgaWYoSlNPTi5zdHJpbmdpZnkocmVzcERhdGEpICE9IFwie31cIil7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldE5leHRGb3JtRGF0YShyZXNwRGF0YSlcclxuICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcblxyXG5cclxuZ2l0VmVyc2lvbihwYXlsb2FkOnN0cmluZykge1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHSVRfVkVSU0lPTicpO1xyXG4gIHRoaXMuaHR0cC5nZXQ8YW55PihhcGkpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0R2l0VmVyc2lvbihyZXNwRGF0YSk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcblxyXG5nZXRSZXBvcnRMb2FkR3JpZERhdGEocGF5bG9hZDphbnkpe1xyXG4gIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpICsgJy8nICsgcGF5bG9hZC5wYXRoLCBwYXlsb2FkLmRhdGEpLnN1YnNjcmliZShcclxuICAgIChyZXNwRGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5zZXRSZXBvcnRMb2FkR3JpZERhdGEocmVzcERhdGEpXHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuXHJcblxyXG5nZXRGYXZvdXJpdGVEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgaWYocmVzcERhdGEgJiYgcmVzcERhdGFbJ2RhdGEnXSAmJiByZXNwRGF0YVsnZGF0YSddLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgY29uc3QgdXNlclByZWZlcmVuY2UgPSByZXNwRGF0YVsnZGF0YSddWzBdO1xyXG4gICAgICAgICAgdGhpcy5zdHJvYWdlU2VydmljZS5zZXRVc2VyUHJlZmVyZW5jZSh1c2VyUHJlZmVyZW5jZSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0VXNlclByZWZlcmVuY2UodXNlclByZWZlcmVuY2UpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNldFVzZXJQcmVmZXJlbmNlKHJlc3BEYXRhWydkYXRhJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0VXNlck5vdGlmaWNhdGlvbihwYXlsb2FkOmFueSl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9HUklEX0RBVEEnKTtcclxuICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgKHJlc3BEYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlVXNlck5vdGlmaWNhdGlvbihyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5cclxuZ2V0VXNlck5vdGlmaWNhdGlvblNldHRpbmcoKXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX05PVElGSUNBVElPTl9TRVRUSU5HJyk7XHJcbiAgdGhpcy5odHRwLnBvc3QoYXBpLHt9KS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVVc2VyTm90aWZpY2F0aW9uU2V0dGluZyhyZXNwRGF0YSlcclxuICAgICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfVxyXG4gIClcclxufVxyXG5yZXNldFVzZXJOb3RpZmljYXRpb24oKXtcclxuICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVVc2VyTm90aWZpY2F0aW9uKFtdKVxyXG59XHJcblxyXG5nZXREb3dubG9hZE1hbnVhbChwYXlsb2FkOm9iamVjdCl7XHJcbiAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0RPV05MT0FEX01BTlVBTCcpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSxwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHVybD0gcmVzcERhdGEuZmlsZVVybDtcclxuICAgICAgdGhpcy5kYXRhU2hhcmVTZXJ2aWNlLnNoYXJlUHVibGljVXJsRnJvbVMzKHVybCk7XHJcbiAgICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIH1cclxuICApXHJcbn1cclxuZ2V0R3JpZFJ1bm5pbmdEYXRhKHBheWxvYWQ6YW55KXtcclxuICBsZXQgYXBpID0gdGhpcy5lbnZTZXJ2aWNlLmdldEFwaSgnR0VUX0dSSURfREFUQScpO1xyXG4gIHRoaXMuaHR0cC5wb3N0KGFwaSArICcvJyArIHBheWxvYWQucGF0aCwgcGF5bG9hZC5kYXRhKS5zdWJzY3JpYmUoXHJcbiAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2hhcmVHcmlkUnVubmluZ0RhdGEocmVzcERhdGEpO1xyXG4gICAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgKVxyXG59XHJcbiAgLy8gRm9yIGFwcFxyXG4gIGdldERhdGFieUNvbGxlY3Rpb25OYW1lKHBheWxvYWQ6YW55KXtcclxuICAgIGxldCBhcGkgPSB0aGlzLmVudlNlcnZpY2UuZ2V0QXBpKCdHRVRfR1JJRF9EQVRBJyk7XHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGkgKyAnLycgKyBwYXlsb2FkLnBhdGgsIHBheWxvYWQuZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNoYXJlU2VydmljZS5jb2xsZWN0aW9uRGF0YShyZXNwRGF0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBHZXRDaGlsZEdyaWQocGF5bG9hZDphbnkpe1xyXG4gICAgbGV0IGFwaSA9IHRoaXMuZW52U2VydmljZS5nZXRBcGkoJ0dFVF9DVVNUT01fVEVNUExBVEUnKTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaSwgcGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcERhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTaGFyZVNlcnZpY2Uuc2V0Q2hpbGRHcmlkKHJlc3BEYXRhWzBdKTtcclxuICAgICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIC8vRW5kIEZvciBhcHAgZnVuY3Rpb25zXHJcblxyXG5cclxufVxyXG4iXX0=