tuain-ng-forms-lib 12.0.24 → 12.0.25

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.
@@ -4,7 +4,7 @@ import { FormStructureAndData } from '../../classes/forms/form';
4
4
  import { LibFormManagerService } from '../../services/form-manager.service';
5
5
  import { LibEventManagerService } from '../../services/event-manager.service';
6
6
  import { LibFileManagementService } from '../../services/file-manager.service';
7
- import { formActions, NO_ERROR } from '../../classes/forms/form.constants';
7
+ import { formActions, NO_ERROR, HEADER } from '../../classes/forms/form.constants';
8
8
  const PAYLOAD_VERSION = 'TUAINEXCHANGE_1.0';
9
9
  const INLINE_ACTION = 'INLINE';
10
10
  const GLOBAL_ACTION = 'GLOBAL';
@@ -16,114 +16,335 @@ export class BasicFormComponent {
16
16
  this.formManagerService = formManagerService;
17
17
  this._eventManager = _eventManager;
18
18
  this.fileMgmtServices = fileMgmtServices;
19
+ this._formStructure = null;
20
+ this._controlToken = null;
21
+ this._definitionObtained = false;
22
+ // Eventos de acciones y campos
23
+ this._formSectionsActivate = {};
24
+ this._formSectionsInactivate = {};
25
+ this._formActionsStart = {};
26
+ this._formActionsFinish = {};
27
+ this._fieldInputValidation = {};
28
+ this._fieldValidationsStart = {};
29
+ this._fieldValidationsFinish = {};
30
+ // Callback de acciones de tablas
31
+ this._tableSelectionsStart = {};
32
+ this._tableSelectionsFinish = {};
33
+ this._tableActionsStart = {};
34
+ this._tableActionsFinish = {};
35
+ this._tableGetDataStart = {};
36
+ this._tableGetDataFinish = {};
37
+ this.inputDataFields = {};
38
+ this.extraData = {};
39
+ this._errorType = '';
19
40
  this.errorCode = '';
20
41
  this.errorMessage = '';
21
42
  this.errorDetail = '';
22
- this.formStructure = null;
23
- this.controlToken = null;
24
- this.inputDataFields = {};
25
- this.extraData = {};
26
- this.definitionObtained = false;
27
- this.formVisible = false;
43
+ this.visible = false;
28
44
  this.busy = false;
29
- this.formSectionsActivate = {};
30
- this.formSectionsInactivate = {};
31
- this.formActionsStart = {};
32
- this.formActionsFinish = {};
33
- this.fieldInputValidation = {};
34
- this.fieldValidationsStart = {};
35
- this.fieldValidationsFinish = {};
36
- // Callback de acciones de tablas
37
- this.tableSelectionsStart = {};
38
- this.tableSelectionsFinish = {};
39
- this.tableActionsStart = {};
40
- this.tableActionsFinish = {};
41
- this.tableGetDataStart = {};
42
- this.tableGetDataFinish = {};
43
45
  this._eventEmiter = this._eventManager;
44
46
  this.cleanStart();
45
47
  this.customPreProcessing();
46
48
  }
47
- assignFunctions() {
48
- var _a;
49
- const functionsMapped = [
50
- ['getCurrentState', 'getCurrentState'],
51
- ['getCurrentMode', 'getCurrentState'],
52
- ['getTitle', 'getTitle'],
53
- ['setTitle', 'setTitle'],
54
- ['getAction', 'getAction'],
55
- ['supportState', 'supportState'],
56
- ['getImmutableElement', 'getImmutableElement'],
57
- ['getExtraInfo', 'getExtraInfo'],
58
- ['cleanData', 'cleanData'],
59
- ['getFields', 'getFields'],
60
- ['getFieldNames', 'getFieldNames'],
61
- ['getField', 'getField'],
62
- ['enableField', 'enableField'],
63
- ['disableField', 'disableField'],
64
- ['getFieldValue', 'getFieldValue'],
65
- ['getFieldsValues', 'getFieldsValues'],
66
- ['getFieldOptions', 'getFieldOptions'],
67
- ['setFieldValue', 'setFieldValue'],
68
- ['setFieldRequired', 'setFieldRequired'],
69
- ['setFieldErrorMessage', 'setFieldErrorMessage'],
70
- ['setFieldError', 'setFieldError'],
71
- ['setFieldIntrinsicErrorMessage', 'setFieldIntrinsicErrorMessage'],
72
- ['setFieldOptions', 'setFieldOptions'],
73
- ['getFieldSet', 'getFieldSet'],
74
- ['applyProcessToFieldSet', 'applyProcessToFieldSet'],
75
- ['applyProcessToAllFields', 'applyProcessToFieldSet'],
76
- ['cleanFields', 'cleanFields'],
77
- ['getRequiredFields', 'getRequiredFields'],
78
- ['getRequiredEmptyFields', 'getRequiredEmptyFields'],
79
- ['getChangedFields', 'getChangedFields'],
80
- ['getFieldsWithValidationIssues', 'getFieldsWithValidationIssues'],
81
- ['tagFieldsWithError', 'tagFieldsWithError'],
82
- ['cleanErrorFields', 'cleanErrorFields'],
83
- ['showLabelFields', 'showLabelFields'],
84
- ['hideLabelFields', 'hideLabelFields'],
85
- ['enableFields', 'enableFields'],
86
- ['disableFields', 'disableFields'],
87
- ['enableEditFields', 'enableEditFields'],
88
- ['disableEditFields', 'disableEditFields'],
89
- ['showFields', 'showFields'],
90
- ['hideFields', 'hideFields'],
91
- ['getActionsByAttribute', 'getActionsByAttribute'],
92
- ['getAction', 'getAction'],
93
- ['showActions', 'showActions'],
94
- ['hideActions', 'hideActions'],
95
- ['enableActions', 'enableActions'],
96
- ['disableActions', 'disableActions'],
97
- ['showAction', 'showActions'],
98
- ['hideAction', 'hideActions'],
99
- ['enableAction', 'enableActions'],
100
- ['disableAction', 'disableActions'],
101
- ['activateSection', 'activateSection'],
102
- ['getSubSection', 'getSubSection'],
103
- ['getSection', 'getSection'],
104
- ['showSection', 'showSections'],
105
- ['hideSection', 'hideSections'],
106
- ['showSections', 'showSections'],
107
- ['hideSections', 'hideSections'],
108
- ['showSubSection', 'showSubSections'],
109
- ['hideSubSection', 'hideSubSections'],
110
- ['showSubSections', 'showSubSections'],
111
- ['hideSubSections', 'hideSubSections'],
112
- ['getTables', 'getTables'],
113
- ['getTable', 'getTable'],
114
- ['showTables', 'showTables'],
115
- ['hideTables', 'hideTables'],
116
- ['showTable', 'showTables'],
117
- ['hideTable', 'hideTables'],
118
- ['cleanTables', 'cleanTables'],
119
- ['cleanTable', 'cleanTables'],
120
- ['getTableRecord', 'getTableRecord'],
121
- ['changeState', 'changeState'],
122
- ];
123
- for (let index = 0; index < functionsMapped.length; index++) {
124
- const [name, structureName] = functionsMapped[index];
125
- this[name] = (_a = this.formStructure) === null || _a === void 0 ? void 0 : _a[structureName];
126
- }
49
+ getTitle() {
50
+ var _a;
51
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getTitle();
52
+ }
53
+ setTitle(title) {
54
+ var _a;
55
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setTitle(title);
56
+ }
57
+ cleanData() {
58
+ var _a;
59
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.cleanData();
60
+ }
61
+ getCurrentState() {
62
+ var _a;
63
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getCurrentState();
64
+ }
65
+ supportState(state) {
66
+ var _a;
67
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.supportState(state);
68
+ }
69
+ changeState(state) {
70
+ var _a;
71
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.changeState(state);
72
+ }
73
+ getStates() {
74
+ var _a;
75
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.states;
76
+ }
77
+ getImmutableElement(name) {
78
+ var _a;
79
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getImmutableElement(name);
80
+ }
81
+ getExtraInfo(name) {
82
+ var _a;
83
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getExtraInfo(name);
84
+ }
85
+ getFields() {
86
+ var _a;
87
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFields();
88
+ }
89
+ getFieldNames() {
90
+ var _a;
91
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldNames();
92
+ }
93
+ getField(code) {
94
+ var _a;
95
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getField(code);
96
+ }
97
+ enableField(code) {
98
+ var _a;
99
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.enableField(code);
100
+ }
101
+ disableField(code) {
102
+ var _a;
103
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.disableField(code);
104
+ }
105
+ getFieldValue(code) {
106
+ var _a;
107
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldValue(code);
108
+ }
109
+ getFieldsValues(codes) {
110
+ var _a;
111
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldsValues(codes);
112
+ }
113
+ getFieldOptions(code) {
114
+ var _a;
115
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldOptions(code);
116
+ }
117
+ setFieldValue(code, value) {
118
+ var _a;
119
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldValue(code, value);
120
+ }
121
+ setFieldRequired(code, required) {
122
+ var _a;
123
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldRequired(code, required);
124
+ }
125
+ setFieldErrorMessage(code, errorMessage) {
126
+ var _a;
127
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldErrorMessage(code, errorMessage);
128
+ }
129
+ setFieldError(code, message, type) {
130
+ var _a;
131
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldError(code, message, type);
132
+ }
133
+ setFieldIntrinsicErrorMessage(code, message) {
134
+ var _a;
135
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldIntrinsicErrorMessage(code, message);
136
+ }
137
+ setFieldOptions(code, optionsArray, idAttribute, nameAttribute) {
138
+ var _a;
139
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.setFieldOptions(code, optionsArray, idAttribute, nameAttribute);
140
+ }
141
+ getFieldSet(filterFunc, codes, secCode, subCode) {
142
+ var _a;
143
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldSet(filterFunc, codes, secCode, subCode);
144
+ }
145
+ applyOnFields(processFunc, codes, secCode, subCode) {
146
+ var _a;
147
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.applyOnFields(processFunc, codes, secCode, subCode);
148
+ }
149
+ applyProcessToAllFields(processFunc) {
150
+ var _a;
151
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.applyOnFields(processFunc);
152
+ }
153
+ cleanFields(codes, secCode, subCode) {
154
+ var _a;
155
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.cleanFields(codes, secCode, subCode);
156
+ }
157
+ getRequiredFields(codes, secCode, subCode) {
158
+ var _a;
159
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getRequiredFields(codes, secCode, subCode);
160
+ }
161
+ getRequiredEmptyFields(codes, secCode, subCode) {
162
+ var _a;
163
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getRequiredEmptyFields(codes, secCode, subCode);
164
+ }
165
+ getChangedFields(codes, secCode, subCode) {
166
+ var _a;
167
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getChangedFields(codes, secCode, subCode);
168
+ }
169
+ getFieldsWithValidationIssues(codes, secCode, subCode) {
170
+ var _a;
171
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getFieldsWithValidationIssues(codes, secCode, subCode);
172
+ }
173
+ tagFieldsWithError(errorMessage, codes, secCode, subCode) {
174
+ var _a;
175
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.tagFieldsWithError(errorMessage, codes, secCode, subCode);
176
+ }
177
+ cleanErrorFields(codes, secCode, subCode) {
178
+ var _a;
179
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.cleanErrorFields(codes, secCode, subCode);
180
+ }
181
+ showLabelFields(codes, secCode, subCode) {
182
+ var _a;
183
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showLabelFields(codes, secCode, subCode);
184
+ }
185
+ hideLabelFields(codes, secCode, subCode) {
186
+ var _a;
187
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideLabelFields(codes, secCode, subCode);
188
+ }
189
+ enableFields(codes, secCode, subCode) {
190
+ var _a;
191
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.enableFields(codes, secCode, subCode);
192
+ }
193
+ disableFields(codes, secCode, subCode) {
194
+ var _a;
195
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.disableFields(codes, secCode, subCode);
196
+ }
197
+ /**
198
+ * @deprecated Use enableFields
199
+ */
200
+ enableEditFields(codes, secCode, subCode) {
201
+ return this.enableFields(codes, secCode, subCode);
202
+ }
203
+ /**
204
+ * @deprecated Use disableFields
205
+ */
206
+ disableEditFields(codes, secCode, subCode) {
207
+ return this.disableFields(codes, secCode, subCode);
208
+ }
209
+ showFields(codes, secCode, subCode) {
210
+ var _a;
211
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showFields(codes, secCode, subCode);
212
+ }
213
+ hideFields(codes, secCode, subCode) {
214
+ var _a;
215
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideFields(codes, secCode, subCode);
216
+ }
217
+ getActionsByAttribute(name, value) {
218
+ var _a;
219
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getActionsByAttribute(name, value);
220
+ }
221
+ getHeaderActions() {
222
+ var _a;
223
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getActionsByAttribute('location', HEADER);
224
+ }
225
+ getAction(actionCode) {
226
+ var _a;
227
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getAction(actionCode);
228
+ }
229
+ showActions(actionArray) {
230
+ var _a;
231
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showActions(actionArray);
232
+ }
233
+ hideActions(actionArray) {
234
+ var _a;
235
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideActions(actionArray);
236
+ }
237
+ enableActions(actionArray) {
238
+ var _a;
239
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.enableActions(actionArray);
240
+ }
241
+ disableActions(actionArray) {
242
+ var _a;
243
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.disableActions(actionArray);
244
+ }
245
+ showAction(code) {
246
+ var _a;
247
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showActions(code);
248
+ }
249
+ hideAction(code) {
250
+ var _a;
251
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideActions(code);
252
+ }
253
+ enableAction(code) {
254
+ var _a;
255
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.enableActions(code);
256
+ }
257
+ disableAction(code) {
258
+ var _a;
259
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.disableActions(code);
260
+ }
261
+ getSections() {
262
+ var _a;
263
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getSections();
264
+ }
265
+ activateSection(code) {
266
+ var _a;
267
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.activateSection(code);
268
+ }
269
+ getSectionsTitles() {
270
+ var _a;
271
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getSections().map(sec => sec.title);
272
+ }
273
+ getSection(code) {
274
+ var _a;
275
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getSection(code);
276
+ }
277
+ showSection(code) {
278
+ var _a;
279
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showSections(code);
280
+ }
281
+ hideSection(code) {
282
+ var _a;
283
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideSections(code);
284
+ }
285
+ showSections(codes) {
286
+ var _a;
287
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showSections(codes);
288
+ }
289
+ hideSections(codes) {
290
+ var _a;
291
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideSections(codes);
292
+ }
293
+ getSubSection(code, subCode) {
294
+ var _a;
295
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getSubSection(code, subCode);
296
+ }
297
+ showSubSection(code, subCode) {
298
+ var _a;
299
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showSubSections(code, subCode);
300
+ }
301
+ hideSubSection(code, subCode) {
302
+ var _a;
303
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideSubSections(code, subCode);
304
+ }
305
+ showSubSections(code, subCodes) {
306
+ var _a;
307
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showSubSections(code, subCodes);
308
+ }
309
+ hideSubSections(code, subCodes) {
310
+ var _a;
311
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideSubSections(code, subCodes);
312
+ }
313
+ getTables() {
314
+ var _a;
315
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getTables();
316
+ }
317
+ showTables(codes) {
318
+ var _a;
319
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showTables(codes);
320
+ }
321
+ hideTables(codes) {
322
+ var _a;
323
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideTables(codes);
324
+ }
325
+ cleanTables(codes) {
326
+ var _a;
327
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.cleanTables(codes);
328
+ }
329
+ getTable(code) {
330
+ var _a;
331
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getTable(code);
332
+ }
333
+ showTable(code) {
334
+ var _a;
335
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.showTables(code);
336
+ }
337
+ hideTable(code) {
338
+ var _a;
339
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.hideTables(code);
340
+ }
341
+ cleanTable(code) {
342
+ var _a, _b;
343
+ return (_b = (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getTable(code)) === null || _b === void 0 ? void 0 : _b.clean();
344
+ }
345
+ getTableRecord(code, recordId) {
346
+ var _a;
347
+ return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.getTableRecord(code, recordId);
127
348
  }
128
349
  setConfig(formConfig) {
129
350
  this.formConfig = formConfig;
@@ -133,41 +354,42 @@ export class BasicFormComponent {
133
354
  this.errorCode = '';
134
355
  this.errorMessage = '';
135
356
  this.errorDetail = '';
136
- this.formStructure = null;
357
+ this._formStructure = null;
137
358
  this.fields = null;
138
359
  this.actions = null;
139
- this.controlToken = null;
360
+ this._controlToken = null;
140
361
  this.inputDataFields = {};
141
- this.definitionObtained = false;
362
+ this._definitionObtained = false;
142
363
  // Se limpian los manejadores de eventos
143
- this.formVisible = false;
364
+ this.visible = false;
144
365
  this.busy = false;
145
- this.formSectionsActivate = {};
146
- this.formSectionsInactivate = {};
147
- this.formActionsStart = {};
148
- this.formActionsFinish = {};
149
- this.fieldInputValidation = {};
150
- this.fieldValidationsStart = {};
151
- this.fieldValidationsFinish = {};
152
- this.tableSelectionsStart = {};
153
- this.tableSelectionsFinish = {};
154
- this.tableActionsStart = {};
155
- this.tableActionsFinish = {};
156
- this.tableGetDataStart = {};
157
- this.tableGetDataFinish = {};
158
- }
366
+ this._formSectionsActivate = {};
367
+ this._formSectionsInactivate = {};
368
+ this._formActionsStart = {};
369
+ this._formActionsFinish = {};
370
+ this._fieldInputValidation = {};
371
+ this._fieldValidationsStart = {};
372
+ this._fieldValidationsFinish = {};
373
+ this._tableSelectionsStart = {};
374
+ this._tableSelectionsFinish = {};
375
+ this._tableActionsStart = {};
376
+ this._tableActionsFinish = {};
377
+ this._tableGetDataStart = {};
378
+ this._tableGetDataFinish = {};
379
+ }
380
+ get formVisible() { return this.visible; }
159
381
  get formManager() { return this; }
160
382
  get formCode() { return this.name; }
161
383
  set formCode(name) { this.name = name; }
162
384
  get inServerProcess() { return this.busy; }
163
- get form() { return this.formStructure; }
164
- get visibleSections() { return this.formStructure.visibleSections; }
165
- get currentState() { return this.formStructure.state; }
166
- set currentState(state) { this.formStructure.changeState(state); }
167
- get currentMode() { return this.currentState; }
168
- get immutableData() { return this.formStructure.immutableData; }
169
- get extraInfo() { return this.formStructure.extraInfo; }
385
+ get form() { return this._formStructure; }
170
386
  get state() { return this.getCurrentState(); }
387
+ get currentState() { var _a; return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.state; }
388
+ set currentState(state) { this._formStructure.changeState(state); }
389
+ get currentMode() { return this.currentState; }
390
+ get immutableData() { var _a; return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.immutableData; }
391
+ get extraInfo() { var _a; return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.extraInfo; }
392
+ get visibleSections() { var _a; return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.visibleSections; }
171
393
  get formRoute() { return this._formRoute; }
172
394
  set formRoute(route) { this._formRoute = route; }
173
395
  get subject() { return this.formSubject; }
@@ -216,7 +438,7 @@ export class BasicFormComponent {
216
438
  * @deprecated Use subject
217
439
  */
218
440
  getformSubject() { return this.getSubject(); }
219
- numSections() { return this.formStructure.sections.length; }
441
+ numSections() { var _a; return (_a = this._formStructure) === null || _a === void 0 ? void 0 : _a.sections.length; }
220
442
  subscribeAppEvent(eventName, callback) {
221
443
  this._eventEmiter.subscribe(eventName, callback);
222
444
  }
@@ -224,7 +446,7 @@ export class BasicFormComponent {
224
446
  var _a, _b, _c, _d, _e, _f, _g, _h;
225
447
  let origin = null;
226
448
  if (!cleanStack) {
227
- origin = Object.assign(Object.assign({}, backData), { name: this.name, url: this._formRoute, token: this.controlToken });
449
+ origin = Object.assign(Object.assign({}, backData), { name: this.name, url: this._formRoute, token: this._controlToken });
228
450
  origin.subject = (_a = origin === null || origin === void 0 ? void 0 : origin.subject) !== null && _a !== void 0 ? _a : this.formSubject;
229
451
  origin.state = (_b = origin === null || origin === void 0 ? void 0 : origin.state) !== null && _b !== void 0 ? _b : this.currentState;
230
452
  origin.fields = (_c = origin === null || origin === void 0 ? void 0 : origin.fields) !== null && _c !== void 0 ? _c : {};
@@ -237,10 +459,10 @@ export class BasicFormComponent {
237
459
  target.extra = (_h = target === null || target === void 0 ? void 0 : target.extra) !== null && _h !== void 0 ? _h : {};
238
460
  this.formManagerService.openForm(origin, target);
239
461
  }
240
- canGoBack() { return this.originToken !== null; }
462
+ canGoBack() { return this._originToken !== null; }
241
463
  goBack() { return this.formManagerService.backTo(); }
242
464
  goBackForm() { return this.goBack(); }
243
- getOriginDetail() { return this.formManagerService.getFormInfo(this.originToken); }
465
+ getOriginDetail() { return this.formManagerService.getFormInfo(this._originToken); }
244
466
  setError(errorType, errorMessage, errorDetail) {
245
467
  this._errorType = errorType || '';
246
468
  this.errorMessage = errorMessage || '';
@@ -257,19 +479,19 @@ export class BasicFormComponent {
257
479
  }
258
480
  preocessInputParams(params) {
259
481
  var _a, _b, _c;
260
- this.controlToken = (_a = params === null || params === void 0 ? void 0 : params[TOKEN]) !== null && _a !== void 0 ? _a : null;
261
- const { token, subject, state, fields, extra, originToken } = this.formManagerService.getFormInfo(this.controlToken);
262
- if (!this.controlToken || this.controlToken !== token) {
263
- return;
482
+ this._controlToken = (_a = params === null || params === void 0 ? void 0 : params[TOKEN]) !== null && _a !== void 0 ? _a : null;
483
+ const { token, subject, state, fields, extra, originToken } = this.formManagerService.getFormInfo(this._controlToken);
484
+ if (!this._controlToken || this._controlToken !== token) {
485
+ return null;
264
486
  }
265
487
  this.formSubject = (_c = (_b = params === null || params === void 0 ? void 0 : params[SUBJECT]) !== null && _b !== void 0 ? _b : subject) !== null && _c !== void 0 ? _c : null;
266
488
  this.inputDataFields = fields;
267
489
  this.extraData = extra;
268
- this.originToken = originToken;
490
+ this._originToken = originToken;
269
491
  return state;
270
492
  }
271
493
  subscribeSectionActivation() {
272
- const formSections = this.formStructure.sections;
494
+ const formSections = this._formStructure.sections;
273
495
  if (Array.isArray(formSections)) {
274
496
  formSections.forEach(section => {
275
497
  section.activation.subscribe(code => this.launchSectionActivation(code));
@@ -278,7 +500,7 @@ export class BasicFormComponent {
278
500
  }
279
501
  }
280
502
  subscribeFieldsSubjects() {
281
- const formFields = this.formStructure.getFields();
503
+ const formFields = this._formStructure.getFields();
282
504
  if (Array.isArray(formFields)) {
283
505
  formFields.forEach(field => {
284
506
  field.editionFinish.subscribe(event => {
@@ -294,7 +516,7 @@ export class BasicFormComponent {
294
516
  }
295
517
  }
296
518
  subscribeActionSubjects() {
297
- const formActions = this.formStructure.getActions();
519
+ const formActions = this._formStructure.getActions();
298
520
  if (Array.isArray(formActions)) {
299
521
  formActions.forEach(action => {
300
522
  action.actionActivated.subscribe(code => this.startAction(code));
@@ -302,7 +524,7 @@ export class BasicFormComponent {
302
524
  }
303
525
  }
304
526
  subscribeTableSubjects() {
305
- const formTables = this.formStructure.getTables();
527
+ const formTables = this._formStructure.getTables();
306
528
  if (Array.isArray(formTables)) {
307
529
  formTables.forEach(table => {
308
530
  table.inlineActionTrigger.subscribe(event => this.startTableAction(event));
@@ -319,22 +541,22 @@ export class BasicFormComponent {
319
541
  if (!this.name) {
320
542
  return;
321
543
  }
322
- if (!this.definitionObtained) {
544
+ if (!this._definitionObtained) {
323
545
  this.busy = true;
324
546
  const formDefinition = yield this.formManagerService.getFormDefinition(this.name);
325
547
  this.busy = false;
326
- this.formStructure = new FormStructureAndData(formDefinition, this.formConfig);
327
- this.fields = this.formStructure.fields;
328
- this.actions = this.formStructure.actions;
329
- this.definitionObtained = true;
548
+ this._formStructure = new FormStructureAndData(formDefinition, this.formConfig);
549
+ this.fields = this._formStructure.fields;
550
+ this.actions = this._formStructure.actions;
551
+ this._definitionObtained = true;
330
552
  }
331
553
  else {
332
554
  this.cleanData();
333
555
  }
334
556
  if (!this.supportState(initialState)) {
335
- initialState = this.formStructure.defaultState;
557
+ initialState = this._formStructure.defaultState;
336
558
  }
337
- this.formStructure.changeState(initialState || this.formStructure.defaultState);
559
+ this._formStructure.changeState(initialState || this._formStructure.defaultState);
338
560
  const inputFieldNames = Object.keys(this.inputDataFields);
339
561
  for (let index = 0; index < inputFieldNames.length; index++) {
340
562
  const fieldCode = inputFieldNames[index];
@@ -343,7 +565,7 @@ export class BasicFormComponent {
343
565
  }
344
566
  const recordResponse = yield this.requestFormAction(formActions.getData);
345
567
  this.checkErrorRecordReceived(recordResponse);
346
- this.formVisible = true;
568
+ this.visible = true;
347
569
  this.subscribeSectionActivation();
348
570
  this.subscribeFieldsSubjects();
349
571
  this.subscribeActionSubjects();
@@ -359,6 +581,7 @@ export class BasicFormComponent {
359
581
  this.errorCode = recordResponse.errorCode;
360
582
  this.errorMessage = recordResponse.errorMessage;
361
583
  this.errorDetail = recordResponse.errorDetail;
584
+ return true;
362
585
  }
363
586
  errorOccured() {
364
587
  return (this.errorCode !== NO_ERROR);
@@ -371,12 +594,12 @@ export class BasicFormComponent {
371
594
  const actionDetail = {
372
595
  formCode: this.name,
373
596
  formSubject: this.formSubject,
374
- currentMode: this.formStructure.state,
597
+ currentMode: this._formStructure.state,
375
598
  actionCode,
376
599
  actionSubject,
377
600
  version: PAYLOAD_VERSION,
378
- formData: this.formStructure.getPayload(),
379
- immutableData: this.formStructure.immutableData,
601
+ formData: this._formStructure.getPayload(),
602
+ immutableData: this._formStructure.immutableData,
380
603
  };
381
604
  this.errorCode = NO_ERROR;
382
605
  this.errorMessage = '';
@@ -431,55 +654,55 @@ export class BasicFormComponent {
431
654
  if (returnedFile && returnedFile.file) {
432
655
  this.fileMgmtServices.saveFile(returnedFile.file, returnedFile.name, returnedFile.type);
433
656
  }
434
- this.formStructure.immutableData = immutableData;
435
- this.formStructure.extraInfo = extraInfo;
657
+ this._formStructure.immutableData = immutableData;
658
+ this._formStructure.extraInfo = extraInfo;
436
659
  }
437
660
  /**
438
661
  * Manejo de event handlers para acciones sobre el formulario
439
662
  */
440
- addSectionActivation(sections, callbackMethod) {
441
- const sectionSet = (Array.isArray(sections)) ? sections : [sections];
663
+ addSectionActivation(sectionCodes, callbackMethod) {
664
+ const sectionSet = (Array.isArray(sectionCodes)) ? sectionCodes : [sectionCodes];
442
665
  sectionSet.forEach((sectionName) => {
443
- if (!this.formSectionsActivate[sectionName]) {
444
- this.formSectionsActivate[sectionName] = [];
666
+ if (!this._formSectionsActivate[sectionName]) {
667
+ this._formSectionsActivate[sectionName] = [];
445
668
  }
446
- this.formSectionsActivate[sectionName].push(callbackMethod);
669
+ this._formSectionsActivate[sectionName].push(callbackMethod);
447
670
  });
448
671
  }
449
- addSectionInactivation(sections, callbackMethod) {
450
- const sectionSet = (Array.isArray(sections)) ? sections : [sections];
672
+ addSectionInactivation(sectionCodes, callbackMethod) {
673
+ const sectionSet = (Array.isArray(sectionCodes)) ? sectionCodes : [sectionCodes];
451
674
  sectionSet.forEach((sectionName) => {
452
- if (!this.formSectionsInactivate[sectionName]) {
453
- this.formSectionsInactivate[sectionName] = [];
675
+ if (!this._formSectionsInactivate[sectionName]) {
676
+ this._formSectionsInactivate[sectionName] = [];
454
677
  }
455
- this.formSectionsInactivate[sectionName].push(callbackMethod);
678
+ this._formSectionsInactivate[sectionName].push(callbackMethod);
456
679
  });
457
680
  }
458
681
  addActionMethodStart(actions, callbackMethod) {
459
682
  const actionSet = (Array.isArray(actions)) ? actions : [actions];
460
683
  actionSet.forEach((actionName) => {
461
- if (!this.formActionsStart[actionName]) {
462
- this.formActionsStart[actionName] = [];
684
+ if (!this._formActionsStart[actionName]) {
685
+ this._formActionsStart[actionName] = [];
463
686
  }
464
- this.formActionsStart[actionName].push(callbackMethod);
687
+ this._formActionsStart[actionName].push(callbackMethod);
465
688
  });
466
689
  }
467
690
  addActionMethodFinish(actions, callbackMethod) {
468
691
  const actionSet = (Array.isArray(actions)) ? actions : [actions];
469
692
  actionSet.forEach((actionName) => {
470
- if (!this.formActionsFinish[actionName]) {
471
- this.formActionsFinish[actionName] = [];
693
+ if (!this._formActionsFinish[actionName]) {
694
+ this._formActionsFinish[actionName] = [];
472
695
  }
473
- this.formActionsFinish[actionName].push(callbackMethod);
696
+ this._formActionsFinish[actionName].push(callbackMethod);
474
697
  });
475
698
  }
476
- launchSectionActivation(sectionCode) {
699
+ launchSectionActivation(code) {
477
700
  return __awaiter(this, void 0, void 0, function* () {
478
- const sectionObject = this.formStructure.getSection(sectionCode);
701
+ const sectionObject = this._formStructure.getSection(code);
479
702
  if (!sectionObject) {
480
703
  return;
481
704
  }
482
- const clientSectionMethods = this.formSectionsActivate[sectionCode];
705
+ const clientSectionMethods = this._formSectionsActivate[code];
483
706
  if (clientSectionMethods) {
484
707
  for (const clientSectionMethod of clientSectionMethods) {
485
708
  clientSectionMethod(sectionObject);
@@ -487,13 +710,13 @@ export class BasicFormComponent {
487
710
  }
488
711
  });
489
712
  }
490
- launchSectionInactivation(sectionCode) {
713
+ launchSectionInactivation(code) {
491
714
  return __awaiter(this, void 0, void 0, function* () {
492
- const sectionObject = this.formStructure.getSection(sectionCode);
715
+ const sectionObject = this._formStructure.getSection(code);
493
716
  if (!sectionObject) {
494
717
  return;
495
718
  }
496
- const clientSectionMethods = this.formSectionsInactivate[sectionCode];
719
+ const clientSectionMethods = this._formSectionsInactivate[code];
497
720
  if (clientSectionMethods) {
498
721
  for (const clientSectionMethod of clientSectionMethods) {
499
722
  clientSectionMethod(sectionObject);
@@ -501,15 +724,15 @@ export class BasicFormComponent {
501
724
  }
502
725
  });
503
726
  }
504
- startAction(actionCode) {
727
+ startAction(code) {
505
728
  return __awaiter(this, void 0, void 0, function* () {
506
- const actionObject = this.getAction(actionCode);
729
+ const actionObject = this.getAction(code);
507
730
  if (!actionObject) {
508
731
  return;
509
732
  }
510
733
  this.resetError();
511
734
  actionObject.start();
512
- const clientActionMethods = this.formActionsStart[actionCode];
735
+ const clientActionMethods = this._formActionsStart[code];
513
736
  if (clientActionMethods) {
514
737
  const clientActionPromises = [];
515
738
  for (const clientActionMethod of clientActionMethods) {
@@ -546,20 +769,20 @@ export class BasicFormComponent {
546
769
  action.stop();
547
770
  });
548
771
  }
549
- finishAction(actionObject, actionResult) {
772
+ finishAction(action, actionResult) {
550
773
  return __awaiter(this, void 0, void 0, function* () {
551
- const finishActionMethods = this.formActionsFinish[actionObject.actionCode];
774
+ const finishActionMethods = this._formActionsFinish[action.actionCode];
552
775
  if (finishActionMethods) {
553
776
  const clientActionPromises = [];
554
777
  for (const clientActionMethod of finishActionMethods) {
555
- clientActionPromises.push(clientActionMethod(actionObject, actionResult));
778
+ clientActionPromises.push(clientActionMethod(action, actionResult));
556
779
  }
557
780
  yield Promise.all(clientActionPromises);
558
781
  }
559
782
  });
560
783
  }
561
- completeGlobalAction(actionObject) {
562
- return this.startServerAction(actionObject);
784
+ completeGlobalAction(action) {
785
+ return this.startServerAction(action);
563
786
  }
564
787
  /**
565
788
  * Manejadores de eventos para validaciones sobre campos
@@ -567,28 +790,28 @@ export class BasicFormComponent {
567
790
  addFieldInputValidation(fields, callbackMethod) {
568
791
  const fieldSet = (Array.isArray(fields)) ? fields : [fields];
569
792
  fieldSet.forEach((fieldCode) => {
570
- if (!this.fieldInputValidation[fieldCode]) {
571
- this.fieldInputValidation[fieldCode] = [];
793
+ if (!this._fieldInputValidation[fieldCode]) {
794
+ this._fieldInputValidation[fieldCode] = [];
572
795
  }
573
- this.fieldInputValidation[fieldCode].push(callbackMethod);
796
+ this._fieldInputValidation[fieldCode].push(callbackMethod);
574
797
  });
575
798
  }
576
799
  addFieldValidationStart(fields, callbackMethod) {
577
800
  const fieldSet = (Array.isArray(fields)) ? fields : [fields];
578
801
  fieldSet.forEach((fieldCode) => {
579
- if (!this.fieldValidationsStart[fieldCode]) {
580
- this.fieldValidationsStart[fieldCode] = [];
802
+ if (!this._fieldValidationsStart[fieldCode]) {
803
+ this._fieldValidationsStart[fieldCode] = [];
581
804
  }
582
- this.fieldValidationsStart[fieldCode].push(callbackMethod);
805
+ this._fieldValidationsStart[fieldCode].push(callbackMethod);
583
806
  });
584
807
  }
585
808
  addFieldValidationFinish(fields, callbackMethod) {
586
809
  const fieldSet = (Array.isArray(fields)) ? fields : [fields];
587
810
  fieldSet.forEach((fieldCode) => {
588
- if (!this.fieldValidationsFinish[fieldCode]) {
589
- this.fieldValidationsFinish[fieldCode] = [];
811
+ if (!this._fieldValidationsFinish[fieldCode]) {
812
+ this._fieldValidationsFinish[fieldCode] = [];
590
813
  }
591
- this.fieldValidationsFinish[fieldCode].push(callbackMethod);
814
+ this._fieldValidationsFinish[fieldCode].push(callbackMethod);
592
815
  });
593
816
  }
594
817
  startFieldInputValidation(fieldCode, intrinsicValidation = true) {
@@ -598,7 +821,7 @@ export class BasicFormComponent {
598
821
  return false;
599
822
  }
600
823
  fieldToValidate.resetError();
601
- const validationCallbacks = this.fieldInputValidation[fieldCode];
824
+ const validationCallbacks = this._fieldInputValidation[fieldCode];
602
825
  if (validationCallbacks) {
603
826
  const clientValidationPromises = [];
604
827
  for (const validationMethod of validationCallbacks) {
@@ -616,7 +839,7 @@ export class BasicFormComponent {
616
839
  return;
617
840
  }
618
841
  fieldToValidate.resetError();
619
- const validationCallbacks = this.fieldValidationsStart[fieldCode];
842
+ const validationCallbacks = this._fieldValidationsStart[fieldCode];
620
843
  if (validationCallbacks) {
621
844
  const clientValidationPromises = [];
622
845
  for (const validationMethod of validationCallbacks) {
@@ -657,7 +880,7 @@ export class BasicFormComponent {
657
880
  }
658
881
  finishFieldValidation(fieldObject, validationResult) {
659
882
  return __awaiter(this, void 0, void 0, function* () {
660
- const validationCallbacks = this.fieldValidationsFinish[fieldObject.fieldCode];
883
+ const validationCallbacks = this._fieldValidationsFinish[fieldObject.fieldCode];
661
884
  if (validationCallbacks) {
662
885
  const clientActionPromises = [];
663
886
  for (const validationMethod of validationCallbacks) {
@@ -685,12 +908,12 @@ export class BasicFormComponent {
685
908
  return;
686
909
  }
687
910
  let tableEventHandlers = null;
688
- if (this.tableActionsStart[tableName]) {
689
- tableEventHandlers = this.tableActionsStart[tableName];
911
+ if (this._tableActionsStart[tableName]) {
912
+ tableEventHandlers = this._tableActionsStart[tableName];
690
913
  }
691
914
  else {
692
915
  tableEventHandlers = {};
693
- this.tableActionsStart[tableName] = tableEventHandlers;
916
+ this._tableActionsStart[tableName] = tableEventHandlers;
694
917
  }
695
918
  if (!tableEventHandlers[actionCode]) {
696
919
  tableEventHandlers[actionCode] = [];
@@ -707,12 +930,12 @@ export class BasicFormComponent {
707
930
  return;
708
931
  }
709
932
  let tableEventHandlers = null;
710
- if (this.tableActionsFinish[tableName]) {
711
- tableEventHandlers = this.tableActionsFinish[tableName];
933
+ if (this._tableActionsFinish[tableName]) {
934
+ tableEventHandlers = this._tableActionsFinish[tableName];
712
935
  }
713
936
  else {
714
937
  tableEventHandlers = {};
715
- this.tableActionsFinish[tableName] = tableEventHandlers;
938
+ this._tableActionsFinish[tableName] = tableEventHandlers;
716
939
  }
717
940
  if (!tableEventHandlers[actionCode]) {
718
941
  tableEventHandlers[actionCode] = [];
@@ -725,12 +948,12 @@ export class BasicFormComponent {
725
948
  return;
726
949
  }
727
950
  let tableEventHandlers = null;
728
- if (this.tableSelectionsStart[tableName]) {
729
- tableEventHandlers = this.tableSelectionsStart[tableName];
951
+ if (this._tableSelectionsStart[tableName]) {
952
+ tableEventHandlers = this._tableSelectionsStart[tableName];
730
953
  }
731
954
  else {
732
955
  tableEventHandlers = [];
733
- this.tableSelectionsStart[tableName] = tableEventHandlers;
956
+ this._tableSelectionsStart[tableName] = tableEventHandlers;
734
957
  }
735
958
  tableEventHandlers.push(callbackMethod);
736
959
  }
@@ -740,12 +963,12 @@ export class BasicFormComponent {
740
963
  return;
741
964
  }
742
965
  let tableEventHandlers = null;
743
- if (this.tableSelectionsFinish[tableName]) {
744
- tableEventHandlers = this.tableSelectionsFinish[tableName];
966
+ if (this._tableSelectionsFinish[tableName]) {
967
+ tableEventHandlers = this._tableSelectionsFinish[tableName];
745
968
  }
746
969
  else {
747
970
  tableEventHandlers = [];
748
- this.tableSelectionsFinish[tableName] = tableEventHandlers;
971
+ this._tableSelectionsFinish[tableName] = tableEventHandlers;
749
972
  }
750
973
  tableEventHandlers.push(callbackMethod);
751
974
  }
@@ -755,12 +978,12 @@ export class BasicFormComponent {
755
978
  return;
756
979
  }
757
980
  let tableEventHandlers = null;
758
- if (this.tableGetDataStart[tableName]) {
759
- tableEventHandlers = this.tableGetDataStart[tableName];
981
+ if (this._tableGetDataStart[tableName]) {
982
+ tableEventHandlers = this._tableGetDataStart[tableName];
760
983
  }
761
984
  else {
762
985
  tableEventHandlers = [];
763
- this.tableGetDataStart[tableName] = tableEventHandlers;
986
+ this._tableGetDataStart[tableName] = tableEventHandlers;
764
987
  }
765
988
  tableEventHandlers.push(callbackMethod);
766
989
  }
@@ -770,12 +993,12 @@ export class BasicFormComponent {
770
993
  return;
771
994
  }
772
995
  let tableEventHandlers = null;
773
- if (this.tableGetDataFinish[tableName]) {
774
- tableEventHandlers = this.tableGetDataFinish[tableName];
996
+ if (this._tableGetDataFinish[tableName]) {
997
+ tableEventHandlers = this._tableGetDataFinish[tableName];
775
998
  }
776
999
  else {
777
1000
  tableEventHandlers = {};
778
- this.tableGetDataFinish[tableName] = tableEventHandlers;
1001
+ this._tableGetDataFinish[tableName] = tableEventHandlers;
779
1002
  }
780
1003
  tableEventHandlers[GET_DATA_ACTION] = callbackMethod;
781
1004
  }
@@ -797,7 +1020,7 @@ export class BasicFormComponent {
797
1020
  tableCode,
798
1021
  actionCode,
799
1022
  };
800
- const tableEventHandlers = this.tableActionsStart[tableCode];
1023
+ const tableEventHandlers = this._tableActionsStart[tableCode];
801
1024
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
802
1025
  if (tableActionMethods) {
803
1026
  const clientActionPromises = [];
@@ -846,7 +1069,7 @@ export class BasicFormComponent {
846
1069
  finishTableGlobalAction(tableActionDetail, actionResult) {
847
1070
  return __awaiter(this, void 0, void 0, function* () {
848
1071
  const { tableCode, actionCode } = tableActionDetail;
849
- const tableEventHandlers = this.tableActionsFinish[tableCode];
1072
+ const tableEventHandlers = this._tableActionsFinish[tableCode];
850
1073
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
851
1074
  if (tableActionMethods) {
852
1075
  const clientActionPromises = [];
@@ -878,7 +1101,7 @@ export class BasicFormComponent {
878
1101
  recordId,
879
1102
  recordData
880
1103
  };
881
- const tableEventHandlers = this.tableActionsStart[tableCode];
1104
+ const tableEventHandlers = this._tableActionsStart[tableCode];
882
1105
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
883
1106
  if (tableActionMethods) {
884
1107
  const clientActionPromises = [];
@@ -932,7 +1155,7 @@ export class BasicFormComponent {
932
1155
  finishTableAction(tableActionDetail, actionResult) {
933
1156
  return __awaiter(this, void 0, void 0, function* () {
934
1157
  const { tableCode, actionCode } = tableActionDetail;
935
- const tableEventHandlers = this.tableActionsFinish[tableCode];
1158
+ const tableEventHandlers = this._tableActionsFinish[tableCode];
936
1159
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
937
1160
  if (tableActionMethods) {
938
1161
  const clientActionPromises = [];
@@ -958,7 +1181,7 @@ export class BasicFormComponent {
958
1181
  recordId,
959
1182
  recordData
960
1183
  };
961
- const tableEventHandlers = this.tableSelectionsStart[tableCode];
1184
+ const tableEventHandlers = this._tableSelectionsStart[tableCode];
962
1185
  if (tableEventHandlers) {
963
1186
  const clientActionPromises = [];
964
1187
  for (const tableSelectionMethod of tableEventHandlers) {
@@ -1007,7 +1230,7 @@ export class BasicFormComponent {
1007
1230
  finishTableRecordSelection(tableSelectionDetail, actionResult) {
1008
1231
  return __awaiter(this, void 0, void 0, function* () {
1009
1232
  const { tableCode } = tableSelectionDetail;
1010
- const tableEventHandlers = this.tableSelectionsFinish[tableCode];
1233
+ const tableEventHandlers = this._tableSelectionsFinish[tableCode];
1011
1234
  if (tableEventHandlers) {
1012
1235
  const clientActionPromises = [];
1013
1236
  for (const tableSelectionMethod of tableEventHandlers) {
@@ -1037,7 +1260,7 @@ export class BasicFormComponent {
1037
1260
  actionCode,
1038
1261
  selectedRecords
1039
1262
  };
1040
- const tableEventHandlers = this.tableActionsStart[tableCode];
1263
+ const tableEventHandlers = this._tableActionsStart[tableCode];
1041
1264
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
1042
1265
  if (tableActionMethods) {
1043
1266
  const clientActionPromises = [];
@@ -1087,7 +1310,7 @@ export class BasicFormComponent {
1087
1310
  finishTableSelectionAction(tableActionDetail, actionResult) {
1088
1311
  return __awaiter(this, void 0, void 0, function* () {
1089
1312
  const { tableCode, actionCode } = tableActionDetail;
1090
- const tableEventHandlers = this.tableActionsFinish[tableCode];
1313
+ const tableEventHandlers = this._tableActionsFinish[tableCode];
1091
1314
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
1092
1315
  if (tableActionMethods) {
1093
1316
  const clientActionPromises = [];
@@ -1107,7 +1330,7 @@ export class BasicFormComponent {
1107
1330
  tableCode
1108
1331
  };
1109
1332
  this.resetError();
1110
- const tableEventHandlers = this.tableGetDataStart[tableCode];
1333
+ const tableEventHandlers = this._tableGetDataStart[tableCode];
1111
1334
  if (tableEventHandlers) {
1112
1335
  const clientActionPromises = [];
1113
1336
  for (const tableActionMethod of tableEventHandlers) {
@@ -1142,7 +1365,7 @@ export class BasicFormComponent {
1142
1365
  finishTableGetData(tableActionDetail, actionResult) {
1143
1366
  return __awaiter(this, void 0, void 0, function* () {
1144
1367
  const { tableCode, tableActionCode } = tableActionDetail;
1145
- const tableEventHandlers = this.tableActionsFinish[tableCode];
1368
+ const tableEventHandlers = this._tableActionsFinish[tableCode];
1146
1369
  const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[tableActionCode] : null;
1147
1370
  if (tableActionMethods) {
1148
1371
  const clientActionPromises = [];
@@ -1321,4 +1544,4 @@ BasicFormComponent.ctorParameters = () => [
1321
1544
  { type: LibEventManagerService },
1322
1545
  { type: LibFileManagementService }
1323
1546
  ];
1324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBVSxNQUFNLG9DQUFvQyxDQUFDO0FBS25GLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFLdEIsTUFBTSxPQUFPLGtCQUFrQjtJQXlIN0IsWUFDWSxrQkFBeUMsRUFDekMsYUFBcUMsRUFDckMsZ0JBQTBDO1FBRjFDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBdUI7UUFDekMsa0JBQWEsR0FBYixhQUFhLENBQXdCO1FBQ3JDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMEI7UUF0SHRELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUVqQixrQkFBYSxHQUF5QixJQUFJLENB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YUFDdEM7OztZQWxCUSxxQkFBcUI7WUFDckIsc0JBQXNCO1lBQ3RCLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVN0cnVjdHVyZUFuZERhdGEgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0nO1xuaW1wb3J0IHsgTGliRm9ybU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGliRXZlbnRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V2ZW50LW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBmb3JtQWN0aW9ucywgTk9fRVJST1IsIEhFQURFUiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZm9ybS5jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9ybUFjdGlvbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvYWN0aW9uJztcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZmllbGQnO1xuaW1wb3J0IHsgUmVjb3JkVGFibGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL3RhYmxlL3RhYmxlJztcblxuY29uc3QgUEFZTE9BRF9WRVJTSU9OID0gJ1RVQUlORVhDSEFOR0VfMS4wJztcbmNvbnN0IElOTElORV9BQ1RJT04gPSAnSU5MSU5FJztcbmNvbnN0IEdMT0JBTF9BQ1RJT04gPSAnR0xPQkFMJztcbmNvbnN0IEdFVF9EQVRBX0FDVElPTiA9ICdHRVREQVRBJztcblxuY29uc3QgU1VCSkVDVCA9ICdzdWJqZWN0JztcbmNvbnN0IFRPS0VOID0gJ3Rva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQmFzaWNGb3JtQ29tcG9uZW50IHtcbiAgZm9ybUNvbmZpZzogYW55O1xuICBuYW1lOiBzdHJpbmc7XG4gIF9mb3JtUm91dGU6IHN0cmluZztcbiAgZm9ybVN1YmplY3Q6IHN0cmluZztcbiAgX2Vycm9yVHlwZTogJyc7XG4gIGVycm9yQ29kZSA9ICcnO1xuICBlcnJvck1lc3NhZ2UgPSAnJztcbiAgZXJyb3JEZXRhaWwgPSAnJztcblxuICBmb3JtU3RydWN0dXJlOiBGb3JtU3RydWN0dXJlQW5kRGF0YSA9IG51bGw7XG4gIGZpZWxkczogYW55O1xuICBhY3Rpb25zOiBhbnk7XG5cbiAgY29udHJvbFRva2VuID0gbnVsbDtcbiAgb3JpZ2luVG9rZW46IHN0cmluZztcbiAgaW5wdXREYXRhRmllbGRzID0ge307XG4gIGV4dHJhRGF0YTogYW55ID0ge307XG5cbiAgZGVmaW5pdGlvbk9idGFpbmVkID0gZmFsc2U7XG4gIGZvcm1WaXNpYmxlID0gZmFsc2U7XG4gIGJ1c3kgPSBmYWxzZTtcblxuICBmb3JtU2VjdGlvbnNBY3RpdmF0ZSA9IHt9O1xuICBmb3JtU2VjdGlvbnNJbmFjdGl2YXRlID0ge307XG4gIGZvcm1BY3Rpb25zU3RhcnQgPSB7fTtcbiAgZm9ybUFjdGlvbnNGaW5pc2ggPSB7fTtcbiAgZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgZmllbGRWYWxpZGF0aW9uc1N0YXJ0ID0ge307XG4gIGZpZWxkVmFsaWRhdGlvbnNGaW5pc2ggPSB7fTtcbiAgLy8gQ2FsbGJhY2sgZGUgYWNjaW9uZXMgZGUgdGFibGFzXG4gIHRhYmxlU2VsZWN0aW9uc1N0YXJ0ID0ge307XG4gIHRhYmxlU2VsZWN0aW9uc0ZpbmlzaCA9IHt9O1xuICB0YWJsZUFjdGlvbnNTdGFydCA9IHt9O1xuICB0YWJsZUFjdGlvbnNGaW5pc2ggPSB7fTtcbiAgdGFibGVHZXREYXRhU3RhcnQgPSB7fTtcbiAgdGFibGVHZXREYXRhRmluaXNoID0ge307XG5cbiAgZ2V0VGl0bGU6ICgpID0+IHN0cmluZztcbiAgc2V0VGl0bGU6ICh0aXRsZTogc3RyaW5nKSA9PiBhbnk7XG4gIGNsZWFuRGF0YTogKCkgPT4gdm9pZDtcbiAgZ2V0Q3VycmVudFN0YXRlOiAoKSA9PiBzdHJpbmc7XG4gIHN1cHBvcnRTdGF0ZTogKHN0YXRlOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGNoYW5nZVN0YXRlOiAoc3RhdGUpID0+IGJvb2xlYW47XG4gIGdldFN0YXRlczogKCkgPT4gYW55O1xuICAvLyBEYXRvcyBhZGljaW9uYWxlcyBlbiBmb3JtdWxhcmlvc1xuICBnZXRJbW11dGFibGVFbGVtZW50OiAobmFtZTogc3RyaW5nKSA9PiBhbnk7XG4gIGdldEV4dHJhSW5mbzogKG5hbWU6IHN0cmluZykgPT4gYW55O1xuICAvLyBDYW1wb3NcbiAgZ2V0RmllbGRzOiAoKSA9PiBGaWVsZERlc2NyaXB0b3JbXTtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGdldEZpZWxkOiAoY29kZTogc3RyaW5nKSA9PiBGaWVsZERlc2NyaXB0b3I7XG4gIGVuYWJsZUZpZWxkOiAoY29kZTogc3RyaW5nKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGQ6IChjb2RlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChjb2RlOiBzdHJpbmcpID0+IGFueTtcbiAgZ2V0RmllbGRzVmFsdWVzOiAoY29kZXM6IHN0cmluZ1tdKSA9PiBhbnk7XG4gIGdldEZpZWxkT3B0aW9uczogKGNvZGU6IHN0cmluZykgPT4gYW55O1xuICBzZXRGaWVsZFZhbHVlOiAoY29kZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB2b2lkO1xuICBzZXRGaWVsZFJlcXVpcmVkOiAoY29kZTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgc2V0RmllbGRFcnJvck1lc3NhZ2U6IChjb2RlOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlOiAoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc2V0RmllbGRPcHRpb25zOiAoY29kZTogc3RyaW5nLCBvcHRpb25zQXJyYXksIGlkQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlKSA9PiB2b2lkO1xuICBnZXRGaWVsZFNldDogKGZpbHRlckZ1bmM/LCBmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgYXBwbHlQcm9jZXNzVG9GaWVsZFNldDogKHByb2Nlc3NGdW5jLCBmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgYXBwbHlQcm9jZXNzVG9BbGxGaWVsZHM6IChwcm9jZXNzRnVuYykgPT4gYW55O1xuICBjbGVhbkZpZWxkczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBnZXRSZXF1aXJlZEZpZWxkczogKGZpZWxkQXJyYXksIHNlY3Rpb25Db2RlPywgc3ViU2VjdGlvbkNvZGU/KSA9PiBhbnk7XG4gIGdldFJlcXVpcmVkRW1wdHlGaWVsZHM6IChmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgZ2V0Q2hhbmdlZEZpZWxkczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBnZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICB0YWdGaWVsZHNXaXRoRXJyb3I6IChlcnJvck1lc3NhZ2UsIGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBjbGVhbkVycm9yRmllbGRzOiAoZmllbGRBcnJheT8sIHNlY3Rpb25Db2RlPywgc3ViU2VjdGlvbkNvZGU/KSA9PiBhbnk7XG4gIHNob3dMYWJlbEZpZWxkczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBoaWRlTGFiZWxGaWVsZHM6IChmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgZW5hYmxlRmllbGRzOiAoZmllbGRBcnJheT8sIHNlY3Rpb25Db2RlPywgc3ViU2VjdGlvbkNvZGU/KSA9PiBhbnk7XG4gIGRpc2FibGVGaWVsZHM6IChmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgZW5hYmxlRWRpdEZpZWxkczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBkaXNhYmxlRWRpdEZpZWxkczogKGZpZWxkQXJyYXk/LCBzZWN0aW9uQ29kZT8sIHN1YlNlY3Rpb25Db2RlPykgPT4gYW55O1xuICBzaG93RmllbGRzOiAoZmllbGRBcnJheT8sIHNlY3Rpb25Db2RlPywgc3ViU2VjdGlvbkNvZGU/KSA9PiBhbnk7XG4gIGhpZGVGaWVsZHM6IChmaWVsZEFycmF5Pywgc2VjdGlvbkNvZGU/LCBzdWJTZWN0aW9uQ29kZT8pID0+IGFueTtcbiAgLy8gQWNjaW9uZXNcbiAgZ2V0QWN0aW9uc0J5QXR0cmlidXRlOiAobmFtZTogc3RyaW5nLCB2YWx1ZSkgPT4gYW55O1xuICBnZXRIZWFkZXJBY3Rpb25zOiAoKSA9PiBhbnk7XG4gIGdldEFjdGlvbjogKGFjdGlvbkNvZGU6IHN0cmluZykgPT4gRm9ybUFjdGlvbjtcbiAgZ2V0QWN0aW9uRGVmaW5pdGlvbjogKGFjdGlvbkNvZGUpID0+IGFueTtcbiAgc2hvd0FjdGlvbnM6IChhY3Rpb25BcnJheSkgPT4gYW55O1xuICBoaWRlQWN0aW9uczogKGFjdGlvbkFycmF5KSA9PiBhbnk7XG4gIGVuYWJsZUFjdGlvbnM6IChhY3Rpb25BcnJheSkgPT4gYW55O1xuICBkaXNhYmxlQWN0aW9uczogKGFjdGlvbkFycmF5KSA9PiBhbnk7XG4gIHNob3dBY3Rpb246IChjb2RlKSA9PiBhbnk7XG4gIGhpZGVBY3Rpb246IChjb2RlKSA9PiBhbnk7XG4gIGVuYWJsZUFjdGlvbjogKGNvZGUpID0+IGFueTtcbiAgZGlzYWJsZUFjdGlvbjogKGNvZGUpID0+IGFueTtcblxuICBnZXRTZWN0aW9uczogKCkgPT4gYW55O1xuICBhY3RpdmF0ZVNlY3Rpb246IChzZWN0aW9uQ29kZSkgPT4gYW55O1xuICBnZXRTZWN0aW9uc1RpdGxlczogKCkgPT4gYW55O1xuICBnZXRTZWN0aW9uOiAoY29kZSkgPT4gYW55O1xuICBzaG93U2VjdGlvbjogKGNvZGUpID0+IGFueTtcbiAgaGlkZVNlY3Rpb246IChjb2RlKSA9PiBhbnk7XG4gIHNob3dTZWN0aW9uczogKHNlY3Rpb25BcnJheSkgPT4gYW55O1xuICBoaWRlU2VjdGlvbnM6IChzZWN0aW9uQXJyYXkpID0+IGFueTtcbiAgZ2V0U3ViU2VjdGlvbjogKGNvZGUsIHN1YkNvZGUpID0+IGFueTtcbiAgc2hvd1N1YlNlY3Rpb246IChzZWN0aW9uQ29kZSwgc3ViQ29kZSkgPT4gYW55O1xuICBoaWRlU3ViU2VjdGlvbjogKHNlY3Rpb25Db2RlLCBzdWJDb2RlKSA9PiBhbnk7XG4gIHNob3dTdWJTZWN0aW9uczogKHNlY3Rpb25Db2RlLCBzdWJTZWN0aW9uQXJyYXkpID0+IGFueTtcbiAgaGlkZVN1YlNlY3Rpb25zOiAoc2VjdGlvbkNvZGUsIHN1YlNlY3Rpb25BcnJheSkgPT4gYW55O1xuXG4gIGdldFRhYmxlczogKCkgPT4gYW55O1xuICBzaG93VGFibGVzOiAodGFibGVBcnJheSkgPT4gYW55O1xuICBoaWRlVGFibGVzOiAodGFibGVBcnJheSkgPT4gYW55O1xuICBjbGVhblRhYmxlczogKHRhYmxlQXJyYXkpID0+IGFueTtcbiAgZ2V0VGFibGU6IChlbGVtZW50SWQpID0+IFJlY29yZFRhYmxlO1xuICBzaG93VGFibGU6IChjb2RlKSA9PiBhbnk7XG4gIGhpZGVUYWJsZTogKGNvZGUpID0+IGFueTtcbiAgY2xlYW5UYWJsZTogKGNvZGUpID0+IGFueTtcbiAgZ2V0VGFibGVSZWNvcmQ6ICh0YWJsZU5hbWUsIHJlY29yZElkKSA9PiBhbnk7XG5cbiAgcHJvdGVjdGVkIF9ldmVudEVtaXRlcjogTGliRXZlbnRNYW5hZ2VyU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybU1hbmFnZXJTZXJ2aWNlOiBMaWJGb3JtTWFuYWdlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIF9ldmVudE1hbmFnZXI6IExpYkV2ZW50TWFuYWdlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGZpbGVNZ210U2VydmljZXM6IExpYkZpbGVNYW5hZ2VtZW50U2VydmljZSkge1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyID0gdGhpcy5fZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuY2xlYW5TdGFydCgpO1xuICAgIHRoaXMuY3VzdG9tUHJlUHJvY2Vzc2luZygpO1xuICB9XG5cbiAgYXNzaWduRnVuY3Rpb25zKCkge1xuICAgIGNvbnN0IGZ1bmN0aW9uc01hcHBlZCA9IFtcbiAgICAgIFsnZ2V0Q3VycmVudFN0YXRlJywgJ2dldEN1cnJlbnRTdGF0ZSddLFxuICAgICAgWydnZXRDdXJyZW50TW9kZScsICdnZXRDdXJyZW50U3RhdGUnXSxcbiAgICAgIFsnZ2V0VGl0bGUnLCAnZ2V0VGl0bGUnXSxcbiAgICAgIFsnc2V0VGl0bGUnLCAnc2V0VGl0bGUnXSxcbiAgICAgIFsnZ2V0QWN0aW9uJywgJ2dldEFjdGlvbiddLFxuICAgICAgWydzdXBwb3J0U3RhdGUnLCAnc3VwcG9ydFN0YXRlJ10sXG4gICAgICBbJ2dldEltbXV0YWJsZUVsZW1lbnQnLCAnZ2V0SW1tdXRhYmxlRWxlbWVudCddLFxuICAgICAgWydnZXRFeHRyYUluZm8nLCAnZ2V0RXh0cmFJbmZvJ10sXG4gICAgICBbJ2NsZWFuRGF0YScsICdjbGVhbkRhdGEnXSxcbiAgICAgIFsnZ2V0RmllbGRzJywgJ2dldEZpZWxkcyddLFxuICAgICAgWydnZXRGaWVsZE5hbWVzJywgJ2dldEZpZWxkTmFtZXMnXSxcbiAgICAgIFsnZ2V0RmllbGQnLCAnZ2V0RmllbGQnXSxcbiAgICAgIFsnZW5hYmxlRmllbGQnLCAnZW5hYmxlRmllbGQnXSxcbiAgICAgIFsnZGlzYWJsZUZpZWxkJywgJ2Rpc2FibGVGaWVsZCddLFxuICAgICAgWydnZXRGaWVsZFZhbHVlJywgJ2dldEZpZWxkVmFsdWUnXSxcbiAgICAgIFsnZ2V0RmllbGRzVmFsdWVzJywgJ2dldEZpZWxkc1ZhbHVlcyddLFxuICAgICAgWydnZXRGaWVsZE9wdGlvbnMnLCAnZ2V0RmllbGRPcHRpb25zJ10sXG4gICAgICBbJ3NldEZpZWxkVmFsdWUnLCAnc2V0RmllbGRWYWx1ZSddLFxuICAgICAgWydzZXRGaWVsZFJlcXVpcmVkJywgJ3NldEZpZWxkUmVxdWlyZWQnXSxcbiAgICAgIFsnc2V0RmllbGRFcnJvck1lc3NhZ2UnLCAnc2V0RmllbGRFcnJvck1lc3NhZ2UnXSxcbiAgICAgIFsnc2V0RmllbGRFcnJvcicsICdzZXRGaWVsZEVycm9yJ10sXG4gICAgICBbJ3NldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlJywgJ3NldEZpZWxkSW50cmluc2ljRXJyb3JNZXNzYWdlJ10sXG4gICAgICBbJ3NldEZpZWxkT3B0aW9ucycsICdzZXRGaWVsZE9wdGlvbnMnXSxcbiAgICAgIFsnZ2V0RmllbGRTZXQnLCAnZ2V0RmllbGRTZXQnXSxcbiAgICAgIFsnYXBwbHlQcm9jZXNzVG9GaWVsZFNldCcsICdhcHBseVByb2Nlc3NUb0ZpZWxkU2V0J10sXG4gICAgICBbJ2FwcGx5UHJvY2Vzc1RvQWxsRmllbGRzJywgJ2FwcGx5UHJvY2Vzc1RvRmllbGRTZXQnXSxcbiAgICAgIFsnY2xlYW5GaWVsZHMnLCAnY2xlYW5GaWVsZHMnXSxcbiAgICAgIFsnZ2V0UmVxdWlyZWRGaWVsZHMnLCAnZ2V0UmVxdWlyZWRGaWVsZHMnXSxcbiAgICAgIFsnZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcycsICdnZXRSZXF1aXJlZEVtcHR5RmllbGRzJ10sXG4gICAgICBbJ2dldENoYW5nZWRGaWVsZHMnLCAnZ2V0Q2hhbmdlZEZpZWxkcyddLFxuICAgICAgWydnZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcycsICdnZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcyddLFxuICAgICAgWyd0YWdGaWVsZHNXaXRoRXJyb3InLCAndGFnRmllbGRzV2l0aEVycm9yJ10sXG4gICAgICBbJ2NsZWFuRXJyb3JGaWVsZHMnLCAnY2xlYW5FcnJvckZpZWxkcyddLFxuICAgICAgWydzaG93TGFiZWxGaWVsZHMnLCAnc2hvd0xhYmVsRmllbGRzJ10sXG4gICAgICBbJ2hpZGVMYWJlbEZpZWxkcycsICdoaWRlTGFiZWxGaWVsZHMnXSxcbiAgICAgIFsnZW5hYmxlRmllbGRzJywgJ2VuYWJsZUZpZWxkcyddLFxuICAgICAgWydkaXNhYmxlRmllbGRzJywgJ2Rpc2FibGVGaWVsZHMnXSxcbiAgICAgIFsnZW5hYmxlRWRpdEZpZWxkcycsICdlbmFibGVFZGl0RmllbGRzJ10sXG4gICAgICBbJ2Rpc2FibGVFZGl0RmllbGRzJywgJ2Rpc2FibGVFZGl0RmllbGRzJ10sXG4gICAgICBbJ3Nob3dGaWVsZHMnLCAnc2hvd0ZpZWxkcyddLFxuICAgICAgWydoaWRlRmllbGRzJywgJ2hpZGVGaWVsZHMnXSxcbiAgICAgIFsnZ2V0QWN0aW9uc0J5QXR0cmlidXRlJywgJ2dldEFjdGlvbnNCeUF0dHJpYnV0ZSddLFxuICAgICAgWydnZXRBY3Rpb24nLCAnZ2V0QWN0aW9uJ10sXG4gICAgICBbJ3Nob3dBY3Rpb25zJywgJ3Nob3dBY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVBY3Rpb25zJywgJ2hpZGVBY3Rpb25zJ10sXG4gICAgICBbJ2VuYWJsZUFjdGlvbnMnLCAnZW5hYmxlQWN0aW9ucyddLFxuICAgICAgWydkaXNhYmxlQWN0aW9ucycsICdkaXNhYmxlQWN0aW9ucyddLFxuICAgICAgWydzaG93QWN0aW9uJywgJ3Nob3dBY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVBY3Rpb24nLCAnaGlkZUFjdGlvbnMnXSxcbiAgICAgIFsnZW5hYmxlQWN0aW9uJywgJ2VuYWJsZUFjdGlvbnMnXSxcbiAgICAgIFsnZGlzYWJsZUFjdGlvbicsICdkaXNhYmxlQWN0aW9ucyddLFxuICAgICAgWydhY3RpdmF0ZVNlY3Rpb24nLCAnYWN0aXZhdGVTZWN0aW9uJ10sXG4gICAgICBbJ2dldFN1YlNlY3Rpb24nLCAnZ2V0U3ViU2VjdGlvbiddLFxuICAgICAgWydnZXRTZWN0aW9uJywgJ2dldFNlY3Rpb24nXSxcbiAgICAgIFsnc2hvd1NlY3Rpb24nLCAnc2hvd1NlY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVTZWN0aW9uJywgJ2hpZGVTZWN0aW9ucyddLFxuICAgICAgWydzaG93U2VjdGlvbnMnLCAnc2hvd1NlY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVTZWN0aW9ucycsICdoaWRlU2VjdGlvbnMnXSxcbiAgICAgIFsnc2hvd1N1YlNlY3Rpb24nLCAnc2hvd1N1YlNlY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVTdWJTZWN0aW9uJywgJ2hpZGVTdWJTZWN0aW9ucyddLFxuICAgICAgWydzaG93U3ViU2VjdGlvbnMnLCAnc2hvd1N1YlNlY3Rpb25zJ10sXG4gICAgICBbJ2hpZGVTdWJTZWN0aW9ucycsICdoaWRlU3ViU2VjdGlvbnMnXSxcbiAgICAgIFsnZ2V0VGFibGVzJywgJ2dldFRhYmxlcyddLFxuICAgICAgWydnZXRUYWJsZScsICdnZXRUYWJsZSddLFxuICAgICAgWydzaG93VGFibGVzJywgJ3Nob3dUYWJsZXMnXSxcbiAgICAgIFsnaGlkZVRhYmxlcycsICdoaWRlVGFibGVzJ10sXG4gICAgICBbJ3Nob3dUYWJsZScsICdzaG93VGFibGVzJ10sXG4gICAgICBbJ2hpZGVUYWJsZScsICdoaWRlVGFibGVzJ10sXG4gICAgICBbJ2NsZWFuVGFibGVzJywgJ2NsZWFuVGFibGVzJ10sXG4gICAgICBbJ2NsZWFuVGFibGUnLCAnY2xlYW5UYWJsZXMnXSxcbiAgICAgIFsnZ2V0VGFibGVSZWNvcmQnLCAnZ2V0VGFibGVSZWNvcmQnXSxcbiAgICAgIFsnY2hhbmdlU3RhdGUnLCAnY2hhbmdlU3RhdGUnXSxcbiAgICBdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmdW5jdGlvbnNNYXBwZWQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBbbmFtZSwgc3RydWN0dXJlTmFtZV0gPSBmdW5jdGlvbnNNYXBwZWRbaW5kZXhdO1xuICAgICAgdGhpc1tuYW1lXSA9IHRoaXMuZm9ybVN0cnVjdHVyZT8uW3N0cnVjdHVyZU5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHNldENvbmZpZyhmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcbiAgfVxuXG4gIGNsZWFuU3RhcnQoKSB7XG4gICAgdGhpcy5fZXJyb3JUeXBlID0gJyc7XG4gICAgdGhpcy5lcnJvckNvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSAnJztcbiAgICB0aGlzLmZvcm1TdHJ1Y3R1cmUgPSBudWxsO1xuICAgIHRoaXMuZmllbGRzID0gbnVsbDtcbiAgICB0aGlzLmFjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuY29udHJvbFRva2VuID0gbnVsbDtcbiAgICB0aGlzLmlucHV0RGF0YUZpZWxkcyA9IHt9O1xuICAgIHRoaXMuZGVmaW5pdGlvbk9idGFpbmVkID0gZmFsc2U7XG4gICAgLy8gU2UgbGltcGlhbiBsb3MgbWFuZWphZG9yZXMgZGUgZXZlbnRvc1xuICAgIHRoaXMuZm9ybVZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1TZWN0aW9uc0FjdGl2YXRlID0ge307XG4gICAgdGhpcy5mb3JtU2VjdGlvbnNJbmFjdGl2YXRlID0ge307XG4gICAgdGhpcy5mb3JtQWN0aW9uc1N0YXJ0ID0ge307XG4gICAgdGhpcy5mb3JtQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgICB0aGlzLmZpZWxkVmFsaWRhdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuZmllbGRWYWxpZGF0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMudGFibGVTZWxlY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLnRhYmxlU2VsZWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMudGFibGVBY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLnRhYmxlQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMudGFibGVHZXREYXRhU3RhcnQgPSB7fTtcbiAgICB0aGlzLnRhYmxlR2V0RGF0YUZpbmlzaCA9IHt9O1xuICB9XG5cbiAgZ2V0IGZvcm1NYW5hZ2VyKCkgeyByZXR1cm4gdGhpczsgfVxuICBnZXQgZm9ybUNvZGUoKSB7IHJldHVybiB0aGlzLm5hbWU7IH1cbiAgc2V0IGZvcm1Db2RlKG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICBnZXQgaW5TZXJ2ZXJQcm9jZXNzKCkgeyByZXR1cm4gdGhpcy5idXN5OyB9XG4gIGdldCBmb3JtKCkgeyByZXR1cm4gdGhpcy5mb3JtU3RydWN0dXJlOyB9XG4gIGdldCB2aXNpYmxlU2VjdGlvbnMoKSB7IHJldHVybiB0aGlzLmZvcm1TdHJ1Y3R1cmUudmlzaWJsZVNlY3Rpb25zOyB9XG4gIGdldCBjdXJyZW50U3RhdGUoKSB7IHJldHVybiB0aGlzLmZvcm1TdHJ1Y3R1cmUuc3RhdGU7IH1cbiAgc2V0IGN1cnJlbnRTdGF0ZShzdGF0ZSkgeyB0aGlzLmZvcm1TdHJ1Y3R1cmUuY2hhbmdlU3RhdGUoc3RhdGUpOyB9XG4gIGdldCBjdXJyZW50TW9kZSgpIHsgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlOyB9XG4gIGdldCBpbW11dGFibGVEYXRhKCkgeyByZXR1cm4gdGhpcy5mb3JtU3RydWN0dXJlLmltbXV0YWJsZURhdGEgfVxuICBnZXQgZXh0cmFJbmZvKCkgeyByZXR1cm4gdGhpcy5mb3JtU3RydWN0dXJlLmV4dHJhSW5mbyB9XG4gIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFN0YXRlKCk7IH1cbiAgZ2V0IGZvcm1Sb3V0ZSgpIHsgcmV0dXJuIHRoaXMuX2Zvcm1Sb3V0ZTsgfVxuICBzZXQgZm9ybVJvdXRlKHJvdXRlKSB7IHRoaXMuX2Zvcm1Sb3V0ZSA9IHJvdXRlOyB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7IHJldHVybiB0aGlzLmZvcm1TdWJqZWN0OyB9XG5cbiAgLy8gTcOpdG9kb3MgdmlydHVhbGVzXG4gIGN1c3RvbVByZVByb2Nlc3NpbmcoKSB7IH1cbiAgY3VzdG9tRm9ybVN0YXJ0KCkgeyB9XG4gIGRpc3BsYXlBY3Rpb25TZXJ2ZXJFcnJvcigpIHsgfVxuICBkaXNwbGF5VmFsaWRhdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCkgeyB9XG4gIHNob3dGaWVsZEluZm8oZmllbGRDb2RlOiBzdHJpbmcpIHsgfVxuICBzaG93TW9kYWxEaWFsb2codGl0bGUsIGJvZHksIG9wdGlvbnMsIGNhbGxiYWNrPywgcGFyYW1zPykgeyB9XG4gIG9wZW5VcGxvYWREaWFsb2codGl0bGUsIGJvZHksIG9wdGlvbnMsIGNhbGxiYWNrPywgcGFyYW1zPykgeyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdXBwb3J0U3RhdGVcbiAgICovXG4gIHN1cHBvcnRNb2RlKHN0YXRlKSB7IHJldHVybiB0aGlzLnN1cHBvcnRTdGF0ZShzdGF0ZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEZpZWxkXG4gICAqL1xuICBnZXRGaWVsZE9iamVjdChjb2RlKSB7IHJldHVybiB0aGlzLmdldEZpZWxkKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRBY3Rpb25cbiAgICovXG4gIGdldEFjdGlvbk9iamVjdChjb2RlKSB7IHJldHVybiB0aGlzLmdldEFjdGlvbihjb2RlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VGFibGVcbiAgICovXG4gIGdldFRhYmxlT2JqZWN0KGNvZGUpIHsgcmV0dXJuIHRoaXMuZ2V0VGFibGUoY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldFNlY3Rpb25cbiAgICovXG4gIGdldFNlY3Rpb25PYmplY3QoY29kZSkgeyByZXR1cm4gdGhpcy5nZXRTZWN0aW9uKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBjaGFuZ2VTdGF0ZVxuICAgKi9cbiAgY2hhbmdlRm9ybU1vZGUoc3RhdGUpIHsgcmV0dXJuIHRoaXMuY2hhbmdlU3RhdGUoc3RhdGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXRGb3JtU3ViamVjdCgpIHsgcmV0dXJuIHRoaXMuc3ViamVjdDsgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1YmplY3RcbiAgICovXG4gIGdldFN1YmplY3QoKSB7IHJldHVybiB0aGlzLmZvcm1TdWJqZWN0OyB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0Zm9ybVN1YmplY3QoKSB7IHJldHVybiB0aGlzLmdldFN1YmplY3QoKTsgfVxuXG5cbiAgbnVtU2VjdGlvbnMoKSB7IHJldHVybiB0aGlzLmZvcm1TdHJ1Y3R1cmUuc2VjdGlvbnMubGVuZ3RoOyB9XG5cbiAgc3Vic2NyaWJlQXBwRXZlbnQoZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyLnN1YnNjcmliZShldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9wZW5Gb3JtKG5hbWUsIGRhdGEgPSBudWxsLCBiYWNrRGF0YSA9IG51bGwsIGNsZWFuU3RhY2sgPSBmYWxzZSkge1xuICAgIGxldCBvcmlnaW4gPSBudWxsO1xuICAgIGlmICghY2xlYW5TdGFjaykge1xuICAgICAgb3JpZ2luID0geyAuLi5iYWNrRGF0YSwgbmFtZTogdGhpcy5uYW1lLCB1cmw6IHRoaXMuX2Zvcm1Sb3V0ZSwgdG9rZW46IHRoaXMuY29udHJvbFRva2VuIH07XG4gICAgICBvcmlnaW4uc3ViamVjdCA9IG9yaWdpbj8uc3ViamVjdCA/PyB0aGlzLmZvcm1TdWJqZWN0O1xuICAgICAgb3JpZ2luLnN0YXRlID0gb3JpZ2luPy5zdGF0ZSA/PyB0aGlzLmN1cnJlbnRTdGF0ZTtcbiAgICAgIG9yaWdpbi5maWVsZHMgPSBvcmlnaW4/LmZpZWxkcyA/PyB7fTtcbiAgICAgIG9yaWdpbi5leHRyYSA9IG9yaWdpbj8uZXh0cmEgPz8ge307XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHsgLi4uZGF0YSwgbmFtZSB9O1xuICAgIHRhcmdldC5zdWJqZWN0ID0gdGFyZ2V0Py5zdWJqZWN0ID8/IG51bGw7XG4gICAgdGFyZ2V0LnN0YXRlID0gdGFyZ2V0Py5zdGF0ZSA/PyBudWxsO1xuICAgIHRhcmdldC5maWVsZHMgPSB0YXJnZXQ/LmZpZWxkcyA/PyB7fTtcbiAgICB0YXJnZXQuZXh0cmEgPSB0YXJnZXQ/LmV4dHJhID8/IHt9O1xuICAgIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLm9wZW5Gb3JtKG9yaWdpbiwgdGFyZ2V0KTtcbiAgfVxuXG4gIGNhbkdvQmFjaygpIHsgcmV0dXJuIHRoaXMub3JpZ2luVG9rZW4gIT09IG51bGwgfVxuICBnb0JhY2soKSB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5iYWNrVG8oKTsgfVxuICBnb0JhY2tGb3JtKCkgeyByZXR1cm4gdGhpcy5nb0JhY2soKTsgfVxuICBnZXRPcmlnaW5EZXRhaWwoKSB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5nZXRGb3JtSW5mbyh0aGlzLm9yaWdpblRva2VuKTsgfVxuXG4gIHNldEVycm9yKGVycm9yVHlwZSwgZXJyb3JNZXNzYWdlLCBlcnJvckRldGFpbCkge1xuICAgIHRoaXMuX2Vycm9yVHlwZSA9IGVycm9yVHlwZSB8fCAnJztcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZSB8fCAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gZXJyb3JEZXRhaWwgfHwgJyc7XG4gIH1cblxuICByZXNldEVycm9yKCkgeyB0aGlzLnNldEVycm9yKG51bGwsIG51bGwsIG51bGwpOyB9XG4gIGdldEVycm9yVHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKSB7IHJldHVybiB0aGlzLmVycm9yTWVzc2FnZTsgfVxuICBnZXRFcnJvckRldGFpbCgpIHsgcmV0dXJuIHRoaXMuZXJyb3JEZXRhaWw7IH1cbiAgZ2V0RXJyb3JDb2RlKCkgeyByZXR1cm4gdGhpcy5fZXJyb3JUeXBlOyB9XG5cbiAgZ2V0Rm9ybVBhcmFtZXRlcihuYW1lKSB7XG4gICAgcmV0dXJuIChuYW1lKSA/ICh0aGlzLmV4dHJhRGF0YT8uW25hbWVdID8/IG51bGwpIDogbnVsbDtcbiAgfVxuXG4gIHByZW9jZXNzSW5wdXRQYXJhbXMocGFyYW1zKSB7XG4gICAgdGhpcy5jb250cm9sVG9rZW4gPSBwYXJhbXM/LltUT0tFTl0gPz8gbnVsbDtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuY29udHJvbFRva2VuKTtcbiAgICBpZiAoIXRoaXMuY29udHJvbFRva2VuIHx8IHRoaXMuY29udHJvbFRva2VuICE9PSB0b2tlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJqZWN0ID0gcGFyYW1zPy5bU1VCSkVDVF0gPz8gc3ViamVjdCA/PyBudWxsO1xuICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuZXh0cmFEYXRhID0gZXh0cmE7XG4gICAgdGhpcy5vcmlnaW5Ub2tlbiA9IG9yaWdpblRva2VuO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCkge1xuICAgIGNvbnN0IGZvcm1TZWN0aW9ucyA9IHRoaXMuZm9ybVN0cnVjdHVyZS5zZWN0aW9ucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtU2VjdGlvbnMpKSB7XG4gICAgICBmb3JtU2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgc2VjdGlvbi5hY3RpdmF0aW9uLnN1YnNjcmliZShjb2RlID0+IHRoaXMubGF1bmNoU2VjdGlvbkFjdGl2YXRpb24oY29kZSkpO1xuICAgICAgICBzZWN0aW9uLmluYWN0aXZhdGlvbi5zdWJzY3JpYmUoY29kZSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3Vic2NyaWJlRmllbGRzU3ViamVjdHMoKSB7XG4gICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZm9ybVN0cnVjdHVyZS5nZXRGaWVsZHMoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtRmllbGRzKSkge1xuICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgZmllbGQuZWRpdGlvbkZpbmlzaC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbiB9ID0gZXZlbnQ7XG4gICAgICAgICAgdGhpcy5zdGFydEZpZWxkVmFsaWRhdGlvbihjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLmVkaXRpb25QYXJ0aWFsLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICB0aGlzLnN0YXJ0RmllbGRJbnB1dFZhbGlkYXRpb24oY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZC5kZXRhaWxSZXF1ZXN0LnN1YnNjcmliZShjb2RlID0+IHRoaXMuc2hvd0ZpZWxkSW5mbyhjb2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVBY3Rpb25TdWJqZWN0cygpIHtcbiAgICBjb25zdCBmb3JtQWN0aW9ucyA9IHRoaXMuZm9ybVN0cnVjdHVyZS5nZXRBY3Rpb25zKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybUFjdGlvbnMpKSB7XG4gICAgICBmb3JtQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgIGFjdGlvbi5hY3Rpb25BY3RpdmF0ZWQuc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5zdGFydEFjdGlvbihjb2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUYWJsZVN1YmplY3RzKCkge1xuICAgIGNvbnN0IGZvcm1UYWJsZXMgPSB0aGlzLmZvcm1TdHJ1Y3R1cmUuZ2V0VGFibGVzKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVRhYmxlcykpIHtcbiAgICAgIGZvcm1UYWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgICAgIHRhYmxlLmlubGluZUFjdGlvblRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZUFjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5nbG9iYWxBY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVHbG9iYWxBY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUucmVjb3JkU2VsZWN0aW9uVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlUmVjb3JkU2VsZWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLnNlbGVjdGlvbkFjdGlvblRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZVNlbGVjdGlvbkFjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5nZXREYXRhVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlR2V0RGF0YShldmVudCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZm9ybUluaXQocGFyYW1zKSB7XG4gICAgbGV0IGluaXRpYWxTdGF0ZSA9IHRoaXMucHJlb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICAgIGlmICghdGhpcy5uYW1lKSB7IHJldHVybjsgfVxuICAgIGlmICghdGhpcy5kZWZpbml0aW9uT2J0YWluZWQpIHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICBjb25zdCBmb3JtRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1EZWZpbml0aW9uKHRoaXMubmFtZSk7XG4gICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybVN0cnVjdHVyZSA9IG5ldyBGb3JtU3RydWN0dXJlQW5kRGF0YShmb3JtRGVmaW5pdGlvbiwgdGhpcy5mb3JtQ29uZmlnKTtcbiAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5mb3JtU3RydWN0dXJlLmZpZWxkcztcbiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuZm9ybVN0cnVjdHVyZS5hY3Rpb25zO1xuICAgICAgdGhpcy5kZWZpbml0aW9uT2J0YWluZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFuRGF0YSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3VwcG9ydFN0YXRlKGluaXRpYWxTdGF0ZSkpIHtcbiAgICAgIGluaXRpYWxTdGF0ZSA9IHRoaXMuZm9ybVN0cnVjdHVyZS5kZWZhdWx0U3RhdGU7XG4gICAgfVxuICAgIHRoaXMuZm9ybVN0cnVjdHVyZS5jaGFuZ2VTdGF0ZShpbml0aWFsU3RhdGUgfHwgdGhpcy5mb3JtU3RydWN0dXJlLmRlZmF1bHRTdGF0ZSk7XG4gICAgY29uc3QgaW5wdXRGaWVsZE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5pbnB1dERhdGFGaWVsZHMpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dEZpZWxkTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWVsZENvZGUgPSBpbnB1dEZpZWxkTmFtZXNbaW5kZXhdO1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuaW5wdXREYXRhRmllbGRzW2ZpZWxkQ29kZV07XG4gICAgICB0aGlzLnNldEZpZWxkVmFsdWUoZmllbGRDb2RlLCBmaWVsZFZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLmdldERhdGEpO1xuICAgIHRoaXMuY2hlY2tFcnJvclJlY29yZFJlY2VpdmVkKHJlY29yZFJlc3BvbnNlKTtcbiAgICB0aGlzLmZvcm1WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVGaWVsZHNTdWJqZWN0cygpO1xuICAgIHRoaXMuc3Vic2NyaWJlQWN0aW9uU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTtcbiAgICB0aGlzLmN1c3RvbUZvcm1TdGFydCgpO1xuICB9XG5cbiAgY2hlY2tFcnJvclJlY29yZFJlY2VpdmVkKHJlY29yZFJlc3BvbnNlKSB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gcmVjb3JkUmVzcG9uc2U7XG4gICAgaWYgKCFlcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aGlzLmVycm9yQ29kZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yTWVzc2FnZTtcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JEZXRhaWw7XG4gIH1cblxuICBlcnJvck9jY3VyZWQoKSB7XG4gICAgcmV0dXJuICh0aGlzLmVycm9yQ29kZSAhPT0gTk9fRVJST1IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcG9ydGUgbWFuZWpvIGRlIGV2ZW50b3MgZGUgZm9ybXVsYXJpb1xuICAgKi9cblxuICBhc3luYyByZXF1ZXN0Rm9ybUFjdGlvbihhY3Rpb25Db2RlLCBhY3Rpb25TdWJqZWN0ID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb25EZXRhaWwgPSB7XG4gICAgICBmb3JtQ29kZTogdGhpcy5uYW1lLFxuICAgICAgZm9ybVN1YmplY3Q6IHRoaXMuZm9ybVN1YmplY3QsXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5mb3JtU3RydWN0dXJlLnN0YXRlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIGFjdGlvblN1YmplY3QsXG4gICAgICB2ZXJzaW9uOiBQQVlMT0FEX1ZFUlNJT04sXG4gICAgICBmb3JtRGF0YTogdGhpcy5mb3JtU3RydWN0dXJlLmdldFBheWxvYWQoKSxcbiAgICAgIGltbXV0YWJsZURhdGE6IHRoaXMuZm9ybVN0cnVjdHVyZS5pbW11dGFibGVEYXRhLFxuICAgIH07XG4gICAgdGhpcy5lcnJvckNvZGUgPSBOT19FUlJPUjtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSAnJztcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgIGNvbnN0IGZvcm1BY3Rpb25SZXNwb25zZTogYW55ID0gYXdhaXQgdGhpcy5mb3JtTWFuYWdlclNlcnZpY2UuZXhlY1NlcnZlckFjdGlvbihhY3Rpb25EZXRhaWwpO1xuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIGlmIChmb3JtQWN0aW9uUmVzcG9uc2UgJiYgZm9ybUFjdGlvblJlc3BvbnNlLmVycm9yLmVycm9yVHlwZSkge1xuICAgICAgY29uc29sZS5sb2coJ0V4Y2VwY2nDs24gbm8gc29wb3J0YWRhJyk7XG4gICAgfVxuICAgIGlmIChmb3JtQWN0aW9uUmVzcG9uc2UuaGFzRXJyb3IoKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBmb3JtQWN0aW9uUmVzcG9uc2UuZXJyb3I7XG4gICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yLmVycm9yQ29kZTtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3JNZXNzYWdlO1xuICAgICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yLmVycm9yRGV0YWlsO1xuICAgIH1cbiAgICBjb25zdCBmb3JtUmVzcG9uc2VEYXRhID0gZm9ybUFjdGlvblJlc3BvbnNlLmdldERhdGEoKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoU2VydmVyRGF0YShmb3JtUmVzcG9uc2VEYXRhKTtcbiAgICByZXR1cm4gZm9ybVJlc3BvbnNlRGF0YTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm1XaXRoU2VydmVyRGF0YShmb3JtQ29udGVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRNb2RlLCBmb3JtU3ViamVjdCwgYWN0aW9ucywgZmllbGRzLCByZWNvcmRUYWJsZXMsXG4gICAgICByZXR1cm5lZEZpbGUsIGltbXV0YWJsZURhdGEsIGV4dHJhSW5mbyxcbiAgICB9ID0gZm9ybUNvbnRlbnQ7XG4gICAgY3VycmVudE1vZGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShjdXJyZW50TW9kZSk7XG4gICAgaWYgKGZvcm1TdWJqZWN0KSB7IHRoaXMuZm9ybVN1YmplY3QgPSBmb3JtU3ViamVjdDsgfVxuICAgIGlmIChhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2VkQWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY2hhbmdlZEFjdGlvbi5hY3Rpb25Db2RlKTtcbiAgICAgICAgaWYgKGFjdGlvbk9iamVjdCkgeyBhY3Rpb25PYmplY3QudXBkYXRlRnJvbVNlcnZlcihjaGFuZ2VkQWN0aW9uKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRGaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgY29uc3QgZmllbGRPYmplY3QgPSB0aGlzLmdldEZpZWxkKGNoYW5nZWRGaWVsZC5maWVsZENvZGUpO1xuICAgICAgICBpZiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgICBmaWVsZE9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY29yZFRhYmxlcyAmJiByZWNvcmRUYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2VkVGFibGUgb2YgcmVjb3JkVGFibGVzKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjaGFuZ2VkVGFibGUudGFibGVDb2RlKTtcbiAgICAgICAgaWYgKHRhYmxlT2JqZWN0KSB7XG4gICAgICAgICAgdGFibGVPYmplY3QudXBkYXRlRnJvbVNlcnZlcihjaGFuZ2VkVGFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXR1cm5lZEZpbGUgJiYgcmV0dXJuZWRGaWxlLmZpbGUpIHtcbiAgICAgIHRoaXMuZmlsZU1nbXRTZXJ2aWNlcy5zYXZlRmlsZShyZXR1cm5lZEZpbGUuZmlsZSwgcmV0dXJuZWRGaWxlLm5hbWUsIHJldHVybmVkRmlsZS50eXBlKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtU3RydWN0dXJlLmltbXV0YWJsZURhdGEgPSBpbW11dGFibGVEYXRhO1xuICAgIHRoaXMuZm9ybVN0cnVjdHVyZS5leHRyYUluZm8gPSBleHRyYUluZm87XG4gIH1cblxuICAvKipcbiAgICogTWFuZWpvIGRlIGV2ZW50IGhhbmRsZXJzIHBhcmEgYWNjaW9uZXMgc29icmUgZWwgZm9ybXVsYXJpb1xuICAgKi9cblxuICBhZGRTZWN0aW9uQWN0aXZhdGlvbihzZWN0aW9ucywgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBzZWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoc2VjdGlvbnMpKSA/IHNlY3Rpb25zIDogW3NlY3Rpb25zXTtcbiAgICBzZWN0aW9uU2V0LmZvckVhY2goKHNlY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlY3Rpb25zQWN0aXZhdGVbc2VjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuZm9ybVNlY3Rpb25zQWN0aXZhdGVbc2VjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFNlY3Rpb25JbmFjdGl2YXRpb24oc2VjdGlvbnMsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3Qgc2VjdGlvblNldCA9IChBcnJheS5pc0FycmF5KHNlY3Rpb25zKSkgPyBzZWN0aW9ucyA6IFtzZWN0aW9uc107XG4gICAgc2VjdGlvblNldC5mb3JFYWNoKChzZWN0aW9uTmFtZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZvcm1TZWN0aW9uc0luYWN0aXZhdGVbc2VjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZVtzZWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZVtzZWN0aW9uTmFtZV0ucHVzaChjYWxsYmFja01ldGhvZCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRBY3Rpb25NZXRob2RTdGFydChhY3Rpb25zLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IGFjdGlvblNldCA9IChBcnJheS5pc0FycmF5KGFjdGlvbnMpKSA/IGFjdGlvbnMgOiBbYWN0aW9uc107XG4gICAgYWN0aW9uU2V0LmZvckVhY2goKGFjdGlvbk5hbWUpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuZm9ybUFjdGlvbnNTdGFydFthY3Rpb25OYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQWN0aW9uTWV0aG9kRmluaXNoKGFjdGlvbnMsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgYWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoYWN0aW9ucykpID8gYWN0aW9ucyA6IFthY3Rpb25zXTtcbiAgICBhY3Rpb25TZXQuZm9yRWFjaCgoYWN0aW9uTmFtZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uTmFtZV0ucHVzaChjYWxsYmFja01ldGhvZCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uQWN0aXZhdGlvbihzZWN0aW9uQ29kZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuZm9ybVN0cnVjdHVyZS5nZXRTZWN0aW9uKHNlY3Rpb25Db2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLmZvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25Db2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRTZWN0aW9uTWV0aG9kKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxhdW5jaFNlY3Rpb25JbmFjdGl2YXRpb24oc2VjdGlvbkNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlY3Rpb25PYmplY3QgPSB0aGlzLmZvcm1TdHJ1Y3R1cmUuZ2V0U2VjdGlvbihzZWN0aW9uQ29kZSk7XG4gICAgaWYgKCFzZWN0aW9uT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGNsaWVudFNlY3Rpb25NZXRob2RzID0gdGhpcy5mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW3NlY3Rpb25Db2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRTZWN0aW9uTWV0aG9kKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QWN0aW9uKGFjdGlvbkNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGlvbk9iamVjdCA9IHRoaXMuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghYWN0aW9uT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGFjdGlvbk9iamVjdC5zdGFydCgpO1xuICAgIGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZHMgPSB0aGlzLmZvcm1BY3Rpb25zU3RhcnRbYWN0aW9uQ29kZV07XG4gICAgaWYgKGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZCBvZiBjbGllbnRBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uUHJvbWlzZSA9IGNsaWVudEFjdGlvbk1ldGhvZChhY3Rpb25PYmplY3QpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNvbnRpbnVlQWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbk9iamVjdC5zdG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb25PYmplY3QpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXJBY3Rpb24oYWN0aW9uSW5wdXQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAodHlwZW9mIGFjdGlvbklucHV0ID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRBY3Rpb24oYWN0aW9uSW5wdXQpIDogYWN0aW9uSW5wdXQ7XG4gICAgbGV0IGZpbmlzaCA9IHRydWU7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3RGb3JtQWN0aW9uKGFjdGlvbi5hY3Rpb25Db2RlKTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaEFjdGlvbihhY3Rpb24sIGFjdGlvblJlc3VsdCk7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlBY3Rpb25TZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICBhY3Rpb24uc3RvcCgpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoQWN0aW9uKGFjdGlvbk9iamVjdCwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgZmluaXNoQWN0aW9uTWV0aG9kcyA9IHRoaXMuZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uT2JqZWN0LmFjdGlvbkNvZGVdO1xuICAgIGlmIChmaW5pc2hBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjbGllbnRBY3Rpb25NZXRob2Qgb2YgZmluaXNoQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvbk1ldGhvZChhY3Rpb25PYmplY3QsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBsZXRlR2xvYmFsQWN0aW9uKGFjdGlvbk9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbk9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIHZhbGlkYWNpb25lcyBzb2JyZSBjYW1wb3NcbiAgICovXG5cbiAgYWRkRmllbGRJbnB1dFZhbGlkYXRpb24oZmllbGRzLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoZmllbGRzKSkgPyBmaWVsZHMgOiBbZmllbGRzXTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWVsZElucHV0VmFsaWRhdGlvbltmaWVsZENvZGVdKSB7XG4gICAgICAgIHRoaXMuZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5maWVsZElucHV0VmFsaWRhdGlvbltmaWVsZENvZGVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkRmllbGRWYWxpZGF0aW9uU3RhcnQoZmllbGRzLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IGZpZWxkU2V0ID0gKEFycmF5LmlzQXJyYXkoZmllbGRzKSkgPyBmaWVsZHMgOiBbZmllbGRzXTtcbiAgICBmaWVsZFNldC5mb3JFYWNoKChmaWVsZENvZGUpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWVsZFZhbGlkYXRpb25zU3RhcnRbZmllbGRDb2RlXSkge1xuICAgICAgICB0aGlzLmZpZWxkVmFsaWRhdGlvbnNTdGFydFtmaWVsZENvZGVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmZpZWxkVmFsaWRhdGlvbnNTdGFydFtmaWVsZENvZGVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkRmllbGRWYWxpZGF0aW9uRmluaXNoKGZpZWxkcywgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBmaWVsZFNldCA9IChBcnJheS5pc0FycmF5KGZpZWxkcykpID8gZmllbGRzIDogW2ZpZWxkc107XG4gICAgZmllbGRTZXQuZm9yRWFjaCgoZmllbGRDb2RlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZENvZGVdKSB7XG4gICAgICAgIHRoaXMuZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZENvZGVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRJbnB1dFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcsIGludHJpbnNpY1ZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRUb1ZhbGlkYXRlID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGRUb1ZhbGlkYXRlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZpZWxkVG9WYWxpZGF0ZS5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXTtcbiAgICBpZiAodmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCBjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlID0gdmFsaWRhdGlvbk1ldGhvZChmaWVsZFRvVmFsaWRhdGUpO1xuICAgICAgICBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMucHVzaChjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRGaWVsZFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcsIGludHJpbnNpY1ZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRUb1ZhbGlkYXRlID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGRUb1ZhbGlkYXRlIHx8ICFpbnRyaW5zaWNWYWxpZGF0aW9uKSB7IHJldHVybjsgfVxuICAgIGZpZWxkVG9WYWxpZGF0ZS5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV07XG4gICAgaWYgKHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgIGNvbnN0IGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2UgPSB2YWxpZGF0aW9uTWV0aG9kKGZpZWxkVG9WYWxpZGF0ZSk7XG4gICAgICAgIGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcy5wdXNoKGNsaWVudFZhbGlkYXRpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudFZhbGlkYXRpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50VmFsaWRhdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlVmFsaWRhdGlvbiA9IGNsaWVudFZhbGlkYXRpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRTZXJ2ZXJGaWVsZFZhbGlkYXRpb24oZmllbGRUb1ZhbGlkYXRlKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGlucHV0RmllbGQpIHtcbiAgICBjb25zdCBmaWVsZE9iaiA9ICh0eXBlb2YgaW5wdXRGaWVsZCA9PT0gJ3N0cmluZycpXG4gICAgICA/IHRoaXMuZ2V0RmllbGQoaW5wdXRGaWVsZCkgOiBpbnB1dEZpZWxkO1xuICAgIGxldCBmaW5pc2ggPSB0cnVlO1xuICAgIGxldCB2YWxpZGF0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoZmllbGRPYmouYmFja2VuZCkge1xuICAgICAgZmllbGRPYmoudmFsaWRhdGluZyA9IHRydWU7XG4gICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMudmFsaWRhdGUsIGZpZWxkT2JqLmZpZWxkQ29kZSk7XG4gICAgICBmaW5pc2ggPSAhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgYXdhaXQgdGhpcy5maW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmosIHZhbGlkYXRpb25SZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZE9iai5zZXRFcnJvckNvZGUodGhpcy5lcnJvckNvZGUpO1xuICAgICAgZmllbGRPYmouc2V0RXJyb3JNZXNzYWdlKHRoaXMuZXJyb3JNZXNzYWdlKTtcbiAgICAgIHRoaXMuZGlzcGxheVZhbGlkYXRpb25TZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICBmaWVsZE9iai52YWxpZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmaW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmplY3QsIHZhbGlkYXRpb25SZXN1bHQpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ2FsbGJhY2tzID0gdGhpcy5maWVsZFZhbGlkYXRpb25zRmluaXNoW2ZpZWxkT2JqZWN0LmZpZWxkQ29kZV07XG4gICAgaWYgKHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKHZhbGlkYXRpb25NZXRob2QoZmllbGRPYmplY3QsIHZhbGlkYXRpb25SZXN1bHQpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb250aW51ZUZpZWxkVmFsaWRhdGlvbihmaWVsZENvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSBhY2Npb25lcyBzb2JyZSBUYWJsYXNcbiAgICovXG5cbiAgYWRkVGFibGVBY3Rpb25TdGFydCh0YWJsZU5hbWUsIGFjdGlvbkNvZGUsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVycyA9IG51bGw7XG4gICAgaWYgKHRoaXMudGFibGVBY3Rpb25zU3RhcnRbdGFibGVOYW1lXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy50YWJsZUFjdGlvbnNTdGFydFt0YWJsZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHRoaXMudGFibGVBY3Rpb25zU3RhcnRbdGFibGVOYW1lXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgaWYgKCF0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA9IFtdO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0ucHVzaChjYWxsYmFja01ldGhvZCk7XG4gIH1cblxuICBhZGRUYWJsZUFjdGlvbkZpbmlzaCh0YWJsZU5hbWUsIGFjdGlvbkNvZGUsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVycyA9IG51bGw7XG4gICAgaWYgKHRoaXMudGFibGVBY3Rpb25zRmluaXNoW3RhYmxlTmFtZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVBY3Rpb25zRmluaXNoW3RhYmxlTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy50YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVOYW1lXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgaWYgKCF0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA9IFtdO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0ucHVzaChjYWxsYmFja01ldGhvZCk7XG4gIH1cblxuICBhZGRUYWJsZVNlbGVjdGlvblN0YXJ0KHRhYmxlTmFtZSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnMgPSBudWxsO1xuICAgIGlmICh0aGlzLnRhYmxlU2VsZWN0aW9uc1N0YXJ0W3RhYmxlTmFtZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVTZWxlY3Rpb25zU3RhcnRbdGFibGVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uc1N0YXJ0W3RhYmxlTmFtZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgfVxuXG4gIGFkZFRhYmxlU2VsZWN0aW9uRmluaXNoKHRhYmxlTmFtZSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnMgPSBudWxsO1xuICAgIGlmICh0aGlzLnRhYmxlU2VsZWN0aW9uc0ZpbmlzaFt0YWJsZU5hbWVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLnRhYmxlU2VsZWN0aW9uc0ZpbmlzaFt0YWJsZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMudGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlTmFtZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgfVxuXG4gIGFkZFRhYmxlR2V0RGF0YVN0YXJ0KHRhYmxlTmFtZSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnMgPSBudWxsO1xuICAgIGlmICh0aGlzLnRhYmxlR2V0RGF0YVN0YXJ0W3RhYmxlTmFtZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVHZXREYXRhU3RhcnRbdGFibGVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLnRhYmxlR2V0RGF0YVN0YXJ0W3RhYmxlTmFtZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgfVxuXG4gIGFkZFRhYmxlR2V0RGF0YUZpbmlzaCh0YWJsZU5hbWUsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzID0gbnVsbDtcbiAgICBpZiAodGhpcy50YWJsZUdldERhdGFGaW5pc2hbdGFibGVOYW1lXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy50YWJsZUdldERhdGFGaW5pc2hbdGFibGVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLnRhYmxlR2V0RGF0YUZpbmlzaFt0YWJsZU5hbWVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbR0VUX0RBVEFfQUNUSU9OXSA9IGNhbGxiYWNrTWV0aG9kO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkV2ZW50KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uQ29kZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLnRhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gdGFibGVBY3Rpb25NZXRob2QodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgY3VyciksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlckdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgZmluaXNoID0gdHJ1ZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogR0xPQkFMX0FDVElPTixcbiAgICAgICAgYWN0aW9uQ29kZVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLnRhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkV2ZW50KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IGFjdGlvbkRldGFpbDtcbiAgICBjb25zdCBhY3Rpb24gPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVBY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSB0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCBhY3Rpb24sIHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgZmluaXNoID0gdHJ1ZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5pbmxpbmUsXG4gICAgICAgIGFjdGlvbkNvZGUsXG4gICAgICAgIHRhYmxlUmVjb3JkSWQ6IHJlY29yZElkLFxuICAgICAgICB0YWJsZVJlY29yZERhdGE6IHJlY29yZERhdGFcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihmb3JtQWN0aW9ucy50YWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBmaW5pc2ggPSAhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgdGhpcy5maW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KTtcbiAgICAgIGFjdGlvbi5uZXdTdGF0ZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGFjdGlvbi5uZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGNvbXBsZXRlSW5saW5lQWN0aW9uKHRhYmxlQWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbik7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlU2VsZWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVTZWxlY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBpZiAodGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZVNlbGVjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IHRhYmxlU2VsZWN0aW9uTWV0aG9kKHRhYmxlU2VsZWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJSZWNvcmRTZWxlY3Rpb24odGFibGVTZWxlY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbCkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIHRhYmxlQ29kZSwgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IGZpbmlzaCA9IHRydWU7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHRhYmxlT2JqZWN0LnNlbGVjdGlvbkJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3Q6IGFueSA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLnJvd1NlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICB0aGlzLmZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZVJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVTZWxlY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2godGFibGVTZWxlY3Rpb25NZXRob2QodGFibGVTZWxlY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25FdmVudCkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCBhY3Rpb25EZXRhaWwgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uQ29kZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB7IHNlbGVjdGVkUmVjb3JkcyB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIHNlbGVjdGVkUmVjb3Jkc1xuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy50YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCBzZWxlY3RlZFJlY29yZHMgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgZmluaXNoID0gdHJ1ZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogdGhpcy5mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5zZWxlY3Rpb24sXG4gICAgICAgIGFjdGlvbkNvZGUsXG4gICAgICAgIHNlbGVjdGVkUmVjb3Jkc1xuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICB0aGlzLmZpbmlzaFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLnRhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdldERhdGEodGFibGVBY3Rpb25FdmVudCkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGVcbiAgICB9O1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMudGFibGVHZXREYXRhU3RhcnRbdGFibGVDb2RlXTtcbiAgICBpZiAodGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHZXREYXRhKHRhYmxlQWN0aW9uRGV0YWlsKSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgdGFibGVDb2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0geyB0YWJsZUNvZGUgfTtcbiAgICBjb25zdCBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMuZ2V0VGFibGVEYXRhLCBhY3Rpb25TdWJqZWN0KTtcbiAgICBpZiAodGhpcy5lcnJvck9jY3VyZWQoKSkge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIHRhYmxlQWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy50YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1t0YWJsZUFjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tTZWN0aW9uUmVxdWlyZWRGaWVsZHMoc2VjdGlvbkNvZGUsIHJlcUZpZWxkTWVzc2FnZT8pIHtcbiAgICB0aGlzLmNsZWFuRXJyb3JGaWVsZHMobnVsbCwgc2VjdGlvbkNvZGUpO1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRNZXNzYWdlID0gcmVxRmllbGRNZXNzYWdlID8/IHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZFxuICAgIGNvbnN0IG51bUVycm9ycyA9IHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHRoaXMuZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpLCBudWxsLCByZXF1aXJlZEZpZWxkTWVzc2FnZSk7XG4gICAgcmV0dXJuIChudW1FcnJvcnMgPT09IDApO1xuICB9XG5cbiAgdmFsaWRhdGVTZWN0aW9uQ29uc2lzdGVuY3koc2VjdGlvbkNvZGUsIHJlcUZpZWxkTWVzc2FnZT8pIHtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCBjb21wbGV0ZUZpZWxkcyA9IHRoaXMuY2hlY2tTZWN0aW9uUmVxdWlyZWRGaWVsZHMoc2VjdGlvbkNvZGUsIHJlcUZpZWxkTWVzc2FnZSk7XG4gICAgaWYgKCFjb21wbGV0ZUZpZWxkcykge1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGRzID0gdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKTtcbiAgICBpZiAocmVxdWlyZWRFbXB0eUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkcyk7XG4gICAgICB0aGlzLnRhZ0ZpZWxkc1dpdGhFcnJvcihyZXF1aXJlZEVtcHR5RmllbGRzLCBudWxsLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGQpO1xuICAgICAgZm9yIChjb25zdCBmaWVsZENvZGUgb2YgcmVxdWlyZWRFbXB0eUZpZWxkcykge1xuICAgICAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGQgPSB0aGlzLmdldEZpZWxkKGZpZWxkQ29kZSk7XG4gICAgICAgIGlmIChyZXF1aXJlZEVtcHR5RmllbGQgJiYgcmVxdWlyZWRFbXB0eUZpZWxkLndpZGdldFxuICAgICAgICAgICYmIHJlcXVpcmVkRW1wdHlGaWVsZC53aWRnZXQuZm9jdXMpIHtcbiAgICAgICAgICByZXF1aXJlZEVtcHR5RmllbGQud2lkZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdmFsaWRhdGlvbklzc3VlRmllbGRzID0gdGhpcy5nZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpO1xuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uRmllbGRzKTtcbiAgICAgIGZvciAoY29uc3QgZmllbGRDb2RlIG9mIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcykge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25Jc3N1ZUZpZWxkICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkLndpZGdldFxuICAgICAgICAgICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkLndpZGdldC5mb2N1cykge1xuICAgICAgICAgIHZhbGlkYXRpb25Jc3N1ZUZpZWxkLndpZGdldC5mb2N1cygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3I7XG4gIH1cblxuICBjb3B5VGFibGVSZWNvcmRUb0ZpZWxkcyh0YWJsZU9iaiwgbWFwcGluZ1RhYmxlID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU9iai50YWJsZUNvZGUpO1xuICAgIGNvbnN0IHRhYmxlUmVjb3JkID0gdGFibGVPYmplY3QuZ2V0VGFibGVSZWNvcmQodGFibGVPYmoucmVjb3JkSWQpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gdGFibGVPYmplY3QuY29sdW1uTmFtZXM7XG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IHRhYmxlUmVjb3JkLmdldEZpZWxkVmFsdWUoY29sdW1uTmFtZSkgPz8gJyc7XG4gICAgICBjb25zdCBmaWVsZENvZGUgPSBtYXBwaW5nVGFibGU/Lltjb2x1bW5OYW1lXSA/PyBjb2x1bW5OYW1lO1xuICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGZpZWxkQ29kZSwgY29sdW1uVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3BvcnRlIHJlZ2lzdHJvcyBlbiB0YWJsYXMgcXVlIHNlIGVkaXRhbiBlbiBjYW1wb3MgZGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgZGVmaW5lRWRpdGlvblRhYmxlKHRhYmxlRWRpdGlvbkRlZikge1xuICAgIGNvbnN0IHsgY29sdW1uRmllbGRNYXBwaW5nLCByZWNvcmRDYXB0dXJlRmllbGRzLCBzdGFydENvbGxhcHNlZCB9ID0gdGFibGVFZGl0aW9uRGVmO1xuICAgIHRhYmxlRWRpdGlvbkRlZi5zdGFydENvbGxhcHNlZCA9ICh0eXBlb2Ygc3RhcnRDb2xsYXBzZWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgPyBzdGFydENvbGxhcHNlZCA6IHRydWU7XG5cbiAgICBjb25zdCBmaWVsZHNNYXBwaW5nVGFibGUgPSB7fTtcbiAgICBjb25zdCBmaWVsZHNUb0NsZWFyID0gW107XG4gICAgZm9yIChjb25zdCBjb2x1bW5NYXAgb2YgY29sdW1uRmllbGRNYXBwaW5nKSB7XG4gICAgICBjb25zdCBbY29sdW1uTmFtZSwgZm9ybUZpZWxkXSA9IGNvbHVtbk1hcDtcbiAgICAgIGZpZWxkc01hcHBpbmdUYWJsZVtjb2x1bW5OYW1lXSA9IGZvcm1GaWVsZDtcbiAgICAgIGZpZWxkc1RvQ2xlYXIucHVzaChmb3JtRmllbGQpO1xuICAgIH1cbiAgICB0YWJsZUVkaXRpb25EZWYuZmllbGRzTWFwcGluZ1RhYmxlID0gZmllbGRzTWFwcGluZ1RhYmxlO1xuICAgIHRhYmxlRWRpdGlvbkRlZi5maWVsZHNUb0NsZWFyID0gZmllbGRzVG9DbGVhcjtcblxuICAgIGNvbnN0IHsgdGFibGVOYW1lLCBuZXdSZWNvcmRBY3Rpb25OYW1lLCBzYXZlUmVjb3JkQWN0aW9uTmFtZSxcbiAgICAgIGNhbmNlbFNhdmVSZWNvcmRBY3Rpb25OYW1lLCB0YWJsZUVkaXRSZWNvcmRBY3Rpb25OYW1lLCBlbmFibGVSZWNvcmRFZGl0aW9uXG4gICAgfSA9IHRhYmxlRWRpdGlvbkRlZjtcblxuICAgIHRoaXMuYWRkQWN0aW9uTWV0aG9kU3RhcnQobmV3UmVjb3JkQWN0aW9uTmFtZSwgKCkgPT4ge1xuICAgICAgdGhpcy5jbGVhbkZpZWxkcyhmaWVsZHNUb0NsZWFyLCBudWxsKTtcbiAgICAgIHRoaXMuc2hvd0ZpZWxkcyhyZWNvcmRDYXB0dXJlRmllbGRzKTtcbiAgICAgIGlmICghZW5hYmxlUmVjb3JkRWRpdGlvbikge1xuICAgICAgICB0aGlzLmVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZUFjdGlvbihuZXdSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICAgIHRoaXMuc2hvd0FjdGlvbihjYW5jZWxTYXZlUmVjb3JkQWN0aW9uTmFtZSk7XG4gICAgICB0aGlzLnNob3dBY3Rpb24oc2F2ZVJlY29yZEFjdGlvbk5hbWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgY29uc3QgeyByZWNvcmRFZGl0aW9uVmFsaWRhdGUsIGRpc2FibGVSZWNvcmRFZGl0aW9uIH0gPSB0YWJsZUVkaXRpb25EZWY7XG4gICAgdGhpcy5hZGRBY3Rpb25NZXRob2RTdGFydChzYXZlUmVjb3JkQWN0aW9uTmFtZSwgKCkgPT4ge1xuICAgICAgcmV0dXJuICghcmVjb3JkRWRpdGlvblZhbGlkYXRlKSA/IHRoaXMucmVjb3JkRWRpdGlvblZhbGlkYXRlKHRhYmxlRWRpdGlvbkRlZilcbiAgICAgICAgOiByZWNvcmRFZGl0aW9uVmFsaWRhdGUodGFibGVFZGl0aW9uRGVmKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEFjdGlvbk1ldGhvZEZpbmlzaChzYXZlUmVjb3JkQWN0aW9uTmFtZSwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmVycm9yT2NjdXJlZCgpKSB7XG4gICAgICAgIHJldHVybiAoIWRpc2FibGVSZWNvcmRFZGl0aW9uKSA/IHRoaXMuZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKVxuICAgICAgICAgIDogZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmFkZEFjdGlvbk1ldGhvZFN0YXJ0KGNhbmNlbFNhdmVSZWNvcmRBY3Rpb25OYW1lLCAoKSA9PiB7XG4gICAgICByZXR1cm4gKCFkaXNhYmxlUmVjb3JkRWRpdGlvbikgPyB0aGlzLmRpc2FibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZilcbiAgICAgICAgOiBkaXNhYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkVGFibGVBY3Rpb25TdGFydCh0YWJsZU5hbWUsIHRhYmxlRWRpdFJlY29yZEFjdGlvbk5hbWUsXG4gICAgICAodGJsQWN0T2JqKSA9PiB7XG4gICAgICAgIHJldHVybiAoIWVuYWJsZVJlY29yZEVkaXRpb24pXG4gICAgICAgICAgPyB0aGlzLmVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmLCB0YmxBY3RPYmopXG4gICAgICAgICAgOiBlbmFibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZiwgdGJsQWN0T2JqKTtcbiAgICAgIH0pO1xuICAgIGlmICh0YWJsZUVkaXRpb25EZWYuc3RhcnRDb2xsYXBzZWQpIHtcbiAgICAgIHJldHVybiAoIXRhYmxlRWRpdGlvbkRlZi5kaXNhYmxlUmVjb3JkRWRpdGlvbilcbiAgICAgICAgPyB0aGlzLmRpc2FibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZilcbiAgICAgICAgOiB0YWJsZUVkaXRpb25EZWYuZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICghdGFibGVFZGl0aW9uRGVmLmVuYWJsZVJlY29yZEVkaXRpb24pXG4gICAgICAgID8gdGhpcy5lbmFibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZilcbiAgICAgICAgOiB0YWJsZUVkaXRpb25EZWYuZW5hYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmLCB0YWJsZUFjdGlvbk9iamVjdCA9IG51bGwpIHtcbiAgICBpZiAodGFibGVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHRoaXMuY29weVRhYmxlUmVjb3JkVG9GaWVsZHModGFibGVBY3Rpb25PYmplY3QsIHRhYmxlRWRpdGlvbkRlZi5maWVsZHNNYXBwaW5nVGFibGUpO1xuICAgIH1cbiAgICB0aGlzLnNob3dGaWVsZHModGFibGVFZGl0aW9uRGVmLnJlY29yZENhcHR1cmVGaWVsZHMpO1xuICAgIHRoaXMuaGlkZUFjdGlvbih0YWJsZUVkaXRpb25EZWYubmV3UmVjb3JkQWN0aW9uTmFtZSk7XG4gICAgdGhpcy5zaG93QWN0aW9uKHRhYmxlRWRpdGlvbkRlZi5jYW5jZWxTYXZlUmVjb3JkQWN0aW9uTmFtZSk7XG4gICAgdGhpcy5zaG93QWN0aW9uKHRhYmxlRWRpdGlvbkRlZi5zYXZlUmVjb3JkQWN0aW9uTmFtZSk7XG4gICAgaWYgKHRhYmxlRWRpdGlvbkRlZi5maWVsZHNUb1RyaWdnZXJWYWxpZGF0aW9uXG4gICAgICAmJiB0YWJsZUVkaXRpb25EZWYuZmllbGRzVG9UcmlnZ2VyVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiB0YWJsZUVkaXRpb25EZWYuZmllbGRzVG9UcmlnZ2VyVmFsaWRhdGlvbikge1xuICAgICAgICB0aGlzLnN0YXJ0RmllbGRWYWxpZGF0aW9uKGZpZWxkTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5jbGVhbkZpZWxkcyh0YWJsZURlZmluaXRpb24uZmllbGRzVG9DbGVhciwgbnVsbCk7XG4gICAgdGhpcy5oaWRlRmllbGRzKHRhYmxlRGVmaW5pdGlvbi5yZWNvcmRDYXB0dXJlRmllbGRzKTtcbiAgICB0aGlzLnNob3dBY3Rpb24odGFibGVEZWZpbml0aW9uLm5ld1JlY29yZEFjdGlvbk5hbWUpO1xuICAgIHRoaXMuaGlkZUFjdGlvbih0YWJsZURlZmluaXRpb24uY2FuY2VsU2F2ZVJlY29yZEFjdGlvbk5hbWUpO1xuICAgIHRoaXMuaGlkZUFjdGlvbih0YWJsZURlZmluaXRpb24uc2F2ZVJlY29yZEFjdGlvbk5hbWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmVjb3JkRWRpdGlvblZhbGlkYXRlKHRhYmxlRWRpdGlvbkRlZikge1xuICAgIGNvbnN0IHsgcmVjb3JkQ2FwdHVyZUZpZWxkcyB9ID0gdGFibGVFZGl0aW9uRGVmO1xuICAgIGxldCB2YWxpZGF0aW9uT2sgPSB0cnVlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHMgPSB0aGlzLmdldFJlcXVpcmVkRW1wdHlGaWVsZHMocmVjb3JkQ2FwdHVyZUZpZWxkcywgbnVsbCk7XG4gICAgaWYgKHJlcXVpcmVkRW1wdHlGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbk9rID0gZmFsc2U7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHJlcXVpcmVkRW1wdHlGaWVsZHMsIG51bGwsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkYXRpb25Jc3N1ZUZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMocmVjb3JkQ2FwdHVyZUZpZWxkcywgbnVsbCk7XG4gICAgaWYgKHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uT2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvbkZpZWxkcyk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0aW9uT2s7XG4gIH1cbn1cbiJdfQ==
1547
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQU1uRixNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUVsQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBS3RCLE1BQU0sT0FBTyxrQkFBa0I7SUE4UTdCLFlBQ1ksa0JBQXlDLEVBQ3pDLGFBQXFDLEVBQ3JDLGdCQUEwQztRQUYxQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXVCO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtRQUNyQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTBCO1FBaFI5QyxtQkFBYyxHQUF5QixJQUFJLENBQUM7UUFDNUMsa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFHN0Isd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzdDLCtCQUEr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QUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzVHO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7O1lBLzZDRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjthQUN0Qzs7O1lBbkJRLHFCQUFxQjtZQUNyQixzQkFBc0I7WUFDdEIsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtU3RydWN0dXJlQW5kRGF0YSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZm9ybSc7XG5pbXBvcnQgeyBMaWJGb3JtTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnQtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IExpYkZpbGVNYW5hZ2VtZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbGUtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IGZvcm1BY3Rpb25zLCBOT19FUlJPUiwgSEVBREVSIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9mb3JtLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9hY3Rpb24nO1xuaW1wb3J0IHsgRmllbGREZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9mb3Jtcy9maWVsZCc7XG5pbXBvcnQgeyBSZWNvcmRUYWJsZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvdGFibGUvdGFibGUnO1xuaW1wb3J0IHsgUmVjb3JkRm9ybVNlY3Rpb24gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL3NlY3Rpb24nO1xuXG5jb25zdCBQQVlMT0FEX1ZFUlNJT04gPSAnVFVBSU5FWENIQU5HRV8xLjAnO1xuY29uc3QgSU5MSU5FX0FDVElPTiA9ICdJTkxJTkUnO1xuY29uc3QgR0xPQkFMX0FDVElPTiA9ICdHTE9CQUwnO1xuY29uc3QgR0VUX0RBVEFfQUNUSU9OID0gJ0dFVERBVEEnO1xuXG5jb25zdCBTVUJKRUNUID0gJ3N1YmplY3QnO1xuY29uc3QgVE9LRU4gPSAndG9rZW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YFxufSlcbmV4cG9ydCBjbGFzcyBCYXNpY0Zvcm1Db21wb25lbnQge1xuICBwcml2YXRlIF9mb3JtU3RydWN0dXJlOiBGb3JtU3RydWN0dXJlQW5kRGF0YSA9IG51bGw7XG4gIHByaXZhdGUgX2NvbnRyb2xUb2tlbjogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBfb3JpZ2luVG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBfZm9ybVJvdXRlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlZmluaXRpb25PYnRhaW5lZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBFdmVudG9zIGRlIGFjY2lvbmVzIHkgY2FtcG9zXG4gIHByaXZhdGUgX2Zvcm1TZWN0aW9uc0FjdGl2YXRlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgX2Zvcm1BY3Rpb25zU3RhcnQ6IGFueSA9IHt9O1xuICBwcml2YXRlIF9mb3JtQWN0aW9uc0ZpbmlzaDogYW55ID0ge307XG4gIHByaXZhdGUgX2ZpZWxkSW5wdXRWYWxpZGF0aW9uOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRWYWxpZGF0aW9uc1N0YXJ0OiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRWYWxpZGF0aW9uc0ZpbmlzaDogYW55ID0ge307XG4gIC8vIENhbGxiYWNrIGRlIGFjY2lvbmVzIGRlIHRhYmxhc1xuICBwcml2YXRlIF90YWJsZVNlbGVjdGlvbnNTdGFydDogYW55ID0ge307XG4gIHByaXZhdGUgX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaDogYW55ID0ge307XG4gIHByaXZhdGUgX3RhYmxlQWN0aW9uc1N0YXJ0OiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVBY3Rpb25zRmluaXNoOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVHZXREYXRhU3RhcnQ6IGFueSA9IHt9O1xuICBwcml2YXRlIF90YWJsZUdldERhdGFGaW5pc2g6IGFueSA9IHt9O1xuXG4gIHByb3RlY3RlZCBpbnB1dERhdGFGaWVsZHM6IGFueSA9IHt9O1xuICBwcm90ZWN0ZWQgZXh0cmFEYXRhOiBhbnkgPSB7fTtcbiAgcHJvdGVjdGVkIF9ldmVudEVtaXRlcjogTGliRXZlbnRNYW5hZ2VyU2VydmljZTtcblxuXG4gIGZvcm1Db25maWc6IGFueTtcbiAgbmFtZTogc3RyaW5nO1xuICBmb3JtU3ViamVjdDogc3RyaW5nO1xuICBfZXJyb3JUeXBlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JDb2RlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JEZXRhaWw6IHN0cmluZyA9ICcnO1xuICB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZmllbGRzOiBhbnk7XG4gIGFjdGlvbnM6IGFueTtcbiAgYnVzeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRUaXRsZSgpO1xuICB9XG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0VGl0bGUodGl0bGUpO1xuICB9XG4gIGNsZWFuRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uY2xlYW5EYXRhKCk7XG4gIH1cbiAgZ2V0Q3VycmVudFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRDdXJyZW50U3RhdGUoKTtcbiAgfVxuICBzdXBwb3J0U3RhdGUoc3RhdGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdXBwb3J0U3RhdGUoc3RhdGUpO1xuICB9XG4gIGNoYW5nZVN0YXRlKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmNoYW5nZVN0YXRlKHN0YXRlKTtcbiAgfVxuICBnZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnN0YXRlcztcbiAgfVxuICBnZXRJbW11dGFibGVFbGVtZW50KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRJbW11dGFibGVFbGVtZW50KG5hbWUpO1xuICB9XG4gIGdldEV4dHJhSW5mbyhuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RXh0cmFJbmZvKG5hbWUpO1xuICB9XG4gIGdldEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzKCk7XG4gIH1cbiAgZ2V0RmllbGROYW1lcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGROYW1lcygpO1xuICB9XG4gIGdldEZpZWxkKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZChjb2RlKTtcbiAgfVxuICBlbmFibGVGaWVsZChjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZW5hYmxlRmllbGQoY29kZSk7XG4gIH1cbiAgZGlzYWJsZUZpZWxkKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5kaXNhYmxlRmllbGQoY29kZSk7XG4gIH1cbiAgZ2V0RmllbGRWYWx1ZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRWYWx1ZShjb2RlKTtcbiAgfVxuICBnZXRGaWVsZHNWYWx1ZXMoY29kZXM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkc1ZhbHVlcyhjb2Rlcyk7XG4gIH1cbiAgZ2V0RmllbGRPcHRpb25zKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRGaWVsZE9wdGlvbnMoY29kZSk7XG4gIH1cbiAgc2V0RmllbGRWYWx1ZShjb2RlOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRWYWx1ZShjb2RlLCB2YWx1ZSk7XG4gIH1cbiAgc2V0RmllbGRSZXF1aXJlZChjb2RlOiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkUmVxdWlyZWQoY29kZSwgcmVxdWlyZWQpO1xuICB9XG4gIHNldEZpZWxkRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRFcnJvck1lc3NhZ2UoY29kZSwgZXJyb3JNZXNzYWdlKTtcbiAgfVxuICBzZXRGaWVsZEVycm9yKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNldEZpZWxkRXJyb3IoY29kZSwgbWVzc2FnZSwgdHlwZSk7XG4gIH1cbiAgc2V0RmllbGRJbnRyaW5zaWNFcnJvck1lc3NhZ2UoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRJbnRyaW5zaWNFcnJvck1lc3NhZ2UoY29kZSwgbWVzc2FnZSk7XG4gIH1cbiAgc2V0RmllbGRPcHRpb25zKGNvZGUsIG9wdGlvbnNBcnJheSwgaWRBdHRyaWJ1dGUsIG5hbWVBdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2V0RmllbGRPcHRpb25zKGNvZGUsIG9wdGlvbnNBcnJheSwgaWRBdHRyaWJ1dGUsIG5hbWVBdHRyaWJ1dGUpO1xuICB9XG4gIGdldEZpZWxkU2V0KGZpbHRlckZ1bmM/LCBjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEZpZWxkU2V0KGZpbHRlckZ1bmMsIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBhcHBseU9uRmllbGRzKHByb2Nlc3NGdW5jLCBjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFwcGx5T25GaWVsZHMocHJvY2Vzc0Z1bmMsIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBhcHBseVByb2Nlc3NUb0FsbEZpZWxkcyhwcm9jZXNzRnVuYykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5hcHBseU9uRmllbGRzKHByb2Nlc3NGdW5jKTtcbiAgfVxuICBjbGVhbkZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmNsZWFuRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRSZXF1aXJlZEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFJlcXVpcmVkRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRSZXF1aXJlZEVtcHR5RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZ2V0Q2hhbmdlZEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldENoYW5nZWRGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGdldEZpZWxkc1dpdGhWYWxpZGF0aW9uSXNzdWVzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIHRhZ0ZpZWxkc1dpdGhFcnJvcihlcnJvck1lc3NhZ2UsIGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8udGFnRmllbGRzV2l0aEVycm9yKGVycm9yTWVzc2FnZSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGNsZWFuRXJyb3JGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZywgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhbkVycm9yRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBzaG93TGFiZWxGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZywgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93TGFiZWxGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGhpZGVMYWJlbEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVMYWJlbEZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgZW5hYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZW5hYmxlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBkaXNhYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZGlzYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBlbmFibGVGaWVsZHNcbiAgICovXG4gIGVuYWJsZUVkaXRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZywgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBkaXNhYmxlRmllbGRzXG4gICAqL1xuICBkaXNhYmxlRWRpdEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgc2hvd0ZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dGaWVsZHMoY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGhpZGVGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZywgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBnZXRBY3Rpb25zQnlBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRBY3Rpb25zQnlBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG4gIGdldEhlYWRlckFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldEFjdGlvbnNCeUF0dHJpYnV0ZSgnbG9jYXRpb24nLCBIRUFERVIpO1xuICB9XG4gIGdldEFjdGlvbihhY3Rpb25Db2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICB9XG4gIHNob3dBY3Rpb25zKGFjdGlvbkFycmF5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBoaWRlQWN0aW9ucyhhY3Rpb25BcnJheSkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlQWN0aW9ucyhhY3Rpb25BcnJheSk7XG4gIH1cbiAgZW5hYmxlQWN0aW9ucyhhY3Rpb25BcnJheSkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5lbmFibGVBY3Rpb25zKGFjdGlvbkFycmF5KTtcbiAgfVxuICBkaXNhYmxlQWN0aW9ucyhhY3Rpb25BcnJheSkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5kaXNhYmxlQWN0aW9ucyhhY3Rpb25BcnJheSk7XG4gIH1cbiAgc2hvd0FjdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd0FjdGlvbnMoY29kZSk7XG4gIH1cbiAgaGlkZUFjdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZUFjdGlvbnMoY29kZSk7XG4gIH1cbiAgZW5hYmxlQWN0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5lbmFibGVBY3Rpb25zKGNvZGUpO1xuICB9XG4gIGRpc2FibGVBY3Rpb24oY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmRpc2FibGVBY3Rpb25zKGNvZGUpO1xuICB9XG4gIGdldFNlY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5nZXRTZWN0aW9ucygpO1xuICB9XG4gIGFjdGl2YXRlU2VjdGlvbihjb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmFjdGl2YXRlU2VjdGlvbihjb2RlKTtcbiAgfVxuICBnZXRTZWN0aW9uc1RpdGxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbnMoKS5tYXAoc2VjID0+IHNlYy50aXRsZSk7XG4gIH1cbiAgZ2V0U2VjdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0U2VjdGlvbihjb2RlKTtcbiAgfVxuICBzaG93U2VjdGlvbihjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1NlY3Rpb25zKGNvZGUpO1xuICB9XG4gIGhpZGVTZWN0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5oaWRlU2VjdGlvbnMoY29kZSk7XG4gIH1cbiAgc2hvd1NlY3Rpb25zKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zaG93U2VjdGlvbnMoY29kZXMpO1xuICB9XG4gIGhpZGVTZWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVNlY3Rpb25zKGNvZGVzKTtcbiAgfVxuICBnZXRTdWJTZWN0aW9uKGNvZGU6IHN0cmluZywgc3ViQ29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFN1YlNlY3Rpb24oY29kZSwgc3ViQ29kZSk7XG4gIH1cbiAgc2hvd1N1YlNlY3Rpb24oY29kZTogc3RyaW5nLCBzdWJDb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1N1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGUpO1xuICB9XG4gIGhpZGVTdWJTZWN0aW9uKGNvZGU6IHN0cmluZywgc3ViQ29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVTdWJTZWN0aW9ucyhjb2RlLCBzdWJDb2RlKTtcbiAgfVxuICBzaG93U3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJDb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1N1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzKTtcbiAgfVxuICBoaWRlU3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJDb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaGlkZVN1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzKTtcbiAgfVxuICBnZXRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFRhYmxlcygpO1xuICB9XG4gIHNob3dUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNob3dUYWJsZXMoY29kZXMpO1xuICB9XG4gIGhpZGVUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVUYWJsZXMoY29kZXMpO1xuICB9XG4gIGNsZWFuVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5jbGVhblRhYmxlcyhjb2Rlcyk7XG4gIH1cbiAgZ2V0VGFibGUoY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFRhYmxlKGNvZGUpO1xuICB9XG4gIHNob3dUYWJsZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uc2hvd1RhYmxlcyhjb2RlKTtcbiAgfVxuICBoaWRlVGFibGUoY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmhpZGVUYWJsZXMoY29kZSk7XG4gIH1cbiAgY2xlYW5UYWJsZShjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uZ2V0VGFibGUoY29kZSk/LmNsZWFuKCk7XG4gIH1cbiAgZ2V0VGFibGVSZWNvcmQoY29kZTogc3RyaW5nLCByZWNvcmRJZDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmdldFRhYmxlUmVjb3JkKGNvZGUsIHJlY29yZElkKTtcbiAgfVxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1NYW5hZ2VyU2VydmljZTogTGliRm9ybU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBfZXZlbnRNYW5hZ2VyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmaWxlTWdtdFNlcnZpY2VzOiBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UpIHtcbiAgICB0aGlzLl9ldmVudEVtaXRlciA9IHRoaXMuX2V2ZW50TWFuYWdlcjtcbiAgICB0aGlzLmNsZWFuU3RhcnQoKTtcbiAgICB0aGlzLmN1c3RvbVByZVByb2Nlc3NpbmcoKTtcbiAgfVxuXG4gIHNldENvbmZpZyhmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcbiAgfVxuXG4gIGNsZWFuU3RhcnQoKSB7XG4gICAgdGhpcy5fZXJyb3JUeXBlID0gJyc7XG4gICAgdGhpcy5lcnJvckNvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSAnJztcbiAgICB0aGlzLl9mb3JtU3RydWN0dXJlID0gbnVsbDtcbiAgICB0aGlzLmZpZWxkcyA9IG51bGw7XG4gICAgdGhpcy5hY3Rpb25zID0gbnVsbDtcbiAgICB0aGlzLl9jb250cm9sVG9rZW4gPSBudWxsO1xuICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0ge307XG4gICAgdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkID0gZmFsc2U7XG4gICAgLy8gU2UgbGltcGlhbiBsb3MgbWFuZWphZG9yZXMgZGUgZXZlbnRvc1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlID0ge307XG4gICAgdGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZSA9IHt9O1xuICAgIHRoaXMuX2Zvcm1BY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl9mb3JtQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uID0ge307XG4gICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0ID0ge307XG4gICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0ID0ge307XG4gICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fdGFibGVBY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl90YWJsZUdldERhdGFTdGFydCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlR2V0RGF0YUZpbmlzaCA9IHt9O1xuICB9XG5cbiAgZ2V0IGZvcm1WaXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy52aXNpYmxlOyB9XG4gIGdldCBmb3JtTWFuYWdlcigpIHsgcmV0dXJuIHRoaXM7IH1cbiAgZ2V0IGZvcm1Db2RlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5hbWU7IH1cbiAgc2V0IGZvcm1Db2RlKG5hbWU6IHN0cmluZykgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG4gIGdldCBpblNlcnZlclByb2Nlc3MoKSB7IHJldHVybiB0aGlzLmJ1c3k7IH1cbiAgZ2V0IGZvcm0oKTogRm9ybVN0cnVjdHVyZUFuZERhdGEgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZTsgfVxuXG4gIGdldCBzdGF0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRDdXJyZW50U3RhdGUoKTsgfVxuICBnZXQgY3VycmVudFN0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy5zdGF0ZTsgfVxuICBzZXQgY3VycmVudFN0YXRlKHN0YXRlOiBzdHJpbmcpIHsgdGhpcy5fZm9ybVN0cnVjdHVyZS5jaGFuZ2VTdGF0ZShzdGF0ZSk7IH1cbiAgZ2V0IGN1cnJlbnRNb2RlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZTsgfVxuICBnZXQgaW1tdXRhYmxlRGF0YSgpOiBhbnkgeyByZXR1cm4gdGhpcy5fZm9ybVN0cnVjdHVyZT8uaW1tdXRhYmxlRGF0YSB9XG4gIGdldCBleHRyYUluZm8oKTogYW55IHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LmV4dHJhSW5mbyB9XG4gIGdldCB2aXNpYmxlU2VjdGlvbnMoKTogUmVjb3JkRm9ybVNlY3Rpb25bXSB7IHJldHVybiB0aGlzLl9mb3JtU3RydWN0dXJlPy52aXNpYmxlU2VjdGlvbnM7IH1cblxuICBnZXQgZm9ybVJvdXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9mb3JtUm91dGU7IH1cbiAgc2V0IGZvcm1Sb3V0ZShyb3V0ZTogc3RyaW5nKSB7IHRoaXMuX2Zvcm1Sb3V0ZSA9IHJvdXRlOyB9XG5cbiAgZ2V0IHN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZm9ybVN1YmplY3Q7IH1cblxuICAvLyBNw6l0b2RvcyB2aXJ0dWFsZXNcbiAgY3VzdG9tUHJlUHJvY2Vzc2luZygpIHsgfVxuICBjdXN0b21Gb3JtU3RhcnQoKSB7IH1cbiAgZGlzcGxheUFjdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSB7IH1cbiAgZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKSB7IH1cbiAgc2hvd0ZpZWxkSW5mbyhmaWVsZENvZGU6IHN0cmluZykgeyB9XG4gIHNob3dNb2RhbERpYWxvZyh0aXRsZSwgYm9keSwgb3B0aW9ucywgY2FsbGJhY2s/LCBwYXJhbXM/KSB7IH1cbiAgb3BlblVwbG9hZERpYWxvZyh0aXRsZSwgYm9keSwgb3B0aW9ucywgY2FsbGJhY2s/LCBwYXJhbXM/KSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1cHBvcnRTdGF0ZVxuICAgKi9cbiAgc3VwcG9ydE1vZGUoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdXBwb3J0U3RhdGUoc3RhdGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRGaWVsZFxuICAgKi9cbiAgZ2V0RmllbGRPYmplY3QoY29kZTogc3RyaW5nKTogRmllbGREZXNjcmlwdG9yIHsgcmV0dXJuIHRoaXMuZ2V0RmllbGQoY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEFjdGlvblxuICAgKi9cbiAgZ2V0QWN0aW9uT2JqZWN0KGNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb24geyByZXR1cm4gdGhpcy5nZXRBY3Rpb24oY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldFRhYmxlXG4gICAqL1xuICBnZXRUYWJsZU9iamVjdChjb2RlOiBzdHJpbmcpOiBSZWNvcmRUYWJsZSB7IHJldHVybiB0aGlzLmdldFRhYmxlKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRTZWN0aW9uXG4gICAqL1xuICBnZXRTZWN0aW9uT2JqZWN0KGNvZGU6IHN0cmluZyk6IFJlY29yZEZvcm1TZWN0aW9uIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbihjb2RlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY2hhbmdlU3RhdGVcbiAgICovXG4gIGNoYW5nZUZvcm1Nb2RlKHN0YXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2hhbmdlU3RhdGUoc3RhdGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXRGb3JtU3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdWJqZWN0OyB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0U3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5mb3JtU3ViamVjdDsgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1YmplY3RcbiAgICovXG4gIGdldGZvcm1TdWJqZWN0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFN1YmplY3QoKTsgfVxuXG5cbiAgbnVtU2VjdGlvbnMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2Zvcm1TdHJ1Y3R1cmU/LnNlY3Rpb25zLmxlbmd0aDsgfVxuXG4gIHN1YnNjcmliZUFwcEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyLnN1YnNjcmliZShldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9wZW5Gb3JtKG5hbWU6IHN0cmluZywgZGF0YSA9IG51bGwsIGJhY2tEYXRhID0gbnVsbCwgY2xlYW5TdGFjayA9IGZhbHNlKTogdm9pZCB7XG4gICAgbGV0IG9yaWdpbiA9IG51bGw7XG4gICAgaWYgKCFjbGVhblN0YWNrKSB7XG4gICAgICBvcmlnaW4gPSB7IC4uLmJhY2tEYXRhLCBuYW1lOiB0aGlzLm5hbWUsIHVybDogdGhpcy5fZm9ybVJvdXRlLCB0b2tlbjogdGhpcy5fY29udHJvbFRva2VuIH07XG4gICAgICBvcmlnaW4uc3ViamVjdCA9IG9yaWdpbj8uc3ViamVjdCA/PyB0aGlzLmZvcm1TdWJqZWN0O1xuICAgICAgb3JpZ2luLnN0YXRlID0gb3JpZ2luPy5zdGF0ZSA/PyB0aGlzLmN1cnJlbnRTdGF0ZTtcbiAgICAgIG9yaWdpbi5maWVsZHMgPSBvcmlnaW4/LmZpZWxkcyA/PyB7fTtcbiAgICAgIG9yaWdpbi5leHRyYSA9IG9yaWdpbj8uZXh0cmEgPz8ge307XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHsgLi4uZGF0YSwgbmFtZSB9O1xuICAgIHRhcmdldC5zdWJqZWN0ID0gdGFyZ2V0Py5zdWJqZWN0ID8/IG51bGw7XG4gICAgdGFyZ2V0LnN0YXRlID0gdGFyZ2V0Py5zdGF0ZSA/PyBudWxsO1xuICAgIHRhcmdldC5maWVsZHMgPSB0YXJnZXQ/LmZpZWxkcyA/PyB7fTtcbiAgICB0YXJnZXQuZXh0cmEgPSB0YXJnZXQ/LmV4dHJhID8/IHt9O1xuICAgIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLm9wZW5Gb3JtKG9yaWdpbiwgdGFyZ2V0KTtcbiAgfVxuXG4gIGNhbkdvQmFjaygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yaWdpblRva2VuICE9PSBudWxsIH1cbiAgZ29CYWNrKCk6IHZvaWQgeyByZXR1cm4gdGhpcy5mb3JtTWFuYWdlclNlcnZpY2UuYmFja1RvKCk7IH1cbiAgZ29CYWNrRm9ybSgpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZ29CYWNrKCk7IH1cbiAgZ2V0T3JpZ2luRGV0YWlsKCk6IGFueSB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5nZXRGb3JtSW5mbyh0aGlzLl9vcmlnaW5Ub2tlbik7IH1cblxuICBzZXRFcnJvcihlcnJvclR5cGU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGVycm9yRGV0YWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSBlcnJvclR5cGUgfHwgJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHx8ICcnO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpOiB2b2lkIHsgdGhpcy5zZXRFcnJvcihudWxsLCBudWxsLCBudWxsKTsgfVxuICBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlOyB9XG4gIGdldEVycm9yRGV0YWlsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVycm9yRGV0YWlsOyB9XG4gIGdldEVycm9yQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZXJyb3JUeXBlOyB9XG5cbiAgZ2V0Rm9ybVBhcmFtZXRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAobmFtZSkgPyAodGhpcy5leHRyYURhdGE/LltuYW1lXSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICBwcmVvY2Vzc0lucHV0UGFyYW1zKHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICB0aGlzLl9jb250cm9sVG9rZW4gPSBwYXJhbXM/LltUT0tFTl0gPz8gbnVsbDtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuX2NvbnRyb2xUb2tlbik7XG4gICAgaWYgKCF0aGlzLl9jb250cm9sVG9rZW4gfHwgdGhpcy5fY29udHJvbFRva2VuICE9PSB0b2tlbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMuZm9ybVN1YmplY3QgPSBwYXJhbXM/LltTVUJKRUNUXSA/PyBzdWJqZWN0ID8/IG51bGw7XG4gICAgdGhpcy5pbnB1dERhdGFGaWVsZHMgPSBmaWVsZHM7XG4gICAgdGhpcy5leHRyYURhdGEgPSBleHRyYTtcbiAgICB0aGlzLl9vcmlnaW5Ub2tlbiA9IG9yaWdpblRva2VuO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1TZWN0aW9ucyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuc2VjdGlvbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVNlY3Rpb25zKSkge1xuICAgICAgZm9ybVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgIHNlY3Rpb24uYWN0aXZhdGlvbi5zdWJzY3JpYmUoY29kZSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGUpKTtcbiAgICAgICAgc2VjdGlvbi5pbmFjdGl2YXRpb24uc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5sYXVuY2hTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUZpZWxkc1N1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmdldEZpZWxkcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1GaWVsZHMpKSB7XG4gICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBmaWVsZC5lZGl0aW9uRmluaXNoLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICB0aGlzLnN0YXJ0RmllbGRWYWxpZGF0aW9uKGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgZmllbGQuZWRpdGlvblBhcnRpYWwuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIGludHJpbnNpY1ZhbGlkYXRpb24gfSA9IGV2ZW50O1xuICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZElucHV0VmFsaWRhdGlvbihjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLmRldGFpbFJlcXVlc3Quc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5zaG93RmllbGRJbmZvKGNvZGUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUFjdGlvblN1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1BY3Rpb25zID0gdGhpcy5fZm9ybVN0cnVjdHVyZS5nZXRBY3Rpb25zKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybUFjdGlvbnMpKSB7XG4gICAgICBmb3JtQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgIGFjdGlvbi5hY3Rpb25BY3RpdmF0ZWQuc3Vic2NyaWJlKGNvZGUgPT4gdGhpcy5zdGFydEFjdGlvbihjb2RlKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUYWJsZVN1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1UYWJsZXMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmdldFRhYmxlcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1UYWJsZXMpKSB7XG4gICAgICBmb3JtVGFibGVzLmZvckVhY2godGFibGUgPT4ge1xuICAgICAgICB0YWJsZS5pbmxpbmVBY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVBY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2xvYmFsQWN0aW9uVHJpZ2dlci5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5zdGFydFRhYmxlR2xvYmFsQWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLnJlY29yZFNlbGVjdGlvblRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZVJlY29yZFNlbGVjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5zZWxlY3Rpb25BY3Rpb25UcmlnZ2VyLnN1YnNjcmliZShldmVudCA9PiB0aGlzLnN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2V0RGF0YVRyaWdnZXIuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuc3RhcnRUYWJsZUdldERhdGEoZXZlbnQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZvcm1Jbml0KHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IHN0cmluZyA9IHRoaXMucHJlb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICAgIGlmICghdGhpcy5uYW1lKSB7IHJldHVybjsgfVxuICAgIGlmICghdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkKSB7XG4gICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgICAgY29uc3QgZm9ybURlZmluaXRpb24gPSBhd2FpdCB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5nZXRGb3JtRGVmaW5pdGlvbih0aGlzLm5hbWUpO1xuICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9mb3JtU3RydWN0dXJlID0gbmV3IEZvcm1TdHJ1Y3R1cmVBbmREYXRhKGZvcm1EZWZpbml0aW9uLCB0aGlzLmZvcm1Db25maWcpO1xuICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLl9mb3JtU3RydWN0dXJlLmZpZWxkcztcbiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuYWN0aW9ucztcbiAgICAgIHRoaXMuX2RlZmluaXRpb25PYnRhaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYW5EYXRhKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdXBwb3J0U3RhdGUoaW5pdGlhbFN0YXRlKSkge1xuICAgICAgaW5pdGlhbFN0YXRlID0gdGhpcy5fZm9ybVN0cnVjdHVyZS5kZWZhdWx0U3RhdGU7XG4gICAgfVxuICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuY2hhbmdlU3RhdGUoaW5pdGlhbFN0YXRlIHx8IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZGVmYXVsdFN0YXRlKTtcbiAgICBjb25zdCBpbnB1dEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YUZpZWxkcyk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0RmllbGROYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpZWxkQ29kZSA9IGlucHV0RmllbGROYW1lc1tpbmRleF07XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5pbnB1dERhdGFGaWVsZHNbZmllbGRDb2RlXTtcbiAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZENvZGUsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMuZ2V0RGF0YSk7XG4gICAgdGhpcy5jaGVja0Vycm9yUmVjb3JkUmVjZWl2ZWQocmVjb3JkUmVzcG9uc2UpO1xuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5zdWJzY3JpYmVTZWN0aW9uQWN0aXZhdGlvbigpO1xuICAgIHRoaXMuc3Vic2NyaWJlRmllbGRzU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZUFjdGlvblN1YmplY3RzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUYWJsZVN1YmplY3RzKCk7XG4gICAgdGhpcy5jdXN0b21Gb3JtU3RhcnQoKTtcbiAgfVxuXG4gIGNoZWNrRXJyb3JSZWNvcmRSZWNlaXZlZChyZWNvcmRSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gcmVjb3JkUmVzcG9uc2U7XG4gICAgaWYgKCFlcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aGlzLmVycm9yQ29kZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yTWVzc2FnZTtcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JEZXRhaWw7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBlcnJvck9jY3VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmVycm9yQ29kZSAhPT0gTk9fRVJST1IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcG9ydGUgbWFuZWpvIGRlIGV2ZW50b3MgZGUgZm9ybXVsYXJpb1xuICAgKi9cblxuICBhc3luYyByZXF1ZXN0Rm9ybUFjdGlvbihhY3Rpb25Db2RlOiBzdHJpbmcsIGFjdGlvblN1YmplY3Q6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhY3Rpb25EZXRhaWwgPSB7XG4gICAgICBmb3JtQ29kZTogdGhpcy5uYW1lLFxuICAgICAgZm9ybVN1YmplY3Q6IHRoaXMuZm9ybVN1YmplY3QsXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5fZm9ybVN0cnVjdHVyZS5zdGF0ZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICBhY3Rpb25TdWJqZWN0LFxuICAgICAgdmVyc2lvbjogUEFZTE9BRF9WRVJTSU9OLFxuICAgICAgZm9ybURhdGE6IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZ2V0UGF5bG9hZCgpLFxuICAgICAgaW1tdXRhYmxlRGF0YTogdGhpcy5fZm9ybVN0cnVjdHVyZS5pbW11dGFibGVEYXRhLFxuICAgIH07XG4gICAgdGhpcy5lcnJvckNvZGUgPSBOT19FUlJPUjtcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSAnJztcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgIGNvbnN0IGZvcm1BY3Rpb25SZXNwb25zZTogYW55ID0gYXdhaXQgdGhpcy5mb3JtTWFuYWdlclNlcnZpY2UuZXhlY1NlcnZlckFjdGlvbihhY3Rpb25EZXRhaWwpO1xuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIGlmIChmb3JtQWN0aW9uUmVzcG9uc2UgJiYgZm9ybUFjdGlvblJlc3BvbnNlLmVycm9yLmVycm9yVHlwZSkge1xuICAgICAgY29uc29sZS5sb2coJ0V4Y2VwY2nDs24gbm8gc29wb3J0YWRhJyk7XG4gICAgfVxuICAgIGlmIChmb3JtQWN0aW9uUmVzcG9uc2UuaGFzRXJyb3IoKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBmb3JtQWN0aW9uUmVzcG9uc2UuZXJyb3I7XG4gICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yLmVycm9yQ29kZTtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3JNZXNzYWdlO1xuICAgICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yLmVycm9yRGV0YWlsO1xuICAgIH1cbiAgICBjb25zdCBmb3JtUmVzcG9uc2VEYXRhID0gZm9ybUFjdGlvblJlc3BvbnNlLmdldERhdGEoKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoU2VydmVyRGF0YShmb3JtUmVzcG9uc2VEYXRhKTtcbiAgICByZXR1cm4gZm9ybVJlc3BvbnNlRGF0YTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm1XaXRoU2VydmVyRGF0YShmb3JtQ29udGVudDogYW55KSB7XG4gICAgY29uc3Qge1xuICAgICAgY3VycmVudE1vZGUsIGZvcm1TdWJqZWN0LCBhY3Rpb25zLCBmaWVsZHMsIHJlY29yZFRhYmxlcyxcbiAgICAgIHJldHVybmVkRmlsZSwgaW1tdXRhYmxlRGF0YSwgZXh0cmFJbmZvLFxuICAgIH0gPSBmb3JtQ29udGVudDtcbiAgICBjdXJyZW50TW9kZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGN1cnJlbnRNb2RlKTtcbiAgICBpZiAoZm9ybVN1YmplY3QpIHsgdGhpcy5mb3JtU3ViamVjdCA9IGZvcm1TdWJqZWN0OyB9XG4gICAgaWYgKGFjdGlvbnMgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRBY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBjb25zdCBhY3Rpb25PYmplY3QgPSB0aGlzLmdldEFjdGlvbihjaGFuZ2VkQWN0aW9uLmFjdGlvbkNvZGUpO1xuICAgICAgICBpZiAoYWN0aW9uT2JqZWN0KSB7IGFjdGlvbk9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRBY3Rpb24pOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlZEZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICBjb25zdCBmaWVsZE9iamVjdCA9IHRoaXMuZ2V0RmllbGQoY2hhbmdlZEZpZWxkLmZpZWxkQ29kZSk7XG4gICAgICAgIGlmIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgIGZpZWxkT2JqZWN0LnVwZGF0ZUZyb21TZXJ2ZXIoY2hhbmdlZEZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkVGFibGVzICYmIHJlY29yZFRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUYWJsZSBvZiByZWNvcmRUYWJsZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNoYW5nZWRUYWJsZS50YWJsZUNvZGUpO1xuICAgICAgICBpZiAodGFibGVPYmplY3QpIHtcbiAgICAgICAgICB0YWJsZU9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRUYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJldHVybmVkRmlsZSAmJiByZXR1cm5lZEZpbGUuZmlsZSkge1xuICAgICAgdGhpcy5maWxlTWdtdFNlcnZpY2VzLnNhdmVGaWxlKHJldHVybmVkRmlsZS5maWxlLCByZXR1cm5lZEZpbGUubmFtZSwgcmV0dXJuZWRGaWxlLnR5cGUpO1xuICAgIH1cbiAgICB0aGlzLl9mb3JtU3RydWN0dXJlLmltbXV0YWJsZURhdGEgPSBpbW11dGFibGVEYXRhO1xuICAgIHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZXh0cmFJbmZvID0gZXh0cmFJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGFjY2lvbmVzIHNvYnJlIGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgYWRkU2VjdGlvbkFjdGl2YXRpb24oc2VjdGlvbkNvZGVzOiBzdHJpbmdbXSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBzZWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoc2VjdGlvbkNvZGVzKSkgPyBzZWN0aW9uQ29kZXMgOiBbc2VjdGlvbkNvZGVzXTtcbiAgICBzZWN0aW9uU2V0LmZvckVhY2goKHNlY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtzZWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0FjdGl2YXRlW3NlY3Rpb25OYW1lXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFNlY3Rpb25JbmFjdGl2YXRpb24oc2VjdGlvbkNvZGVzOiBzdHJpbmdbXSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBzZWN0aW9uU2V0ID0gKEFycmF5LmlzQXJyYXkoc2VjdGlvbkNvZGVzKSkgPyBzZWN0aW9uQ29kZXMgOiBbc2VjdGlvbkNvZGVzXTtcbiAgICBzZWN0aW9uU2V0LmZvckVhY2goKHNlY3Rpb25OYW1lKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGVbc2VjdGlvbk5hbWVdKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGVbc2VjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW3NlY3Rpb25OYW1lXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFjdGlvbk1ldGhvZFN0YXJ0KGFjdGlvbnM6IHN0cmluZ1tdLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IGFjdGlvblNldCA9IChBcnJheS5pc0FycmF5KGFjdGlvbnMpKSA/IGFjdGlvbnMgOiBbYWN0aW9uc107XG4gICAgYWN0aW9uU2V0LmZvckVhY2goKGFjdGlvbk5hbWUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZm9ybUFjdGlvbnNTdGFydFthY3Rpb25OYW1lXSkge1xuICAgICAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0W2FjdGlvbk5hbWVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQWN0aW9uTWV0aG9kRmluaXNoKGFjdGlvbnM6IHN0cmluZ1tdLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IGFjdGlvblNldCA9IChBcnJheS5pc0FycmF5KGFjdGlvbnMpKSA/IGFjdGlvbnMgOiBbYWN0aW9uc107XG4gICAgYWN0aW9uU2V0LmZvckVhY2goKGFjdGlvbk5hbWUpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uTmFtZV0pIHtcbiAgICAgICAgdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uTmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbk5hbWVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGF1bmNoU2VjdGlvbkFjdGl2YXRpb24oY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtjb2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRTZWN0aW9uTWV0aG9kKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxhdW5jaFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuX2Zvcm1TdHJ1Y3R1cmUuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW2NvZGVdO1xuICAgIGlmIChjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgZm9yIChjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kIG9mIGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNsaWVudFNlY3Rpb25NZXRob2Qoc2VjdGlvbk9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRBY3Rpb24oY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgaWYgKCFhY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgYWN0aW9uT2JqZWN0LnN0YXJ0KCk7XG4gICAgY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1BY3Rpb25zU3RhcnRbY29kZV07XG4gICAgaWYgKGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZCBvZiBjbGllbnRBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uUHJvbWlzZSA9IGNsaWVudEFjdGlvbk1ldGhvZChhY3Rpb25PYmplY3QpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNvbnRpbnVlQWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbk9iamVjdC5zdG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb25PYmplY3QpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXJBY3Rpb24oYWN0aW9uSW5wdXQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAodHlwZW9mIGFjdGlvbklucHV0ID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRBY3Rpb24oYWN0aW9uSW5wdXQpIDogYWN0aW9uSW5wdXQ7XG4gICAgbGV0IGZpbmlzaCA9IHRydWU7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3RGb3JtQWN0aW9uKGFjdGlvbi5hY3Rpb25Db2RlKTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaEFjdGlvbihhY3Rpb24sIGFjdGlvblJlc3VsdCk7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlBY3Rpb25TZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICBhY3Rpb24uc3RvcCgpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoQWN0aW9uKGFjdGlvbiwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgZmluaXNoQWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1BY3Rpb25zRmluaXNoW2FjdGlvbi5hY3Rpb25Db2RlXTtcbiAgICBpZiAoZmluaXNoQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGZpbmlzaEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25NZXRob2QoYWN0aW9uLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBjb21wbGV0ZUdsb2JhbEFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIHZhbGlkYWNpb25lcyBzb2JyZSBjYW1wb3NcbiAgICovXG5cbiAgYWRkRmllbGRJbnB1dFZhbGlkYXRpb24oZmllbGRzOiBzdHJpbmdbXSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBmaWVsZFNldCA9IChBcnJheS5pc0FycmF5KGZpZWxkcykpID8gZmllbGRzIDogW2ZpZWxkc107XG4gICAgZmllbGRTZXQuZm9yRWFjaCgoZmllbGRDb2RlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2ZpZWxkQ29kZV0pIHtcbiAgICAgICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb25bZmllbGRDb2RlXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEZpZWxkVmFsaWRhdGlvblN0YXJ0KGZpZWxkczogc3RyaW5nW10sIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgZmllbGRTZXQgPSAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSA/IGZpZWxkcyA6IFtmaWVsZHNdO1xuICAgIGZpZWxkU2V0LmZvckVhY2goKGZpZWxkQ29kZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnRbZmllbGRDb2RlXSkge1xuICAgICAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnRbZmllbGRDb2RlXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmllbGRWYWxpZGF0aW9uc1N0YXJ0W2ZpZWxkQ29kZV0ucHVzaChjYWxsYmFja01ldGhvZCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRGaWVsZFZhbGlkYXRpb25GaW5pc2goZmllbGRzOiBzdHJpbmdbXSwgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCBmaWVsZFNldCA9IChBcnJheS5pc0FycmF5KGZpZWxkcykpID8gZmllbGRzIDogW2ZpZWxkc107XG4gICAgZmllbGRTZXQuZm9yRWFjaCgoZmllbGRDb2RlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXSkge1xuICAgICAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoW2ZpZWxkQ29kZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2hbZmllbGRDb2RlXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRJbnB1dFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcsIGludHJpbnNpY1ZhbGlkYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmllbGRUb1ZhbGlkYXRlID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGRUb1ZhbGlkYXRlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZpZWxkVG9WYWxpZGF0ZS5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2ZpZWxkQ29kZV07XG4gICAgaWYgKHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgIGNvbnN0IGNsaWVudFZhbGlkYXRpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgY29udGludWVWYWxpZGF0aW9uUHJvbWlzZSA9IHZhbGlkYXRpb25NZXRob2QoZmllbGRUb1ZhbGlkYXRlKTtcbiAgICAgICAgY2xpZW50VmFsaWRhdGlvblByb21pc2VzLnB1c2goY29udGludWVWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRWYWxpZGF0aW9uKGZpZWxkQ29kZTogc3RyaW5nLCBpbnRyaW5zaWNWYWxpZGF0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICBpZiAoIWZpZWxkVG9WYWxpZGF0ZSB8fCAhaW50cmluc2ljVmFsaWRhdGlvbikgeyByZXR1cm47IH1cbiAgICBmaWVsZFRvVmFsaWRhdGUucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25DYWxsYmFja3MgPSB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnRbZmllbGRDb2RlXTtcbiAgICBpZiAodmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZSA9IHZhbGlkYXRpb25NZXRob2QoZmllbGRUb1ZhbGlkYXRlKTtcbiAgICAgICAgY2xpZW50VmFsaWRhdGlvblByb21pc2VzLnB1c2goY2xpZW50VmFsaWRhdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVWYWxpZGF0aW9uID0gY2xpZW50VmFsaWRhdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVWYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZFRvVmFsaWRhdGUpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXJ2ZXJGaWVsZFZhbGlkYXRpb24oaW5wdXRGaWVsZDogc3RyaW5nIHwgRmllbGREZXNjcmlwdG9yKSB7XG4gICAgY29uc3QgZmllbGRPYmogPSAodHlwZW9mIGlucHV0RmllbGQgPT09ICdzdHJpbmcnKVxuICAgICAgPyB0aGlzLmdldEZpZWxkKGlucHV0RmllbGQpIDogaW5wdXRGaWVsZDtcbiAgICBsZXQgZmluaXNoID0gdHJ1ZTtcbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGZpZWxkT2JqLmJhY2tlbmQpIHtcbiAgICAgIGZpZWxkT2JqLnZhbGlkYXRpbmcgPSB0cnVlO1xuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnZhbGlkYXRlLCBmaWVsZE9iai5maWVsZENvZGUpO1xuICAgICAgZmluaXNoID0gIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoRmllbGRWYWxpZGF0aW9uKGZpZWxkT2JqLCB2YWxpZGF0aW9uUmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRPYmouc2V0RXJyb3JDb2RlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICAgIGZpZWxkT2JqLnNldEVycm9yTWVzc2FnZSh0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICB0aGlzLmRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgZmllbGRPYmoudmFsaWRhdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoRmllbGRWYWxpZGF0aW9uKGZpZWxkT2JqZWN0OiBhbnksIHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ2FsbGJhY2tzID0gdGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaFtmaWVsZE9iamVjdC5maWVsZENvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh2YWxpZGF0aW9uTWV0aG9kKGZpZWxkT2JqZWN0LCB2YWxpZGF0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29udGludWVGaWVsZFZhbGlkYXRpb24oZmllbGRDb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSBhY2Npb25lcyBzb2JyZSBUYWJsYXNcbiAgICovXG5cbiAgYWRkVGFibGVBY3Rpb25TdGFydCh0YWJsZU5hbWU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5saW5lQWN0aW9uT2JqZWN0ID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghaW5saW5lQWN0aW9uT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnMgPSBudWxsO1xuICAgIGlmICh0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZU5hbWVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlTmFtZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIGlmICghdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gPSBbXTtcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICB9XG5cbiAgYWRkVGFibGVBY3Rpb25GaW5pc2godGFibGVOYW1lOiBzdHJpbmcsIGFjdGlvbkNvZGU6IHN0cmluZywgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlubGluZUFjdGlvbk9iamVjdCA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWlubGluZUFjdGlvbk9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlTmFtZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZU5hbWVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICBpZiAoIXRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdID0gW107XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXS5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgfVxuXG4gIGFkZFRhYmxlU2VsZWN0aW9uU3RhcnQodGFibGVOYW1lOiBzdHJpbmcsIGNhbGxiYWNrTWV0aG9kKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbdGFibGVOYW1lXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbdGFibGVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNTdGFydFt0YWJsZU5hbWVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaChjYWxsYmFja01ldGhvZCk7XG4gIH1cblxuICBhZGRUYWJsZVNlbGVjdGlvbkZpbmlzaCh0YWJsZU5hbWU6IHN0cmluZywgY2FsbGJhY2tNZXRob2QpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnMgPSBudWxsO1xuICAgIGlmICh0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbdGFibGVOYW1lXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IFtdO1xuICAgICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlTmFtZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKGNhbGxiYWNrTWV0aG9kKTtcbiAgfVxuXG4gIGFkZFRhYmxlR2V0RGF0YVN0YXJ0KHRhYmxlTmFtZTogc3RyaW5nLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVycyA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W3RhYmxlTmFtZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W3RhYmxlTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IFtdO1xuICAgICAgdGhpcy5fdGFibGVHZXREYXRhU3RhcnRbdGFibGVOYW1lXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzLnB1c2goY2FsbGJhY2tNZXRob2QpO1xuICB9XG5cbiAgYWRkVGFibGVHZXREYXRhRmluaXNoKHRhYmxlTmFtZTogc3RyaW5nLCBjYWxsYmFja01ldGhvZCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVycyA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3RhYmxlR2V0RGF0YUZpbmlzaFt0YWJsZU5hbWVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbdGFibGVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbdGFibGVOYW1lXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzW0dFVF9EQVRBX0FDVElPTl0gPSBjYWxsYmFja01ldGhvZDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRXZlbnQ7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlQ29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uQ29kZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdGFibGVBY3Rpb25EZXRhaWwgPSB7XG4gICAgICB0YWJsZU9iamVjdCxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlckdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgZmluaXNoID0gdHJ1ZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoYWN0aW9uLmJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3QgPSB7XG4gICAgICAgIHRhYmxlQ29kZSxcbiAgICAgICAgYWN0aW9uVHlwZTogR0xPQkFMX0FDVElPTixcbiAgICAgICAgYWN0aW9uQ29kZVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbkNvZGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIHJlY29yZElkLFxuICAgICAgcmVjb3JkRGF0YVxuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSB0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlLCByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBmaW5pc2ggPSB0cnVlO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBudWxsO1xuICAgIGlmIChhY3Rpb24uYmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLmlubGluZSxcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICB0aGlzLmZpbmlzaFRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpO1xuICAgIH1cbiAgICB0YWJsZU9iamVjdC5mcmVlV2FpdGluZygpO1xuICB9XG5cbiAgY29tcGxldGVJbmxpbmVBY3Rpb24odGFibGVBY3Rpb246IGFueSkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb24pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoVGFibGVBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaCh0YWJsZUFjdGlvbk1ldGhvZCh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVJlY29yZFNlbGVjdGlvbih0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlU2VsZWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVTZWxlY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSB0YWJsZVNlbGVjdGlvbk1ldGhvZCh0YWJsZVNlbGVjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLnJlZHVjZSgodG90YWwsIGN1cnIpID0+ICh0b3RhbCAmJiBjdXJyKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJSZWNvcmRTZWxlY3Rpb24odGFibGVTZWxlY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIHRhYmxlQ29kZSwgcmVjb3JkSWQsIHJlY29yZERhdGEgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IGZpbmlzaCA9IHRydWU7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHRhYmxlT2JqZWN0LnNlbGVjdGlvbkJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjdGlvblN1YmplY3Q6IGFueSA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLnJvd1NlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLnRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIGZpbmlzaCA9ICF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICB0aGlzLmZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZVJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSB9ID0gdGFibGVTZWxlY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVTZWxlY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVTZWxlY3Rpb25NZXRob2Qgb2YgdGFibGVFdmVudEhhbmRsZXJzKSB7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2godGFibGVTZWxlY3Rpb25NZXRob2QodGFibGVTZWxlY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRSZWNvcmRzIH0gPSBhY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgYWN0aW9uID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICBhY3Rpb24sXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMucmVkdWNlKCh0b3RhbCwgY3VycikgPT4gKHRvdGFsICYmIGN1cnIpLCB0cnVlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIHNlbGVjdGVkUmVjb3JkcyB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCB8fCAhYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIHRhYmxlT2JqZWN0LnB1dE9uV2FpdCgpO1xuICAgIGxldCBmaW5pc2ggPSB0cnVlO1xuICAgIGxldCBhY3Rpb25SZXN1bHQgPSBudWxsO1xuICAgIGlmIChhY3Rpb24uYmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHtcbiAgICAgICAgdGFibGVDb2RlLFxuICAgICAgICBhY3Rpb25UeXBlOiB0aGlzLmZvcm1Db25maWcudGFibGVBY3Rpb25zLnNlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgICB9O1xuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oZm9ybUFjdGlvbnMudGFibGVBY3Rpb24sIGFjdGlvblN1YmplY3QpO1xuICAgICAgZmluaXNoID0gIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIHRoaXMuZmluaXNoVGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCk7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZVNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKHRhYmxlQWN0aW9uTWV0aG9kKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgdGFibGVDb2RlXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gdGFibGVBY3Rpb25NZXRob2QodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5yZWR1Y2UoKHRvdGFsLCBjdXJyKSA9PiAodG90YWwgJiYgY3VyciksIHRydWUpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlckdldERhdGEodGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlckdldERhdGEodGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIHRhYmxlQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgY29uc3QgYWN0aW9uU3ViamVjdCA9IHsgdGFibGVDb2RlIH07XG4gICAgY29uc3QgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKGZvcm1BY3Rpb25zLmdldFRhYmxlRGF0YSwgYWN0aW9uU3ViamVjdCk7XG4gICAgaWYgKHRoaXMuZXJyb3JPY2N1cmVkKCkpIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hUYWJsZUdldERhdGEodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdldERhdGEodGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0KSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIHRhYmxlQWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbdGFibGVBY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2godGFibGVBY3Rpb25NZXRob2QodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrU2VjdGlvblJlcXVpcmVkRmllbGRzKHNlY3Rpb25Db2RlOiBzdHJpbmcsIHJlcUZpZWxkTWVzc2FnZT8pIHtcbiAgICB0aGlzLmNsZWFuRXJyb3JGaWVsZHMobnVsbCwgc2VjdGlvbkNvZGUpO1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRNZXNzYWdlID0gcmVxRmllbGRNZXNzYWdlID8/IHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZFxuICAgIGNvbnN0IG51bUVycm9ycyA9IHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHRoaXMuZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpLCBudWxsLCByZXF1aXJlZEZpZWxkTWVzc2FnZSk7XG4gICAgcmV0dXJuIChudW1FcnJvcnMgPT09IDApO1xuICB9XG5cbiAgdmFsaWRhdGVTZWN0aW9uQ29uc2lzdGVuY3koc2VjdGlvbkNvZGU6IHN0cmluZywgcmVxRmllbGRNZXNzYWdlPykge1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGNvbXBsZXRlRmllbGRzID0gdGhpcy5jaGVja1NlY3Rpb25SZXF1aXJlZEZpZWxkcyhzZWN0aW9uQ29kZSwgcmVxRmllbGRNZXNzYWdlKTtcbiAgICBpZiAoIWNvbXBsZXRlRmllbGRzKSB7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHMgPSB0aGlzLmdldFJlcXVpcmVkRW1wdHlGaWVsZHMobnVsbCwgc2VjdGlvbkNvZGUpO1xuICAgIGlmIChyZXF1aXJlZEVtcHR5RmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbGlkYXRpb25FcnJvciA9IHRydWU7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHJlcXVpcmVkRW1wdHlGaWVsZHMsIG51bGwsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZCk7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkQ29kZSBvZiByZXF1aXJlZEVtcHR5RmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGRDb2RlKTtcbiAgICAgICAgaWYgKHJlcXVpcmVkRW1wdHlGaWVsZCAmJiByZXF1aXJlZEVtcHR5RmllbGQud2lkZ2V0XG4gICAgICAgICAgJiYgcmVxdWlyZWRFbXB0eUZpZWxkLndpZGdldC5mb2N1cykge1xuICAgICAgICAgIHJlcXVpcmVkRW1wdHlGaWVsZC53aWRnZXQuZm9jdXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZHMgPSB0aGlzLmdldEZpZWxkc1dpdGhWYWxpZGF0aW9uSXNzdWVzKG51bGwsXG4gICAgICBzZWN0aW9uQ29kZSk7XG4gICAgaWYgKCF2YWxpZGF0aW9uRXJyb3IgJiYgdmFsaWRhdGlvbklzc3VlRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbGlkYXRpb25FcnJvciA9IHRydWU7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25GaWVsZHMpO1xuICAgICAgZm9yIChjb25zdCBmaWVsZENvZGUgb2YgdmFsaWRhdGlvbklzc3VlRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Jc3N1ZUZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZENvZGUpO1xuICAgICAgICBpZiAodmFsaWRhdGlvbklzc3VlRmllbGQgJiYgdmFsaWRhdGlvbklzc3VlRmllbGQud2lkZ2V0XG4gICAgICAgICAgJiYgdmFsaWRhdGlvbklzc3VlRmllbGQud2lkZ2V0LmZvY3VzKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbklzc3VlRmllbGQud2lkZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcjtcbiAgfVxuXG4gIGNvcHlUYWJsZVJlY29yZFRvRmllbGRzKHRhYmxlT2JqOiBhbnksIG1hcHBpbmdUYWJsZTogYW55ID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZU9iai50YWJsZUNvZGUpO1xuICAgIGNvbnN0IHRhYmxlUmVjb3JkID0gdGFibGVPYmplY3QuZ2V0VGFibGVSZWNvcmQodGFibGVPYmoucmVjb3JkSWQpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gdGFibGVPYmplY3QuY29sdW1uTmFtZXM7XG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IHRhYmxlUmVjb3JkLmdldEZpZWxkVmFsdWUoY29sdW1uTmFtZSkgPz8gJyc7XG4gICAgICBjb25zdCBmaWVsZENvZGUgPSBtYXBwaW5nVGFibGU/Lltjb2x1bW5OYW1lXSA/PyBjb2x1bW5OYW1lO1xuICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGZpZWxkQ29kZSwgY29sdW1uVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3BvcnRlIHJlZ2lzdHJvcyBlbiB0YWJsYXMgcXVlIHNlIGVkaXRhbiBlbiBjYW1wb3MgZGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgZGVmaW5lRWRpdGlvblRhYmxlKHRhYmxlRWRpdGlvbkRlZjogYW55KSB7XG4gICAgY29uc3QgeyBjb2x1bW5GaWVsZE1hcHBpbmcsIHJlY29yZENhcHR1cmVGaWVsZHMsIHN0YXJ0Q29sbGFwc2VkIH0gPSB0YWJsZUVkaXRpb25EZWY7XG4gICAgdGFibGVFZGl0aW9uRGVmLnN0YXJ0Q29sbGFwc2VkID0gKHR5cGVvZiBzdGFydENvbGxhcHNlZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICA/IHN0YXJ0Q29sbGFwc2VkIDogdHJ1ZTtcblxuICAgIGNvbnN0IGZpZWxkc01hcHBpbmdUYWJsZSA9IHt9O1xuICAgIGNvbnN0IGZpZWxkc1RvQ2xlYXIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbk1hcCBvZiBjb2x1bW5GaWVsZE1hcHBpbmcpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW5OYW1lLCBmb3JtRmllbGRdID0gY29sdW1uTWFwO1xuICAgICAgZmllbGRzTWFwcGluZ1RhYmxlW2NvbHVtbk5hbWVdID0gZm9ybUZpZWxkO1xuICAgICAgZmllbGRzVG9DbGVhci5wdXNoKGZvcm1GaWVsZCk7XG4gICAgfVxuICAgIHRhYmxlRWRpdGlvbkRlZi5maWVsZHNNYXBwaW5nVGFibGUgPSBmaWVsZHNNYXBwaW5nVGFibGU7XG4gICAgdGFibGVFZGl0aW9uRGVmLmZpZWxkc1RvQ2xlYXIgPSBmaWVsZHNUb0NsZWFyO1xuXG4gICAgY29uc3QgeyB0YWJsZU5hbWUsIG5ld1JlY29yZEFjdGlvbk5hbWUsIHNhdmVSZWNvcmRBY3Rpb25OYW1lLFxuICAgICAgY2FuY2VsU2F2ZVJlY29yZEFjdGlvbk5hbWUsIHRhYmxlRWRpdFJlY29yZEFjdGlvbk5hbWUsIGVuYWJsZVJlY29yZEVkaXRpb25cbiAgICB9ID0gdGFibGVFZGl0aW9uRGVmO1xuXG4gICAgdGhpcy5hZGRBY3Rpb25NZXRob2RTdGFydChuZXdSZWNvcmRBY3Rpb25OYW1lLCAoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFuRmllbGRzKGZpZWxkc1RvQ2xlYXIsIG51bGwpO1xuICAgICAgdGhpcy5zaG93RmllbGRzKHJlY29yZENhcHR1cmVGaWVsZHMpO1xuICAgICAgaWYgKCFlbmFibGVSZWNvcmRFZGl0aW9uKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpO1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlQWN0aW9uKG5ld1JlY29yZEFjdGlvbk5hbWUpO1xuICAgICAgdGhpcy5zaG93QWN0aW9uKGNhbmNlbFNhdmVSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICAgIHRoaXMuc2hvd0FjdGlvbihzYXZlUmVjb3JkQWN0aW9uTmFtZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBjb25zdCB7IHJlY29yZEVkaXRpb25WYWxpZGF0ZSwgZGlzYWJsZVJlY29yZEVkaXRpb24gfSA9IHRhYmxlRWRpdGlvbkRlZjtcbiAgICB0aGlzLmFkZEFjdGlvbk1ldGhvZFN0YXJ0KHNhdmVSZWNvcmRBY3Rpb25OYW1lLCAoKSA9PiB7XG4gICAgICByZXR1cm4gKCFyZWNvcmRFZGl0aW9uVmFsaWRhdGUpID8gdGhpcy5yZWNvcmRFZGl0aW9uVmFsaWRhdGUodGFibGVFZGl0aW9uRGVmKVxuICAgICAgICA6IHJlY29yZEVkaXRpb25WYWxpZGF0ZSh0YWJsZUVkaXRpb25EZWYpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkQWN0aW9uTWV0aG9kRmluaXNoKHNhdmVSZWNvcmRBY3Rpb25OYW1lLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZXJyb3JPY2N1cmVkKCkpIHtcbiAgICAgICAgcmV0dXJuICghZGlzYWJsZVJlY29yZEVkaXRpb24pID8gdGhpcy5kaXNhYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpXG4gICAgICAgICAgOiBkaXNhYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRkQWN0aW9uTWV0aG9kU3RhcnQoY2FuY2VsU2F2ZVJlY29yZEFjdGlvbk5hbWUsICgpID0+IHtcbiAgICAgIHJldHVybiAoIWRpc2FibGVSZWNvcmRFZGl0aW9uKSA/IHRoaXMuZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKVxuICAgICAgICA6IGRpc2FibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRUYWJsZUFjdGlvblN0YXJ0KHRhYmxlTmFtZSwgdGFibGVFZGl0UmVjb3JkQWN0aW9uTmFtZSxcbiAgICAgICh0YmxBY3RPYmopID0+IHtcbiAgICAgICAgcmV0dXJuICghZW5hYmxlUmVjb3JkRWRpdGlvbilcbiAgICAgICAgICA/IHRoaXMuZW5hYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYsIHRibEFjdE9iailcbiAgICAgICAgICA6IGVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmLCB0YmxBY3RPYmopO1xuICAgICAgfSk7XG4gICAgaWYgKHRhYmxlRWRpdGlvbkRlZi5zdGFydENvbGxhcHNlZCkge1xuICAgICAgcmV0dXJuICghdGFibGVFZGl0aW9uRGVmLmRpc2FibGVSZWNvcmRFZGl0aW9uKVxuICAgICAgICA/IHRoaXMuZGlzYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKVxuICAgICAgICA6IHRhYmxlRWRpdGlvbkRlZi5kaXNhYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKCF0YWJsZUVkaXRpb25EZWYuZW5hYmxlUmVjb3JkRWRpdGlvbilcbiAgICAgICAgPyB0aGlzLmVuYWJsZVJlY29yZEVkaXRpb24odGFibGVFZGl0aW9uRGVmKVxuICAgICAgICA6IHRhYmxlRWRpdGlvbkRlZi5lbmFibGVSZWNvcmRFZGl0aW9uKHRhYmxlRWRpdGlvbkRlZiwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZW5hYmxlUmVjb3JkRWRpdGlvbih0YWJsZUVkaXRpb25EZWYsIHRhYmxlQWN0aW9uT2JqZWN0ID0gbnVsbCkge1xuICAgIGlmICh0YWJsZUFjdGlvbk9iamVjdCkge1xuICAgICAgdGhpcy5jb3B5VGFibGVSZWNvcmRUb0ZpZWxkcyh0YWJsZUFjdGlvbk9iamVjdCwgdGFibGVFZGl0aW9uRGVmLmZpZWxkc01hcHBpbmdUYWJsZSk7XG4gICAgfVxuICAgIHRoaXMuc2hvd0ZpZWxkcyh0YWJsZUVkaXRpb25EZWYucmVjb3JkQ2FwdHVyZUZpZWxkcyk7XG4gICAgdGhpcy5oaWRlQWN0aW9uKHRhYmxlRWRpdGlvbkRlZi5uZXdSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICB0aGlzLnNob3dBY3Rpb24odGFibGVFZGl0aW9uRGVmLmNhbmNlbFNhdmVSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICB0aGlzLnNob3dBY3Rpb24odGFibGVFZGl0aW9uRGVmLnNhdmVSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICBpZiAodGFibGVFZGl0aW9uRGVmLmZpZWxkc1RvVHJpZ2dlclZhbGlkYXRpb25cbiAgICAgICYmIHRhYmxlRWRpdGlvbkRlZi5maWVsZHNUb1RyaWdnZXJWYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIG9mIHRhYmxlRWRpdGlvbkRlZi5maWVsZHNUb1RyaWdnZXJWYWxpZGF0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RhcnRGaWVsZFZhbGlkYXRpb24oZmllbGROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBkaXNhYmxlUmVjb3JkRWRpdGlvbih0YWJsZURlZmluaXRpb246IGFueSkge1xuICAgIHRoaXMuY2xlYW5GaWVsZHModGFibGVEZWZpbml0aW9uLmZpZWxkc1RvQ2xlYXIsIG51bGwpO1xuICAgIHRoaXMuaGlkZUZpZWxkcyh0YWJsZURlZmluaXRpb24ucmVjb3JkQ2FwdHVyZUZpZWxkcyk7XG4gICAgdGhpcy5zaG93QWN0aW9uKHRhYmxlRGVmaW5pdGlvbi5uZXdSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICB0aGlzLmhpZGVBY3Rpb24odGFibGVEZWZpbml0aW9uLmNhbmNlbFNhdmVSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICB0aGlzLmhpZGVBY3Rpb24odGFibGVEZWZpbml0aW9uLnNhdmVSZWNvcmRBY3Rpb25OYW1lKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlY29yZEVkaXRpb25WYWxpZGF0ZSh0YWJsZUVkaXRpb25EZWY6IGFueSkge1xuICAgIGNvbnN0IHsgcmVjb3JkQ2FwdHVyZUZpZWxkcyB9ID0gdGFibGVFZGl0aW9uRGVmO1xuICAgIGxldCB2YWxpZGF0aW9uT2sgPSB0cnVlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHMgPSB0aGlzLmdldFJlcXVpcmVkRW1wdHlGaWVsZHMocmVjb3JkQ2FwdHVyZUZpZWxkcywgbnVsbCk7XG4gICAgaWYgKHJlcXVpcmVkRW1wdHlGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbk9rID0gZmFsc2U7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcuZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHRoaXMudGFnRmllbGRzV2l0aEVycm9yKHJlcXVpcmVkRW1wdHlGaWVsZHMsIG51bGwsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkYXRpb25Jc3N1ZUZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzV2l0aFZhbGlkYXRpb25Jc3N1ZXMocmVjb3JkQ2FwdHVyZUZpZWxkcywgbnVsbCk7XG4gICAgaWYgKHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uT2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsIHRoaXMuZm9ybUNvbmZpZy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvbkZpZWxkcyk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0aW9uT2s7XG4gIH1cbn1cbiJdfQ==