@cqa-lib/cqa-ui 1.1.247 → 1.1.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +31 -17
- package/esm2020/lib/execution-screen/recording-banner/recording-banner.component.mjs +30 -0
- package/esm2020/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.mjs +112 -0
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +19 -6
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +6 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +6 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +493 -56
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/delete-steps/delete-steps.component.mjs +2 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
- package/esm2020/lib/ui-kit.module.mjs +11 -1
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +709 -92
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +695 -87
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/dynamic-select/dynamic-select-field.component.d.ts +8 -0
- package/lib/execution-screen/recording-banner/recording-banner.component.d.ts +13 -0
- package/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.d.ts +37 -0
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +7 -3
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +5 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +5 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +29 -1
- package/lib/ui-kit.module.d.ts +97 -95
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/styles.css +1 -1
package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs
CHANGED
|
@@ -41,6 +41,7 @@ export class TemplateVariablesFormComponent {
|
|
|
41
41
|
this.descriptionChange = new EventEmitter();
|
|
42
42
|
this.loadMoreElements = new EventEmitter(); // Emit when load more is requested
|
|
43
43
|
this.searchElements = new EventEmitter(); // Emit when user searches for elements
|
|
44
|
+
this.searchElementsByScreenName = new EventEmitter(); // Emit when screen name is selected to fetch elements filtered by screen name
|
|
44
45
|
this.createElement = new EventEmitter(); // Emit when element is created with payload
|
|
45
46
|
this.searchScreenName = new EventEmitter(); // Emit when user searches screen names
|
|
46
47
|
this.loadMoreScreenNames = new EventEmitter(); // Emit when user scrolls to load more screen names
|
|
@@ -61,6 +62,10 @@ export class TemplateVariablesFormComponent {
|
|
|
61
62
|
this.environmentSelectConfigCache = new Map();
|
|
62
63
|
// Cache for environment parameter select configs
|
|
63
64
|
this.environmentParameterSelectConfigCache = new Map();
|
|
65
|
+
// Cache for screen name select configs (for element variables)
|
|
66
|
+
this.screenNameSelectConfigCache = new Map();
|
|
67
|
+
// Cache for element select configs (filtered by screen name)
|
|
68
|
+
this.elementSelectConfigCache = new Map();
|
|
64
69
|
// Cache for test data profile select configs (first dropdown for parameters)
|
|
65
70
|
this.testDataProfileSelectConfigCache = new Map();
|
|
66
71
|
// Cache for data set select configs (second dropdown for parameters - shows data sets from selected profile)
|
|
@@ -80,7 +85,6 @@ export class TemplateVariablesFormComponent {
|
|
|
80
85
|
this.createElementVisible = false;
|
|
81
86
|
}
|
|
82
87
|
onCreateElement(payload) {
|
|
83
|
-
console.log('onCreateElement', payload);
|
|
84
88
|
this.createElement.emit(payload);
|
|
85
89
|
this.elementFormVisibilityChange.emit(false);
|
|
86
90
|
this.cdr.markForCheck();
|
|
@@ -96,24 +100,165 @@ export class TemplateVariablesFormComponent {
|
|
|
96
100
|
changes['parameterOptions'] || changes['hasMoreParameters'] || changes['isLoadingParameters'] ||
|
|
97
101
|
changes['environmentOptions'] || changes['hasMoreEnvironments'] || changes['isLoadingEnvironments'] ||
|
|
98
102
|
changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex']) {
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
103
|
+
// Only clear caches for changed inputs, not all caches
|
|
104
|
+
if (changes['templateVariables'] || changes['variablesForm']) {
|
|
105
|
+
// Clear all caches when template variables or form changes
|
|
106
|
+
this.selectConfigCache.clear();
|
|
107
|
+
this.dataTypeSelectConfigCache.clear();
|
|
108
|
+
this.parameterSelectConfigCache.clear();
|
|
109
|
+
this.environmentSelectConfigCache.clear();
|
|
110
|
+
this.environmentParameterSelectConfigCache.clear();
|
|
111
|
+
this.screenNameSelectConfigCache.clear();
|
|
112
|
+
this.elementSelectConfigCache.clear();
|
|
113
|
+
this.testDataProfileSelectConfigCache.clear();
|
|
114
|
+
this.dataSetSelectConfigCache.clear();
|
|
115
|
+
this.parameterForDataSetSelectConfigCache.clear();
|
|
116
|
+
this.needsDataTypeDropdownCache.clear();
|
|
117
|
+
this.shouldShowDropdownCache.clear();
|
|
118
|
+
}
|
|
119
|
+
// Clear element and screen name caches only when their options change
|
|
120
|
+
if (changes['elementOptions'] || changes['hasMoreElements'] || changes['isLoadingElements']) {
|
|
121
|
+
this.elementSelectConfigCache.clear();
|
|
122
|
+
}
|
|
123
|
+
if (changes['screenNameOptions'] || changes['hasMoreScreenNames'] || changes['isLoadingScreenNames']) {
|
|
124
|
+
this.screenNameSelectConfigCache.clear();
|
|
125
|
+
}
|
|
126
|
+
if (changes['parameterOptions'] || changes['hasMoreParameters'] || changes['isLoadingParameters']) {
|
|
127
|
+
this.parameterSelectConfigCache.clear();
|
|
128
|
+
this.testDataProfileSelectConfigCache.clear();
|
|
129
|
+
this.dataSetSelectConfigCache.clear();
|
|
130
|
+
this.parameterForDataSetSelectConfigCache.clear();
|
|
131
|
+
}
|
|
132
|
+
if (changes['environmentOptions'] || changes['hasMoreEnvironments'] || changes['isLoadingEnvironments']) {
|
|
133
|
+
this.environmentSelectConfigCache.clear();
|
|
134
|
+
this.environmentParameterSelectConfigCache.clear();
|
|
135
|
+
}
|
|
110
136
|
// Initialize data types and raw values for test-data variables
|
|
111
137
|
// Also re-initialize if default values or parameterOptions change (to set default selections)
|
|
112
138
|
if ((changes['templateVariables'] || changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex'] || changes['parameterOptions']) && this.templateVariables) {
|
|
113
139
|
this.initializeTestDataVariables();
|
|
114
140
|
}
|
|
141
|
+
// If templateVariables changed, initialize screen name form controls for element variables that have screenNameId
|
|
142
|
+
if (changes['templateVariables'] && this.templateVariables) {
|
|
143
|
+
this.templateVariables.forEach((variable) => {
|
|
144
|
+
if (this.isElementType(variable) && variable.screenNameId) {
|
|
145
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
146
|
+
if (variableGroup) {
|
|
147
|
+
// Initialize screen name form control with screenNameId (since valueBy is 'screenNameId')
|
|
148
|
+
if (!variableGroup.get('selectedScreenName')) {
|
|
149
|
+
variableGroup.addControl('selectedScreenName', new FormControl(variable.screenNameId));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Update form control value if it doesn't match
|
|
153
|
+
const currentValue = variableGroup.get('selectedScreenName')?.value;
|
|
154
|
+
if (currentValue !== variable.screenNameId) {
|
|
155
|
+
variableGroup.get('selectedScreenName')?.setValue(variable.screenNameId, { emitEvent: false });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// If we have screenNameId but not selectedScreenName, find it from screenNameOptions
|
|
159
|
+
if (!variable.selectedScreenName && this.screenNameOptions.length > 0) {
|
|
160
|
+
const matchingScreenName = this.screenNameOptions.find(sn => sn.id === variable.screenNameId);
|
|
161
|
+
if (matchingScreenName) {
|
|
162
|
+
variable.selectedScreenName = matchingScreenName.name;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// If screenNameOptions changed, update selectedScreenName for variables that have screenNameId
|
|
170
|
+
if (changes['screenNameOptions'] && this.templateVariables) {
|
|
171
|
+
this.templateVariables.forEach((variable) => {
|
|
172
|
+
if (this.isElementType(variable) && variable.screenNameId && !variable.selectedScreenName) {
|
|
173
|
+
const matchingScreenName = this.screenNameOptions.find(sn => sn.id === variable.screenNameId);
|
|
174
|
+
if (matchingScreenName) {
|
|
175
|
+
variable.selectedScreenName = matchingScreenName.name;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// If elementOptions or screenNameOptions changed, re-initialize element variables
|
|
181
|
+
if ((changes['elementOptions'] || changes['screenNameOptions']) && this.templateVariables) {
|
|
182
|
+
// Clear element config cache when elementOptions changes to force recomputation
|
|
183
|
+
// This ensures that when elements are loaded after screen name selection, the config is recomputed
|
|
184
|
+
this.elementSelectConfigCache.clear();
|
|
185
|
+
this.templateVariables.forEach((variable) => {
|
|
186
|
+
if (this.isElementType(variable)) {
|
|
187
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
188
|
+
if (variableGroup) {
|
|
189
|
+
let element = null;
|
|
190
|
+
// Priority 1: Find by elementId if available (from setTemplateVariables)
|
|
191
|
+
if (variable.elementId) {
|
|
192
|
+
element = this.elementOptions.find(el => el.id === variable.elementId);
|
|
193
|
+
}
|
|
194
|
+
// Priority 2: Find by elementName if available (from setTemplateVariables)
|
|
195
|
+
if (!element && variable.elementName) {
|
|
196
|
+
element = this.elementOptions.find(el => el.name === variable.elementName);
|
|
197
|
+
}
|
|
198
|
+
// Priority 3: Find by locatorValue (for backward compatibility)
|
|
199
|
+
if (!element && variable.value) {
|
|
200
|
+
const elementValue = variable.value;
|
|
201
|
+
element = this.elementOptions.find(el => el.locatorValue === elementValue);
|
|
202
|
+
}
|
|
203
|
+
if (element) {
|
|
204
|
+
// Set screen name info from the found element
|
|
205
|
+
if (element.screenNameId && element.screenNameObj) {
|
|
206
|
+
variable.selectedScreenName = element.screenNameObj.name;
|
|
207
|
+
variable.screenNameId = element.screenNameId;
|
|
208
|
+
// Set form controls
|
|
209
|
+
// Since valueBy is 'screenNameId', we need to store the screenNameId (number) in the form control
|
|
210
|
+
if (!variableGroup.get('selectedScreenName')) {
|
|
211
|
+
variableGroup.addControl('selectedScreenName', new FormControl(element.screenNameId));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
variableGroup.get('selectedScreenName')?.setValue(element.screenNameId, { emitEvent: false });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Set/update element details from the found element
|
|
218
|
+
variable.elementId = element.id;
|
|
219
|
+
variable.elementLocator = element.locatorValue || '';
|
|
220
|
+
// Only update elementName if it wasn't already set (preserve from setTemplateVariables)
|
|
221
|
+
if (!variable.elementName) {
|
|
222
|
+
variable.elementName = element.name || '';
|
|
223
|
+
}
|
|
224
|
+
// For selector, use elementLocator as value; for others, use elementName
|
|
225
|
+
if (variable.name === 'selector') {
|
|
226
|
+
variable.value = element.locatorValue || element.name || '';
|
|
227
|
+
}
|
|
228
|
+
else if (!variable.value || variable.value === '') {
|
|
229
|
+
variable.value = element.name || element.locatorValue || '';
|
|
230
|
+
}
|
|
231
|
+
// Set element ID form control for the dropdown (key is 'id' in config)
|
|
232
|
+
if (!variableGroup.get('id')) {
|
|
233
|
+
variableGroup.addControl('id', new FormControl(element.id));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
variableGroup.get('id')?.setValue(element.id, { emitEvent: false });
|
|
237
|
+
}
|
|
238
|
+
// Update value form control
|
|
239
|
+
if (variableGroup.get('value')) {
|
|
240
|
+
variableGroup.get('value')?.setValue(variable.value, { emitEvent: false });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Element not found in elementOptions yet - might need to fetch
|
|
245
|
+
// Keep elementId and elementName if they exist (from setTemplateVariables)
|
|
246
|
+
// If we have elementId but element isn't found, we might need to fetch elements
|
|
247
|
+
// However, we don't know the screen name yet, so we'll wait for elementOptions to be loaded
|
|
248
|
+
// The initialization will run again when elementOptions changes via ngOnChanges
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
115
254
|
// Pre-compute all configs to avoid calling methods in template
|
|
116
|
-
|
|
255
|
+
// This will recompute element configs with the new elementOptions
|
|
256
|
+
// Only precompute if templateVariables exist to avoid unnecessary work
|
|
257
|
+
if (this.templateVariables && this.templateVariables.length > 0) {
|
|
258
|
+
this.precomputeConfigs();
|
|
259
|
+
}
|
|
260
|
+
// Force change detection after recomputing configs (only once at the end)
|
|
261
|
+
this.cdr.markForCheck();
|
|
117
262
|
// If environment options changed and we have selected environments, refresh parameter configs
|
|
118
263
|
if (changes['environmentOptions']) {
|
|
119
264
|
this.templateVariables.forEach((variable, index) => {
|
|
@@ -127,7 +272,6 @@ export class TemplateVariablesFormComponent {
|
|
|
127
272
|
// If parameter options changed and we have default values, try to initialize them
|
|
128
273
|
if (changes['parameterOptions'] && this.defaultTestDataProfileId && this.defaultTestDataStartIndex != null && this.parameterOptions.length > 0) {
|
|
129
274
|
// Re-initialize to set default values now that parameterOptions are available
|
|
130
|
-
console.log('Re-initializing with default values after parameterOptions loaded');
|
|
131
275
|
this.initializeTestDataVariables();
|
|
132
276
|
// Force change detection after initialization
|
|
133
277
|
this.cdr.markForCheck();
|
|
@@ -226,22 +370,8 @@ export class TemplateVariablesFormComponent {
|
|
|
226
370
|
}
|
|
227
371
|
});
|
|
228
372
|
paramKeysToDelete.forEach(key => this.parameterForDataSetSelectConfigCache.delete(key));
|
|
229
|
-
console.log('Default test data initialized:', {
|
|
230
|
-
variableName: variable.name,
|
|
231
|
-
profileName,
|
|
232
|
-
profileId: defaultProfile.id,
|
|
233
|
-
dataSetName,
|
|
234
|
-
hasSelectedProfile: !!variable.selectedTestDataProfile,
|
|
235
|
-
hasSelectedDataSet: !!variable.selectedDataSet
|
|
236
|
-
});
|
|
237
373
|
}
|
|
238
374
|
else {
|
|
239
|
-
console.warn('Default test data profile not found or invalid:', {
|
|
240
|
-
defaultTestDataProfileId: this.defaultTestDataProfileId,
|
|
241
|
-
defaultTestDataStartIndex: this.defaultTestDataStartIndex,
|
|
242
|
-
parameterOptionsLength: this.parameterOptions.length,
|
|
243
|
-
foundProfile: !!defaultProfile
|
|
244
|
-
});
|
|
245
375
|
}
|
|
246
376
|
}
|
|
247
377
|
else {
|
|
@@ -331,6 +461,70 @@ export class TemplateVariablesFormComponent {
|
|
|
331
461
|
}
|
|
332
462
|
}
|
|
333
463
|
}
|
|
464
|
+
// For element type, parse the value to extract screen name and element
|
|
465
|
+
if (this.isElementType(variable)) {
|
|
466
|
+
let element = null;
|
|
467
|
+
// Priority 1: Find by elementId if available (from setTemplateVariables)
|
|
468
|
+
if (variable.elementId) {
|
|
469
|
+
element = this.elementOptions.find(el => el.id === variable.elementId);
|
|
470
|
+
}
|
|
471
|
+
// Priority 2: Find by elementName if available (from setTemplateVariables)
|
|
472
|
+
if (!element && variable.elementName) {
|
|
473
|
+
element = this.elementOptions.find(el => el.name === variable.elementName);
|
|
474
|
+
}
|
|
475
|
+
// Priority 3: Find by locatorValue (for backward compatibility)
|
|
476
|
+
if (!element && variable.value) {
|
|
477
|
+
const elementValue = variable.value;
|
|
478
|
+
element = this.elementOptions.find(el => el.locatorValue === elementValue);
|
|
479
|
+
}
|
|
480
|
+
if (element) {
|
|
481
|
+
// Set screen name info from the found element
|
|
482
|
+
if (element.screenNameId && element.screenNameObj) {
|
|
483
|
+
variable.selectedScreenName = element.screenNameObj.name;
|
|
484
|
+
variable.screenNameId = element.screenNameId;
|
|
485
|
+
// Set form controls
|
|
486
|
+
// Since valueBy is 'screenNameId', we need to store the screenNameId (number) in the form control
|
|
487
|
+
if (!variableGroup.get('selectedScreenName')) {
|
|
488
|
+
variableGroup.addControl('selectedScreenName', new FormControl(element.screenNameId));
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
variableGroup.get('selectedScreenName')?.setValue(element.screenNameId, { emitEvent: false });
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
// Set/update element details from the found element
|
|
495
|
+
variable.elementId = element.id;
|
|
496
|
+
variable.elementLocator = element.locatorValue || '';
|
|
497
|
+
// Only update elementName if it wasn't already set (preserve from setTemplateVariables)
|
|
498
|
+
if (!variable.elementName) {
|
|
499
|
+
variable.elementName = element.name || '';
|
|
500
|
+
}
|
|
501
|
+
// For selector, use elementLocator as value; for others, use elementName
|
|
502
|
+
if (variable.name === 'selector') {
|
|
503
|
+
variable.value = element.locatorValue || element.name || '';
|
|
504
|
+
}
|
|
505
|
+
else if (!variable.value || variable.value === '') {
|
|
506
|
+
variable.value = element.name || element.locatorValue || '';
|
|
507
|
+
}
|
|
508
|
+
// Set element ID form control for the dropdown (key is 'id' in config)
|
|
509
|
+
if (!variableGroup.get('id')) {
|
|
510
|
+
variableGroup.addControl('id', new FormControl(element.id));
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
variableGroup.get('id')?.setValue(element.id, { emitEvent: false });
|
|
514
|
+
}
|
|
515
|
+
// Update value form control
|
|
516
|
+
if (variableGroup.get('value')) {
|
|
517
|
+
variableGroup.get('value')?.setValue(variable.value, { emitEvent: false });
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
// Element not found in elementOptions yet - might need to fetch
|
|
522
|
+
// Keep elementId and elementName if they exist (from setTemplateVariables)
|
|
523
|
+
// If we have elementId but element isn't found, we might need to fetch elements
|
|
524
|
+
// However, we don't know the screen name yet, so we'll wait for elementOptions to be loaded
|
|
525
|
+
// The initialization will run again when elementOptions changes via ngOnChanges
|
|
526
|
+
}
|
|
527
|
+
}
|
|
334
528
|
}
|
|
335
529
|
}
|
|
336
530
|
});
|
|
@@ -383,6 +577,14 @@ export class TemplateVariablesFormComponent {
|
|
|
383
577
|
}
|
|
384
578
|
}
|
|
385
579
|
}
|
|
580
|
+
// Pre-compute element variable configs (screen name + element)
|
|
581
|
+
if (this.isElementType(variable)) {
|
|
582
|
+
this.getScreenNameSelectConfig(variable, index);
|
|
583
|
+
// Pre-compute element config if screen name is already selected
|
|
584
|
+
if (variable.selectedScreenName) {
|
|
585
|
+
this.getElementSelectConfig(variable, index);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
386
588
|
});
|
|
387
589
|
}
|
|
388
590
|
parseTestDataValue(value) {
|
|
@@ -428,9 +630,10 @@ export class TemplateVariablesFormComponent {
|
|
|
428
630
|
getSelectConfig(variable, index) {
|
|
429
631
|
// Use cache to avoid recalculating on every change detection
|
|
430
632
|
// For element variables, include elementOptions, hasMoreElements, and isLoadingElements in cache key
|
|
633
|
+
// Optimize cache key computation - use length instead of full array join for better performance
|
|
431
634
|
const optionsKey = variable.dataKey === 'element' || variable.dataKey === 'label'
|
|
432
|
-
? this.elementOptions.map(el =>
|
|
433
|
-
:
|
|
635
|
+
? `${this.elementOptions.length}_${this.elementOptions.map(el => el.id || '').join(',')}`
|
|
636
|
+
: `${variable.options?.length || 0}_${variable.options?.join(',') || ''}`;
|
|
434
637
|
// Include hasMoreElements and isLoadingElements in cache key for selector variables
|
|
435
638
|
const cacheKey = variable.dataKey === 'element' || variable.dataKey === 'label'
|
|
436
639
|
? `${variable.name}_${optionsKey}_${this.hasMoreElements}_${this.isLoadingElements}`
|
|
@@ -444,7 +647,6 @@ export class TemplateVariablesFormComponent {
|
|
|
444
647
|
if (variable.dataKey === 'element' || variable.dataKey === 'label') {
|
|
445
648
|
// For element options, use locatorValue as both id and value so the component returns locatorValue
|
|
446
649
|
// This ensures the selected value is the locatorValue (not the element id)
|
|
447
|
-
console.log('elementOptions', this.elementOptions);
|
|
448
650
|
optionsArray = this.elementOptions
|
|
449
651
|
.map(el => {
|
|
450
652
|
const locatorValue = el.locatorValue || '';
|
|
@@ -463,7 +665,6 @@ export class TemplateVariablesFormComponent {
|
|
|
463
665
|
else {
|
|
464
666
|
optionsArray = variable.options?.map(opt => { return { id: opt, value: opt, name: opt, label: opt }; }) || [];
|
|
465
667
|
}
|
|
466
|
-
console.log('optionsArray', optionsArray);
|
|
467
668
|
const config = {
|
|
468
669
|
key: 'value',
|
|
469
670
|
placeholder: `Select ${variable.label}`,
|
|
@@ -492,7 +693,6 @@ export class TemplateVariablesFormComponent {
|
|
|
492
693
|
return config;
|
|
493
694
|
}
|
|
494
695
|
onVariableValueChange(variableName, value) {
|
|
495
|
-
console.log("onVariableValueChange", variableName, value);
|
|
496
696
|
const variable = this.templateVariables.find(v => v.name === variableName);
|
|
497
697
|
if (!variable)
|
|
498
698
|
return;
|
|
@@ -541,7 +741,9 @@ export class TemplateVariablesFormComponent {
|
|
|
541
741
|
if (this.shouldShowDropdownCache.has(variable.name)) {
|
|
542
742
|
return this.shouldShowDropdownCache.get(variable.name);
|
|
543
743
|
}
|
|
544
|
-
|
|
744
|
+
// For element variables (dataKey === 'element'), we use cascading dropdowns (screen name + element)
|
|
745
|
+
// So return false to use the cascading dropdown pattern
|
|
746
|
+
const result = variable.name === 'type' || variable.name === 'scrollTo' || variable.dataKey === 'label';
|
|
545
747
|
this.shouldShowDropdownCache.set(variable.name, result);
|
|
546
748
|
return result;
|
|
547
749
|
}
|
|
@@ -886,22 +1088,8 @@ export class TemplateVariablesFormComponent {
|
|
|
886
1088
|
const currentControlValue = variableGroup.get('selectedTestDataProfile')?.value;
|
|
887
1089
|
if (currentControlValue !== profileIdString) {
|
|
888
1090
|
variableGroup.get('selectedTestDataProfile')?.setValue(profileIdString, { emitEvent: false });
|
|
889
|
-
console.log('Updated test data profile form control with ID:', {
|
|
890
|
-
variableName: variable.name,
|
|
891
|
-
profileId: profileIdString,
|
|
892
|
-
profileName: variable.selectedTestDataProfile,
|
|
893
|
-
optionsCount: optionsArray.length
|
|
894
|
-
});
|
|
895
1091
|
}
|
|
896
1092
|
}
|
|
897
|
-
else {
|
|
898
|
-
console.warn('Selected test data profile ID not found in options:', {
|
|
899
|
-
variableName: variable.name,
|
|
900
|
-
profileId: profileIdString,
|
|
901
|
-
profileName: variable.selectedTestDataProfile,
|
|
902
|
-
availableOptionIds: optionsArray.map(opt => opt.id)
|
|
903
|
-
});
|
|
904
|
-
}
|
|
905
1093
|
}
|
|
906
1094
|
else if (variable.selectedTestDataProfile) {
|
|
907
1095
|
// Fallback: if we only have the profile name, find the matching option and use its ID
|
|
@@ -912,11 +1100,6 @@ export class TemplateVariablesFormComponent {
|
|
|
912
1100
|
variableGroup.get('selectedTestDataProfile')?.setValue(matchingOption.id, { emitEvent: false });
|
|
913
1101
|
// Also update the variable's profile ID for consistency
|
|
914
1102
|
variable.selectedTestDataProfileId = Number(matchingOption.id);
|
|
915
|
-
console.log('Updated test data profile form control with ID from name:', {
|
|
916
|
-
variableName: variable.name,
|
|
917
|
-
profileId: matchingOption.id,
|
|
918
|
-
profileName: variable.selectedTestDataProfile
|
|
919
|
-
});
|
|
920
1103
|
}
|
|
921
1104
|
}
|
|
922
1105
|
}
|
|
@@ -1399,6 +1582,258 @@ export class TemplateVariablesFormComponent {
|
|
|
1399
1582
|
const dataType = variable.dataType || 'plain-text';
|
|
1400
1583
|
return dataType === 'environment';
|
|
1401
1584
|
}
|
|
1585
|
+
/**
|
|
1586
|
+
* Check if variable is element type (dataKey === 'element')
|
|
1587
|
+
*/
|
|
1588
|
+
isElementType(variable) {
|
|
1589
|
+
return variable.dataKey === 'element';
|
|
1590
|
+
}
|
|
1591
|
+
/**
|
|
1592
|
+
* Check if screen name is selected for an element variable
|
|
1593
|
+
*/
|
|
1594
|
+
hasSelectedScreenName(variable) {
|
|
1595
|
+
return !!variable.selectedScreenName;
|
|
1596
|
+
}
|
|
1597
|
+
/**
|
|
1598
|
+
* Get select config for screen name dropdown (first dropdown for element variables)
|
|
1599
|
+
*/
|
|
1600
|
+
getScreenNameSelectConfig(variable, index) {
|
|
1601
|
+
// Include loading state in cache key to invalidate when loading completes
|
|
1602
|
+
const cacheKey = `${variable.name}_screenName_${this.screenNameOptions.length}_${this.isLoadingScreenNames}`;
|
|
1603
|
+
if (this.screenNameSelectConfigCache.has(cacheKey)) {
|
|
1604
|
+
return this.screenNameSelectConfigCache.get(cacheKey);
|
|
1605
|
+
}
|
|
1606
|
+
// Use screenNameOptions from API (not extracted from elementOptions)
|
|
1607
|
+
const optionsArray = this.screenNameOptions.map(screenName => ({
|
|
1608
|
+
id: screenName.id?.toString() || '',
|
|
1609
|
+
value: screenName.name,
|
|
1610
|
+
name: screenName.name,
|
|
1611
|
+
label: screenName.name,
|
|
1612
|
+
screenNameId: screenName.id
|
|
1613
|
+
}));
|
|
1614
|
+
// Ensure form control exists for screen name selection
|
|
1615
|
+
// Since valueBy is 'screenNameId', we need to store the screenNameId (number) in the form control
|
|
1616
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
1617
|
+
if (variableGroup) {
|
|
1618
|
+
if (!variableGroup.get('selectedScreenName')) {
|
|
1619
|
+
// Initialize with screenNameId if available, otherwise null
|
|
1620
|
+
const initialValue = variable.screenNameId || null;
|
|
1621
|
+
variableGroup.addControl('selectedScreenName', new FormControl(initialValue));
|
|
1622
|
+
}
|
|
1623
|
+
else {
|
|
1624
|
+
// Update form control value if variable has screenNameId but form control doesn't match
|
|
1625
|
+
if (variable.screenNameId) {
|
|
1626
|
+
const currentValue = variableGroup.get('selectedScreenName')?.value;
|
|
1627
|
+
if (currentValue !== variable.screenNameId) {
|
|
1628
|
+
variableGroup.get('selectedScreenName')?.setValue(variable.screenNameId, { emitEvent: false });
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
const config = {
|
|
1634
|
+
key: 'selectedScreenName',
|
|
1635
|
+
placeholder: 'Select Screen Name',
|
|
1636
|
+
multiple: false,
|
|
1637
|
+
searchable: true,
|
|
1638
|
+
serverSearch: true,
|
|
1639
|
+
options: optionsArray,
|
|
1640
|
+
hasMore: this.hasMoreScreenNames,
|
|
1641
|
+
isLoading: this.isLoadingScreenNames,
|
|
1642
|
+
valueBy: 'screenNameId',
|
|
1643
|
+
onChange: (value) => {
|
|
1644
|
+
// Store selected screen name on the variable object
|
|
1645
|
+
// value is the screenNameId (number) since valueBy is 'screenNameId'
|
|
1646
|
+
variable.screenNameId = value;
|
|
1647
|
+
// Find and store screen name name from screenNameOptions
|
|
1648
|
+
const screenNameOption = this.screenNameOptions.find(sn => sn.id === value);
|
|
1649
|
+
if (screenNameOption && screenNameOption.id) {
|
|
1650
|
+
variable.selectedScreenName = screenNameOption.name;
|
|
1651
|
+
}
|
|
1652
|
+
// Clear the element selection when screen name changes
|
|
1653
|
+
variable.value = '';
|
|
1654
|
+
// Clear element config cache to force refresh
|
|
1655
|
+
// Clear all element configs for this variable since screen name changed
|
|
1656
|
+
const keysToDelete = [];
|
|
1657
|
+
this.elementSelectConfigCache.forEach((_, key) => {
|
|
1658
|
+
if (key.startsWith(`${variable.name}_element`)) {
|
|
1659
|
+
keysToDelete.push(key);
|
|
1660
|
+
}
|
|
1661
|
+
});
|
|
1662
|
+
keysToDelete.forEach(key => this.elementSelectConfigCache.delete(key));
|
|
1663
|
+
// Update form control
|
|
1664
|
+
if (variableGroup) {
|
|
1665
|
+
if (variableGroup.get('value')) {
|
|
1666
|
+
variableGroup.get('value')?.setValue('', { emitEvent: false });
|
|
1667
|
+
}
|
|
1668
|
+
// The form control already has the correct value (screenNameId) from the dropdown
|
|
1669
|
+
// No need to update it here as it's already set by mat-select
|
|
1670
|
+
}
|
|
1671
|
+
// Emit event to fetch elements filtered by selected screen name
|
|
1672
|
+
if (variable.screenNameId) {
|
|
1673
|
+
this.searchElementsByScreenName.emit({
|
|
1674
|
+
screenNameId: variable.screenNameId,
|
|
1675
|
+
searchTerm: ''
|
|
1676
|
+
});
|
|
1677
|
+
}
|
|
1678
|
+
// Mark for check to update UI first
|
|
1679
|
+
this.cdr.markForCheck();
|
|
1680
|
+
// The element config will be recomputed automatically when elementOptions input changes
|
|
1681
|
+
// via ngOnChanges, which will clear the cache and trigger re-computation
|
|
1682
|
+
},
|
|
1683
|
+
onLoadMore: () => {
|
|
1684
|
+
this.loadMoreScreenNames.emit('');
|
|
1685
|
+
},
|
|
1686
|
+
onSearch: (query) => {
|
|
1687
|
+
this.searchScreenName.emit(query);
|
|
1688
|
+
}
|
|
1689
|
+
};
|
|
1690
|
+
this.screenNameSelectConfigCache.set(cacheKey, config);
|
|
1691
|
+
return config;
|
|
1692
|
+
}
|
|
1693
|
+
/**
|
|
1694
|
+
* Get select config for element dropdown (second dropdown - filtered by screen name)
|
|
1695
|
+
* Optimized to return immediately from cache to avoid repeated calls during change detection
|
|
1696
|
+
*/
|
|
1697
|
+
getElementSelectConfig(variable, index) {
|
|
1698
|
+
// Get selected screen name ID
|
|
1699
|
+
console.log('variable', variable);
|
|
1700
|
+
const selectedScreenNameId = variable.screenNameId;
|
|
1701
|
+
// Include elementOptions length and loading state in cache key to invalidate when elements change
|
|
1702
|
+
const cacheKey = `${variable.name}_element_${selectedScreenNameId || ''}_${this.elementOptions.length}_${this.isLoadingElements}`;
|
|
1703
|
+
// Early return from cache - this is the most common path and should be very fast
|
|
1704
|
+
if (this.elementSelectConfigCache.has(cacheKey)) {
|
|
1705
|
+
return this.elementSelectConfigCache.get(cacheKey);
|
|
1706
|
+
}
|
|
1707
|
+
// If no screen name is selected, return empty config and cache it
|
|
1708
|
+
if (!selectedScreenNameId) {
|
|
1709
|
+
const emptyConfig = {
|
|
1710
|
+
key: 'value',
|
|
1711
|
+
placeholder: 'Select Screen Name first',
|
|
1712
|
+
multiple: false,
|
|
1713
|
+
searchable: false,
|
|
1714
|
+
options: []
|
|
1715
|
+
};
|
|
1716
|
+
this.elementSelectConfigCache.set(cacheKey, emptyConfig);
|
|
1717
|
+
return emptyConfig;
|
|
1718
|
+
}
|
|
1719
|
+
// If elements are still loading, return a loading config and cache it
|
|
1720
|
+
if (this.isLoadingElements) {
|
|
1721
|
+
const loadingConfig = {
|
|
1722
|
+
key: 'value',
|
|
1723
|
+
placeholder: 'Loading elements...',
|
|
1724
|
+
multiple: false,
|
|
1725
|
+
searchable: false,
|
|
1726
|
+
options: [],
|
|
1727
|
+
isLoading: true
|
|
1728
|
+
};
|
|
1729
|
+
this.elementSelectConfigCache.set(cacheKey, loadingConfig);
|
|
1730
|
+
return loadingConfig;
|
|
1731
|
+
}
|
|
1732
|
+
// Filter elements by selected screen name
|
|
1733
|
+
// Compare both as numbers to ensure type matching
|
|
1734
|
+
const filteredElements = this.elementOptions.filter(el => {
|
|
1735
|
+
const elScreenNameId = el.screenNameId;
|
|
1736
|
+
// Handle both number and string comparisons
|
|
1737
|
+
return elScreenNameId != null && Number(elScreenNameId) === Number(selectedScreenNameId);
|
|
1738
|
+
});
|
|
1739
|
+
// Convert to SelectOption format
|
|
1740
|
+
const optionsArray = filteredElements.map(el => {
|
|
1741
|
+
const locatorValue = el.locatorValue || '';
|
|
1742
|
+
return {
|
|
1743
|
+
id: el.id,
|
|
1744
|
+
elementId: el.id?.toString() || '',
|
|
1745
|
+
value: el.name,
|
|
1746
|
+
locatorValue: locatorValue,
|
|
1747
|
+
name: el.name,
|
|
1748
|
+
label: el.name,
|
|
1749
|
+
screenNameId: el.screenNameId?.toString() || '',
|
|
1750
|
+
screenNameObj: el.screenNameObj,
|
|
1751
|
+
otherLocator: el.otherLocator
|
|
1752
|
+
};
|
|
1753
|
+
});
|
|
1754
|
+
// Ensure form control exists for element ID selection
|
|
1755
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
1756
|
+
if (variableGroup && !variableGroup.get('id')) {
|
|
1757
|
+
// If we have an existing element value, try to find the element and set the ID
|
|
1758
|
+
let initialElementId = null;
|
|
1759
|
+
if (variable.elementId) {
|
|
1760
|
+
initialElementId = variable.elementId;
|
|
1761
|
+
}
|
|
1762
|
+
else if (variable.value) {
|
|
1763
|
+
// Try to find element by locatorValue or name
|
|
1764
|
+
const element = this.elementOptions.find(el => el.locatorValue === variable.value || el.name === variable.value);
|
|
1765
|
+
if (element) {
|
|
1766
|
+
initialElementId = element.id;
|
|
1767
|
+
}
|
|
1768
|
+
}
|
|
1769
|
+
variableGroup.addControl('id', new FormControl(initialElementId));
|
|
1770
|
+
}
|
|
1771
|
+
const config = {
|
|
1772
|
+
key: 'id',
|
|
1773
|
+
placeholder: 'Select Element',
|
|
1774
|
+
multiple: false,
|
|
1775
|
+
searchable: true,
|
|
1776
|
+
serverSearch: true,
|
|
1777
|
+
options: optionsArray,
|
|
1778
|
+
hasMore: this.hasMoreElements,
|
|
1779
|
+
isLoading: this.isLoadingElements,
|
|
1780
|
+
onChange: (value) => {
|
|
1781
|
+
// Find the selected element from elementOptions
|
|
1782
|
+
// value is the element ID (since config key is 'id')
|
|
1783
|
+
const selectedElement = this.elementOptions.find(el => el.id === value);
|
|
1784
|
+
if (selectedElement) {
|
|
1785
|
+
variable.value = value;
|
|
1786
|
+
// Store element details on the variable
|
|
1787
|
+
variable.elementId = selectedElement.id;
|
|
1788
|
+
variable.elementLocator = selectedElement.locatorValue || '';
|
|
1789
|
+
variable.elementName = selectedElement.name || '';
|
|
1790
|
+
// Find and patch the selector variable with dataKey 'not_found'
|
|
1791
|
+
const selectorVariable = this.templateVariables.find(v => v.name === 'selector' && v.dataKey === 'not_found');
|
|
1792
|
+
if (selectorVariable && selectedElement.locatorValue) {
|
|
1793
|
+
// Get the form group for the selector variable
|
|
1794
|
+
const selectorVariableGroup = this.getVariableFormGroup(selectorVariable.name);
|
|
1795
|
+
if (selectorVariableGroup) {
|
|
1796
|
+
// Update the selector variable's value with the element locator
|
|
1797
|
+
selectorVariable.value = selectedElement.locatorValue;
|
|
1798
|
+
// Patch the form control value
|
|
1799
|
+
if (selectorVariableGroup.get('value')) {
|
|
1800
|
+
selectorVariableGroup.get('value')?.setValue(selectedElement.locatorValue, { emitEvent: false });
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
else {
|
|
1806
|
+
// Fallback: if element not found, just set the value
|
|
1807
|
+
variable.value = value;
|
|
1808
|
+
}
|
|
1809
|
+
// Screen name ID is already stored on variable.selectedScreenNameId
|
|
1810
|
+
// (it was set when screen name was selected)
|
|
1811
|
+
// Update form control in FormArray
|
|
1812
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
1813
|
+
if (variableGroup) {
|
|
1814
|
+
if (variableGroup.get('value')) {
|
|
1815
|
+
variableGroup.get('value')?.setValue(variable.value, { emitEvent: false });
|
|
1816
|
+
}
|
|
1817
|
+
// Set element ID form control for the dropdown (key is 'id' in config)
|
|
1818
|
+
if (selectedElement && variableGroup.get('id')) {
|
|
1819
|
+
variableGroup.get('id')?.setValue(selectedElement.id, { emitEvent: false });
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
// Mark for check and emit
|
|
1823
|
+
this.cdr.markForCheck();
|
|
1824
|
+
this.variableValueChange.emit({ name: variable.name, value: variable.value });
|
|
1825
|
+
},
|
|
1826
|
+
onLoadMore: () => {
|
|
1827
|
+
this.loadMoreElements.emit();
|
|
1828
|
+
},
|
|
1829
|
+
onSearch: (query) => {
|
|
1830
|
+
this.searchElements.emit(query);
|
|
1831
|
+
}
|
|
1832
|
+
};
|
|
1833
|
+
// Cache the config before returning
|
|
1834
|
+
this.elementSelectConfigCache.set(cacheKey, config);
|
|
1835
|
+
return config;
|
|
1836
|
+
}
|
|
1402
1837
|
/**
|
|
1403
1838
|
* Check if current data type is runtime
|
|
1404
1839
|
*/
|
|
@@ -1408,10 +1843,10 @@ export class TemplateVariablesFormComponent {
|
|
|
1408
1843
|
}
|
|
1409
1844
|
}
|
|
1410
1845
|
TemplateVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1411
|
-
TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isEditInDepth: "isEditInDepth", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "cancel", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1846
|
+
TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isEditInDepth: "isEditInDepth", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "cancel", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1412
1847
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, decorators: [{
|
|
1413
1848
|
type: Component,
|
|
1414
|
-
args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: [] }]
|
|
1849
|
+
args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: [] }]
|
|
1415
1850
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { templateVariables: [{
|
|
1416
1851
|
type: Input
|
|
1417
1852
|
}], variablesForm: [{
|
|
@@ -1462,6 +1897,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1462
1897
|
type: Output
|
|
1463
1898
|
}], searchElements: [{
|
|
1464
1899
|
type: Output
|
|
1900
|
+
}], searchElementsByScreenName: [{
|
|
1901
|
+
type: Output
|
|
1465
1902
|
}], createElement: [{
|
|
1466
1903
|
type: Output
|
|
1467
1904
|
}], searchScreenName: [{
|
|
@@ -1485,4 +1922,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1485
1922
|
}], createElementVisible: [{
|
|
1486
1923
|
type: Input
|
|
1487
1924
|
}] } });
|
|
1488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUF3Q25FLE1BQU0sT0FBTyw4QkFBOEI7SUF1RnpDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEZqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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YTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFzQ0Usb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbGVtZW50Q3JlYXRlUGF5bG9hZCwgU2NyZWVuTmFtZU9wdGlvbiB9IGZyb20gJy4uLy4uL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC1mb3JtLWRhdGEnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7XG4gIHNjcmVlbk5hbWVPYmo/OiBhbnk7IC8vIEZpeGVkOiB1c2UgJ2FueScgc2luY2UgJ0VsZW1lbnRTY3JlZW5OYW1lJyBpcyBub3QgZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlVmFyaWFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGFLZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xuICAvLyBBZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIG1hbmFnaW5nIHZhcmlhYmxlIHN0YXRlXG4gIGRhdGFUeXBlPzogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnO1xuICByYXdWYWx1ZT86IHN0cmluZzsgLy8gUmF3IHZhbHVlIHdpdGhvdXQgZm9ybWF0dGluZyAoZm9yIHNlbGVjdCBkcm9wZG93bnMpXG4gIHNlbGVjdGVkRW52aXJvbm1lbnQ/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGVudmlyb25tZW50IG5hbWUgKGZvciBlbnZpcm9ubWVudCB0eXBlKVxuICBzZWxlY3RlZEVudmlyb25tZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVudmlyb25tZW50IElEIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIG5hbWUgKGZvciBwYXJhbWV0ZXIgdHlwZSlcbiAgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgKGZvciBwYXJhbWV0ZXIgdHlwZSlcbiAgc2VsZWN0ZWREYXRhU2V0Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBkYXRhIHNldCBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgQE91dHB1dCgpIHZhcmlhYmxlVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKSB2YXJpYWJsZUJvb2xlYW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGRlc2NyaXB0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxFbGVtZW50Q3JlYXRlUGF5bG9hZD4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZCB3aXRoIHBheWxvYWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBjYW5jZWxFbGVtZW50Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSBpcyBjYW5jZWxsZWRcbiAgQE91dHB1dCgpIGVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgXG4gIC8vIENhY2hlIGZvciBzZWxlY3QgY29uZmlncyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHR5cGUgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBkYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIHBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWdzIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzZWxlY3QgY29uZmlncyAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgcHJpdmF0ZSBkYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzIGZvciBhIHNwZWNpZmljIGRhdGEgc2V0ICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgY29tcHV0ZWQgcHJvcGVydGllc1xuICBwcml2YXRlIG5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzaG91bGRTaG93RHJvcGRvd25DYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBQcmUtY29tcHV0ZWQgZGF0YSB0eXBlIG9wdGlvbnMgKHN0YXRpYywgbm8gbmVlZCB0byByZWNyZWF0ZSlcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdwbGFpbi10ZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JywgbmFtZTogJ1BsYWluIFRleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gICAgeyBpZDogJ3BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJywgbmFtZTogJ0B8UGFyYW1ldGVyfCcsIGxhYmVsOiAnQHxQYXJhbWV0ZXJ8JyB9LFxuICAgIHsgaWQ6ICdydW50aW1lJywgdmFsdWU6ICdydW50aW1lJywgbmFtZTogJyR8UnVudGltZXwnLCBsYWJlbDogJyR8UnVudGltZXwnIH0sXG4gICAgeyBpZDogJ2Vudmlyb25tZW50JywgdmFsdWU6ICdlbnZpcm9ubWVudCcsIG5hbWU6ICcqfEVudmlyb25tZW50fCcsIGxhYmVsOiAnKnxFbnZpcm9ubWVudHwnIH1cbiAgXTtcblxuICBASW5wdXQoKSBjcmVhdGVFbGVtZW50VmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uQ3JlYXRlRWxlbWVudChwYXlsb2FkOiBFbGVtZW50Q3JlYXRlUGF5bG9hZCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdvbkNyZWF0ZUVsZW1lbnQnLCBwYXlsb2FkKTtcbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnQuZW1pdChwYXlsb2FkKTtcbiAgICB0aGlzLmVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWxlbWVudEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5jYW5jZWxFbGVtZW50Rm9ybS5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10gfHwgY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSkge1xuICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlcyB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5jbGVhcigpO1xuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMgYW5kIHJhdyB2YWx1ZXMgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXNcbiAgICAgIC8vIEFsc28gcmUtaW5pdGlhbGl6ZSBpZiBkZWZhdWx0IHZhbHVlcyBvciBwYXJhbWV0ZXJPcHRpb25zIGNoYW5nZSAodG8gc2V0IGRlZmF1bHQgc2VsZWN0aW9ucylcbiAgICAgIGlmICgoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10gfHwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGFsbCBjb25maWdzIHRvIGF2b2lkIGNhbGxpbmcgbWV0aG9kcyBpbiB0ZW1wbGF0ZVxuICAgICAgdGhpcy5wcmVjb21wdXRlQ29uZmlncygpO1xuICAgICAgXG4gICAgICAvLyBJZiBlbnZpcm9ubWVudCBvcHRpb25zIGNoYW5nZWQgYW5kIHdlIGhhdmUgc2VsZWN0ZWQgZW52aXJvbm1lbnRzLCByZWZyZXNoIHBhcmFtZXRlciBjb25maWdzXG4gICAgICBpZiAoY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10pIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X2VudlBhcmFtYCk7XG4gICAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgcGFyYW1ldGVyIG9wdGlvbnMgY2hhbmdlZCBhbmQgd2UgaGF2ZSBkZWZhdWx0IHZhbHVlcywgdHJ5IHRvIGluaXRpYWxpemUgdGhlbVxuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBub3cgdGhhdCBwYXJhbWV0ZXJPcHRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgY29uc29sZS5sb2coJ1JlLWluaXRpYWxpemluZyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFmdGVyIHBhcmFtZXRlck9wdGlvbnMgbG9hZGVkJyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHBhcmFtZXRlciBvcHRpb25zIGNoYW5nZWQgYW5kIHdlIGhhdmUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGVzLCByZWZyZXNoIGNvbmZpZ3NcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICAgIC8vIENsZWFyIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgY2FjaGUgc2luY2UgcHJvZmlsZXMgbGlzdCBtYXkgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgLy8gUmVjb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHJlY29tcHV0ZSBkYXRhIHNldCBjb25maWdcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFuZCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlIGZvciBjYWNoZSBrZXlcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRlbnRpZmllciA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgOiB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0XyR7cHJvZmlsZUlkZW50aWZpZXJ9XyR7dmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhVHlwZSwgcmF3VmFsdWUgfSA9IHRoaXMucGFyc2VUZXN0RGF0YVZhbHVlKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgLy8gU2V0IHByb3BlcnRpZXMgZGlyZWN0bHkgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGRhdGFUeXBlO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgdHlwZSBpbiB0aGUgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJyk/LnNldFZhbHVlKGRhdGFUeXBlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBwYXJhbWV0ZXIgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3QgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIHBhcmFtZXRlclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGFyZSBwcm92aWRlZCBmcm9tIHRlc3QgY2FzZVxuICAgICAgICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHBhcmFtZXRlck9wdGlvbnMgYXJlIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IElEXG4gICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHRlc3REYXRhLmlkID09PSB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgICAgICAgIGlmIChkZWZhdWx0UHJvZmlsZSAmJiBkZWZhdWx0UHJvZmlsZS5kYXRhICYmIGRlZmF1bHRQcm9maWxlLmRhdGEubGVuZ3RoID4gdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdERhdGFTZXQgPSBkZWZhdWx0UHJvZmlsZS5kYXRhW3RoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBkZWZhdWx0UHJvZmlsZS5uYW1lIHx8IGRlZmF1bHRQcm9maWxlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGRlZmF1bHREYXRhU2V0Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IHZhcmlhYmxlIHByb3BlcnRpZXMgLSB0aGlzIGVuc3VyZXMgaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUoKSBhbmQgaGFzU2VsZWN0ZWREYXRhU2V0KCkgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBkZWZhdWx0UHJvZmlsZS5pZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBzZXQgcGFyYW1ldGVyIHZhbHVlIHlldCAtIHVzZXIgd2lsbCBzZWxlY3QgaXRcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIHZhcmlhYmxlIHRvIGVuc3VyZSBmcmVzaCBjb25maWdzXG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlZmF1bHQgdGVzdCBkYXRhIGluaXRpYWxpemVkOicsIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgIHByb2ZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgcHJvZmlsZUlkOiBkZWZhdWx0UHJvZmlsZS5pZCxcbiAgICAgICAgICAgICAgICAgIGRhdGFTZXROYW1lLFxuICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRQcm9maWxlOiAhIXZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlLFxuICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0ZWREYXRhU2V0OiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBub3QgZm91bmQgb3IgaW52YWxpZDonLCB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQ6IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleDogdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4LFxuICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyT3B0aW9uc0xlbmd0aDogdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGZvdW5kUHJvZmlsZTogISFkZWZhdWx0UHJvZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBObyBkZWZhdWx0IHZhbHVlcyAtIHVzZSBleGlzdGluZyBsb2dpYyB0byBmaW5kIGZyb20gcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJhd1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhpcyBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgdGVzdCBkYXRhIHByb2ZpbGVzIGFuZCB0aGVpciBkYXRhIHNldHNcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRQcm9maWxlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZERhdGFTZXQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0RGF0YVByb2ZpbGUgb2YgdGhpcy5wYXJhbWV0ZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGVzdERhdGFQcm9maWxlLmRhdGEgJiYgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgZGF0YSBzZXRzIGluIHRoaXMgcHJvZmlsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFTZXQgb2YgdGVzdERhdGFQcm9maWxlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNldCAmJiBkYXRhU2V0LmRhdGEgJiYgZGF0YVNldC5kYXRhLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGF0YVNldCA9IGRhdGFTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUgJiYgZm91bmREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGZvdW5kUHJvZmlsZS5uYW1lIHx8IGZvdW5kUHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGZvdW5kRGF0YVNldC5uYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGZvdW5kUHJvZmlsZS5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZU5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGRhdGFTZXROYW1lKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sIHRvIHBhcmFtIG5hbWUgKGZvciBkcm9wZG93biBkaXNwbGF5KVxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShwYXJhbU5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5IGFzIEB8cGFyYW1OYW1lfFxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocGFyYW1OYW1lLCAncGFyYW1ldGVyJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHBhcmFtZXRlciBub3QgZm91bmQsIGZvcm1hdCB0aGUgcmF3IHZhbHVlIGlmIGl0J3MgYSBwYXJhbWV0ZXIgdHlwZVxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShyYXdWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHZhcmlhYmxlLnZhbHVlIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlLCBkYXRhVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBlbnZpcm9ubWVudCB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCBlbnZpcm9ubWVudCBhbmQgcGFyYW1ldGVyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgICAvLyBFbnZpcm9ubWVudCB2YWx1ZXMgYXJlIGluIGZvcm1hdCAqfHBhcmFtZXRlck5hbWV8XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgd2hpY2ggZW52aXJvbm1lbnQgdGhpcyBwYXJhbWV0ZXIgYmVsb25ncyB0b1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcmF3VmFsdWU7XG4gICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVudmlyb25tZW50IHRoYXQgY29udGFpbnMgdGhpcyBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgZW52T3B0aW9uID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmluZChlbnYgPT4gZW52Lm5hbWUgPT09IHBhcmFtTmFtZSk7XG4gICAgICAgICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gZW52T3B0aW9uLmVudmlyb25tZW50O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEXG4gICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCBuZXcgRm9ybUNvbnRyb2woZW52T3B0aW9uLmVudmlyb25tZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKGVudk9wdGlvbi5lbnZpcm9ubWVudCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShgKnwke3BhcmFtTmFtZX18YCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSBmcm9tIEZvcm1BcnJheSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGF0IGEgc3BlY2lmaWMgaW5kZXggZnJvbSBGb3JtQXJyYXkgKGZvciB0ZW1wbGF0ZSB1c2UpICovXG4gIGdldEZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIHByaXZhdGUgcHJlY29tcHV0ZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSByZXR1cm47XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgYWxsIHNlbGVjdCBjb25maWdzXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIC8vIFByZS1jb21wdXRlIHJlZ3VsYXIgc2VsZWN0IGNvbmZpZ3NcbiAgICAgIGlmICh0aGlzLnNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhpcy5nZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZGF0YSB0eXBlIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgcGFyYW1ldGVyIGFuZCBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlncyBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZyBpZiB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWcgaWYgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGlmIGVudmlyb25tZW50IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIHBhcnNlVGVzdERhdGFWYWx1ZSh2YWx1ZTogc3RyaW5nKTogeyBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnLCByYXdWYWx1ZTogc3RyaW5nIH0ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6ICcnIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBwYXJhbWV0ZXIgZm9ybWF0OiBAfHZhbHVlfFxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGFyYW1ldGVyJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgcnVudGltZSBmb3JtYXQ6ICR8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3J1bnRpbWUnLCByYXdWYWx1ZTogdmFsdWUuc2xpY2UoMiwgLTEpIH07XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBlbnZpcm9ubWVudCBmb3JtYXQ6ICp8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBQbGFpbiB0ZXh0IChubyBmb3JtYXR0aW5nKVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6IHZhbHVlIH07XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHN0cmluZyB7XG4gICAgaWYgKCFyYXdWYWx1ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdwYXJhbWV0ZXInOlxuICAgICAgICByZXR1cm4gYEB8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ3J1bnRpbWUnOlxuICAgICAgICByZXR1cm4gYCR8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ2Vudmlyb25tZW50JzpcbiAgICAgICAgcmV0dXJuIGAqfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdwbGFpbi10ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByYXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIGdldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIEZvciBlbGVtZW50IHZhcmlhYmxlcywgaW5jbHVkZSBlbGVtZW50T3B0aW9ucywgaGFzTW9yZUVsZW1lbnRzLCBhbmQgaXNMb2FkaW5nRWxlbWVudHMgaW4gY2FjaGUga2V5XG4gICAgY29uc3Qgb3B0aW9uc0tleSA9IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnXG4gICAgICA/IHRoaXMuZWxlbWVudE9wdGlvbnMubWFwKGVsID0+IFN0cmluZyhlbC5uYW1lIHx8ICcnKSkuam9pbignLCcpIFxuICAgICAgOiAodmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnKTtcbiAgICAvLyBJbmNsdWRlIGhhc01vcmVFbGVtZW50cyBhbmQgaXNMb2FkaW5nRWxlbWVudHMgaW4gY2FjaGUga2V5IGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnXG4gICAgICA/IGAke3ZhcmlhYmxlLm5hbWV9XyR7b3B0aW9uc0tleX1fJHt0aGlzLmhhc01vcmVFbGVtZW50c31fJHt0aGlzLmlzTG9hZGluZ0VsZW1lbnRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGlmIHZhcmlhYmxlIG5hbWUgaXMgJ3NlbGVjdG9yJywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgLy8gRXh0cmFjdCBlbGVtZW50IG5hbWVzIGZyb20gRWxlbWVudCBvYmplY3RzXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCcpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBjb25zb2xlLmxvZygnZWxlbWVudE9wdGlvbnMnLCB0aGlzLmVsZW1lbnRPcHRpb25zKTtcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMuZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLm1hcChlbCA9PiB7XG4gICAgICAgICAgY29uc3QgbG9jYXRvclZhbHVlID0gZWwubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogbG9jYXRvclZhbHVlLCAvLyBVc2UgbG9jYXRvclZhbHVlIGFzIGlkIHNvIGl0IGdldHMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlXG4gICAgICAgICAgICBlbGVtZW50SWQ6IGVsLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsdWU6IGxvY2F0b3JWYWx1ZSwgLy8gQWxzbyBzZXQgdmFsdWUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBuYW1lOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgbGFiZWw6IGAke2VsLm5hbWV9ICgke2VsLnNjcmVlbk5hbWVPYmo/Lm5hbWUgfHwgJyd9KWAsXG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IGVsLnNjcmVlbk5hbWVJZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgICAgICBvdGhlckxvY2F0b3I6IGVsLm90aGVyTG9jYXRvclxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQsIHZhbHVlOiBvcHQsIG5hbWU6IG9wdCwgbGFiZWw6IG9wdH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnb3B0aW9uc0FycmF5Jywgb3B0aW9uc0FycmF5KTtcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJykge1xuICAgICAgY29uZmlnLnNlYXJjaGFibGUgPSB0cnVlOyAvLyBFbmFibGUgc2VhcmNoIGZvciBzZWxlY3RvciBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlRWxlbWVudHM7XG4gICAgICBjb25maWcuaXNMb2FkaW5nID0gdGhpcy5pc0xvYWRpbmdFbGVtZW50cztcbiAgICAgIGNvbmZpZy5vbkxvYWRNb3JlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRWxlbWVudHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgb25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJvblZhcmlhYmxlVmFsdWVDaGFuZ2VcIiwgdmFyaWFibGVOYW1lLCB2YWx1ZSk7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIElmIHRoaXMgaXMgYSB0ZXN0LWRhdGEgdmFyaWFibGUsIHBhcnNlIGFuZCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBkYXRhIHR5cGVcbiAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBkYXRhVHlwZTtcbiAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBkYXRhIHR5cGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpPy5zZXRWYWx1ZShkYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBcbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICAvLyBOb3RlOiBJZiB2YXJpYWJsZSBkb2Vzbid0IGV4aXN0IGluIEZvcm1BcnJheSwgaXQgc2hvdWxkIGJlIGFkZGVkIGJ5IHBhcmVudCBjb21wb25lbnRcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlQm9vbGVhbkNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbiAgXG4gIHNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBjYWxjdWxhdGlvbnNcbiAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnO1xuICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgbmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgY29uc3QgZGF0YUtleSA9IHZhcmlhYmxlLmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZSc7XG4gICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RhdGljIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVPcHRpb25zO1xuICB9XG4gIFxuICBnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVR5cGVgO1xuICAgIGlmICh0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFUeXBlJywgLy8gVXNlICdkYXRhVHlwZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVHlwZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIGdldEN1cnJlbnREYXRhVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgfVxuICBcbiAgZ2V0UmF3VmFsdWUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YXJpYWJsZS5yYXdWYWx1ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGFyYW1ldGVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgb25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgZGF0YSB0eXBlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGRhdGFUeXBlO1xuICAgIFxuICAgIC8vIENsZWFyIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZyBjYWNoZXMgc2luY2UgZGF0YSB0eXBlIGNoYW5nZWRcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2RhdGFTZXRgKTtcbiAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9wYXJhbUZvckRhdGFTZXRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52aXJvbm1lbnRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52UGFyYW1gKTtcbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgaWYgc3dpdGNoaW5nIGF3YXkgZnJvbSBwYXJhbWV0ZXIgdHlwZVxuICAgIGlmIChkYXRhVHlwZSAhPT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZW52aXJvbm1lbnQgaWYgc3dpdGNoaW5nIGF3YXkgZnJvbSBlbnZpcm9ubWVudCB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgY3VycmVudCByYXcgdmFsdWVcbiAgICBjb25zdCByYXdWYWx1ZSA9IHZhcmlhYmxlLnJhd1ZhbHVlIHx8ICcnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gbmV3IGRhdGEgdHlwZVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChhbHdheXMgc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGluIHZhcmlhYmxlKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgLy8gRm9yIHBhcmFtZXRlciB0eXBlLCBzZXQgZm9ybSBjb250cm9sIHRvIHJhdyB2YWx1ZSBzbyBzZWxlY3QgY2FuIGRpc3BsYXkgaXRcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShyYXdWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgLy8gRm9yIGVudmlyb25tZW50IHR5cGUsIGNsZWFyIHZhbHVlIGFuZCBzZWxlY3RlZEVudmlyb25tZW50XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBzZWxlY3RlZEVudmlyb25tZW50IGNvbnRyb2wgaWYgbm90IGVudmlyb25tZW50IHR5cGVcbiAgICAgIGlmIChkYXRhVHlwZSAhPT0gJ2Vudmlyb25tZW50JyAmJiB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8gcGFyYW1ldGVyIHR5cGUsIGNoZWNrIGZvciBkZWZhdWx0IHZhbHVlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZU5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIHRvIGZvcmNlIHJlY29tcHV0YXRpb24gb2YgY29uZmlncyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgdGhlIG5ldyBzZWxlY3QgY29uZmlnIGlmIG5lZWRlZFxuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBjb25maWdcbiAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBJZiBhIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGNvbnNvbGUubG9nKCdvbkRhdGFUeXBlQ2hhbmdlJywgdmFyaWFibGVOYW1lLCBkYXRhVHlwZSwgZm9ybWF0dGVkVmFsdWUpO1xuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudCB3aXRoIGZvcm1hdHRlZCB2YWx1ZVxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cbiAgXG4gIG9uRWxlbWVudFNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gT25seSBoYW5kbGUgc2VhcmNoIGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICAvLyBUaGUga2V5IHdpbGwgYmUgJ3ZhbHVlJyBzaW5jZSB0aGF0J3Mgd2hhdCB3ZSBzZXQgaW4gdGhlIGNvbmZpZ1xuICAgIC8vIEVtaXQgdGhlIHNlYXJjaCBxdWVyeSB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgcmF3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgcmF3IHZhbHVlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IGRhdGEgdHlwZVxuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWVcbiAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXMgZnJvbSBwYXJhbWV0ZXIgb3B0aW9ucyAocmF3IFRlc3REYXRhIG9iamVjdHMpXG4gICAqL1xuICBnZXRVbmlxdWVUZXN0RGF0YVByb2ZpbGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgcHJvZmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5mb3JFYWNoKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyB0ZXN0RGF0YS5uYW1lIGlzIHRoZSB0ZXN0RGF0YU5hbWUgKHByb2ZpbGUgbmFtZSlcbiAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICBpZiAocHJvZmlsZU5hbWUgJiYgIXByb2ZpbGVNYXAuaGFzKHByb2ZpbGVOYW1lKSkge1xuICAgICAgICBwcm9maWxlTWFwLnNldChwcm9maWxlTmFtZSwge1xuICAgICAgICAgIGlkOiBTdHJpbmcodGVzdERhdGEuaWQpLFxuICAgICAgICAgIG5hbWU6IHByb2ZpbGVOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb2ZpbGVzID0gQXJyYXkuZnJvbShwcm9maWxlTWFwLnZhbHVlcygpKTtcbiAgICByZXR1cm4gcHJvZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgc2V0cyBmb3IgYSBzcGVjaWZpYyB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBSZXR1cm5zIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZSdzIGRhdGEgYXJyYXlcbiAgICovXG4gIGdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZDogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBpZFxuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWQpO1xuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGVzdERhdGFQcm9maWxlIHx8ICF0ZXN0RGF0YVByb2ZpbGUuZGF0YSB8fCB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmV0dXJuIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZVxuICAgIHJldHVybiB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5tYXAoKGRhdGFTZXQ6IGFueSkgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgaW4gYSB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBFeHRyYWN0cyBwYXJhbWV0ZXIgbmFtZXMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkT3JOYW1lOiBzdHJpbmcsIGRhdGFTZXROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkIG9yIG5hbWVcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IElEIGZpcnN0IChpZiBwcm9maWxlSWRPck5hbWUgaXMgYSBudW1iZXIpXG4gICAgICBjb25zdCBpZE1hdGNoID0gIWlzTmFOKE51bWJlcihwcm9maWxlSWRPck5hbWUpKSAmJiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSk7XG4gICAgICAvLyBPdGhlcndpc2UgdHJ5IHRvIG1hdGNoIGJ5IG5hbWVcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9ICh0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZSkgPT09IHByb2ZpbGVJZE9yTmFtZTtcbiAgICAgIHJldHVybiBpZE1hdGNoIHx8IG5hbWVNYXRjaDtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNwZWNpZmljIGRhdGEgc2V0IGJ5IG5hbWVcbiAgICBjb25zdCBkYXRhU2V0ID0gdGVzdERhdGFQcm9maWxlLmRhdGEuZmluZCgoZHM6IGFueSkgPT4gZHMubmFtZSA9PT0gZGF0YVNldE5hbWUpO1xuICAgIGlmICghZGF0YVNldCB8fCAhZGF0YVNldC5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBhbGwgcGFyYW1ldGVyIGtleXMgZnJvbSB0aGUgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gT2JqZWN0LmtleXMoZGF0YVNldC5kYXRhKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyTmFtZXMubWFwKHBhcmFtTmFtZSA9PiAoe1xuICAgICAgaWQ6IHBhcmFtTmFtZSxcbiAgICAgIG5hbWU6IHBhcmFtTmFtZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIHRlc3QgZGF0YSBwcm9maWxlIGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgICovXG4gIGdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgO1xuICAgIFxuICAgIC8vIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLmdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTtcbiAgICAvLyBDcmVhdGUgb3B0aW9ucyB3aXRoIHByb2ZpbGUgbmFtZSBhbmQgSUQgKGRpc3BsYXkgbmFtZSB3aXRoIElEKVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwcm9maWxlcy5tYXAocHJvZmlsZSA9PiB7XG4gICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSB0byBnZXQgdGhlIElEXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBwcm9maWxlLm5hbWU7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQgfHwgcHJvZmlsZS5pZDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IFN0cmluZyhwcm9maWxlSWQpLFxuICAgICAgICB2YWx1ZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBuYW1lOiBgJHtwcm9maWxlLm5hbWV9YCwgLy8gRGlzcGxheSBuYW1lIHdpdGggSURcbiAgICAgICAgbGFiZWw6IGAke3Byb2ZpbGUubmFtZX1gXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiBhbmQgdXBkYXRlIGl0XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIFxuICAgICAgICAgID8gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpIFxuICAgICAgICAgIDogKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8ICcnKTtcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50VmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgcHJvZmlsZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSB2YWx1ZSBpcyBzZXQgZXZlbiBpZiBjb25maWcgd2FzIGNhY2hlZFxuICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHdoaWNoIG1hdGNoZXMgb3B0LmlkKSBpbnN0ZWFkIG9mIHByb2ZpbGUgbmFtZSAod2hpY2ggbWF0Y2hlcyBvcHQudmFsdWUpXG4gICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBwcm9maWxlIElEIGV4aXN0cyBpbiBvcHRpb25zIGJlZm9yZSBzZXR0aW5nXG4gICAgICAgIGNvbnN0IHByb2ZpbGVFeGlzdHMgPSBvcHRpb25zQXJyYXkuc29tZShvcHQgPT4gb3B0LmlkID09PSBwcm9maWxlSWRTdHJpbmcpO1xuICAgICAgICBpZiAocHJvZmlsZUV4aXN0cykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250cm9sVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sVmFsdWUgIT09IHByb2ZpbGVJZFN0cmluZykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgZm9ybSBjb250cm9sIHdpdGggSUQ6Jywge1xuICAgICAgICAgICAgICB2YXJpYWJsZU5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICAgICAgICAgIHByb2ZpbGVJZDogcHJvZmlsZUlkU3RyaW5nLFxuICAgICAgICAgICAgICBwcm9maWxlTmFtZTogdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUsXG4gICAgICAgICAgICAgIG9wdGlvbnNDb3VudDogb3B0aW9uc0FycmF5Lmxlbmd0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignU2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgbm90IGZvdW5kIGluIG9wdGlvbnM6Jywge1xuICAgICAgICAgICAgdmFyaWFibGVOYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgICAgICAgcHJvZmlsZUlkOiBwcm9maWxlSWRTdHJpbmcsXG4gICAgICAgICAgICBwcm9maWxlTmFtZTogdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUsXG4gICAgICAgICAgICBhdmFpbGFibGVPcHRpb25JZHM6IG9wdGlvbnNBcnJheS5tYXAob3B0ID0+IG9wdC5pZClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAvLyBGYWxsYmFjazogaWYgd2Ugb25seSBoYXZlIHRoZSBwcm9maWxlIG5hbWUsIGZpbmQgdGhlIG1hdGNoaW5nIG9wdGlvbiBhbmQgdXNlIGl0cyBJRFxuICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IG9wdGlvbnNBcnJheS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gbWF0Y2hpbmdPcHRpb24uaWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShtYXRjaGluZ09wdGlvbi5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIHZhcmlhYmxlJ3MgcHJvZmlsZSBJRCBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBOdW1iZXIobWF0Y2hpbmdPcHRpb24uaWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgZm9ybSBjb250cm9sIHdpdGggSUQgZnJvbSBuYW1lOicsIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVOYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgICAgICAgICBwcm9maWxlSWQ6IG1hdGNoaW5nT3B0aW9uLmlkLFxuICAgICAgICAgICAgICBwcm9maWxlTmFtZTogdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGNhY2hlIGFmdGVyIGVuc3VyaW5nIGZvcm0gY29udHJvbCBpcyBzZXRcbiAgICBpZiAodGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIHRoZSBwcm9maWxlIElEIChzdHJpbmcpIGZyb20gdGhlIG1hdC1vcHRpb25cbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgdG8gZ2V0IHRoZSBuYW1lXG4gICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlc3REYXRhLmlkID09PSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3JlIGJvdGggSUQgYW5kIG5hbWVcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlPy5uYW1lIHx8IHRlc3REYXRhUHJvZmlsZT8udGVzdERhdGFOYW1lIHx8ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3Mgc2luY2UgcHJvZmlsZSBjaGFuZ2VkXG4gICAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIGNvbmZpZ3MgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRgKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHNlbGVjdGVkIGRhdGEgc2V0IHdoZW4gcHJvZmlsZSBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBkYXRhIHNldCBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgICovXG4gIGdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCAocHJlZmVycmVkKSBvciBuYW1lIChmYWxsYmFjaylcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgXG4gICAgaWYgKCFzZWxlY3RlZFByb2ZpbGVJZCAmJiAhc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICAvLyBSZXR1cm4gZW1wdHkgY29uZmlnIGlmIG5vIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3NlbGVjdGVkRGF0YVNldCcsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmluZCBJRCBmcm9tIHByb2ZpbGUgbmFtZVxuICAgIGxldCBwcm9maWxlSWRUb1VzZTogc3RyaW5nO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVJZCkge1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIHRoZSBwcm9maWxlIElEIGZyb20gdGhlIHByb2ZpbGUgbmFtZVxuICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgfSk7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IHRlc3REYXRhUHJvZmlsZT8uaWQgPyBTdHJpbmcodGVzdERhdGFQcm9maWxlLmlkKSA6ICcnO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9maWxlIElEIGZvciBjYWNoZSBrZXkgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldF8ke3Byb2ZpbGVJZFRvVXNlIHx8IHNlbGVjdGVkUHJvZmlsZSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IGRhdGEgc2V0cyBmb3IgdGhlIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIHVzaW5nIElEXG4gICAgY29uc3QgZGF0YVNldHMgPSB0aGlzLmdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZFRvVXNlKTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gZGF0YVNldHMubWFwKGRhdGFTZXQgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICB2YWx1ZTogZGF0YVNldC5uYW1lLFxuICAgICAgbmFtZTogZGF0YVNldC5uYW1lLFxuICAgICAgbGFiZWw6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHNldCBzZWxlY3Rpb25cbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgfHwgJyc7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhU2V0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBhIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCAtIGlmIHNvLCBkaXNhYmxlIHRoZSBkcm9wZG93blxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpO1xuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IERhdGEgU2V0JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgc2VsZWN0aW9uIHdoZW4gZGF0YSBzZXQgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZyBzaW5jZSBkYXRhIHNldCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKChjb25maWdWYWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF9gKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgcGFyYW1ldGVyIGRyb3Bkb3duICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIHBhcmFtZXRlcnMgZnJvbSBzZWxlY3RlZCBkYXRhIHNldClcbiAgICovXG4gIGdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKSBhbmQgZGF0YSBzZXRcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRhU2V0ID0gdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0O1xuICAgIFxuICAgIGlmICgoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHx8ICFzZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgcHJvZmlsZSBvciBkYXRhIHNldCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IChzZWxlY3RlZFByb2ZpbGVJZCB8fCBzZWxlY3RlZFByb2ZpbGUpID8gJ1NlbGVjdCBEYXRhIFNldCBmaXJzdCcgOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gc2VsZWN0ZWRQcm9maWxlSWQgPyBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpIDogKHNlbGVjdGVkUHJvZmlsZSB8fCAnJyk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHtzZWxlY3RlZERhdGFTZXR9YDtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQgdXNpbmcgcHJvZmlsZSBJRCBvciBuYW1lXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkZW50aWZpZXIsIHNlbGVjdGVkRGF0YVNldCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBVc2UgcGFyYW0ubmFtZSBhcyBpZCAobWF0LW9wdGlvbiB3aWxsIHVzZSB0aGlzKVxuICAgICAgdmFsdWU6IGBAfCR7cGFyYW0ubmFtZX18YCwgLy8gRm9ybWF0dGVkIHZhbHVlIGZvciBkaXNwbGF5XG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBhbmQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUsIGVuc3VyZSBmb3JtIGNvbnRyb2wgbWF0Y2hlcyB0aGUgb3B0aW9uIGlkIChmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIENoZWNrIGlmIHZhbHVlIGlzIGFscmVhZHkgZm9ybWF0dGVkIChlLmcuLCBcIkB8ZW1haWx8XCIpXG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGN1cnJlbnRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgID8gY3VycmVudFZhbHVlXG4gICAgICAgIDogKGN1cnJlbnRWYWx1ZSA/IGBAfCR7Y3VycmVudFZhbHVlfXxgIDogJycpO1xuICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBmb3JtYXR0ZWQgdmFsdWUgKG1hdGNoZXMgb3B0LmlkKSBzbyBzZWxlY3QgZGlzcGxheXMgY29ycmVjdGx5XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgJiYgcGFyYW1ldGVycy5zb21lKHAgPT4gYEB8JHtwLm5hbWV9fGAgPT09IGZvcm1hdHRlZFZhbHVlKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogZmFsc2UsIC8vIENsaWVudC1zaWRlIHNlYXJjaCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYWxsIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLCAvLyBObyBwYWdpbmF0aW9uIGZvciBwYXJhbWV0ZXJzIHdpdGhpbiBhIGRhdGEgc2V0XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIHJlY2VpdmVkIGlzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgKGUuZy4sIFwiQHxlbWFpbHxcIikgYmVjYXVzZSBtYXQtb3B0aW9uIHVzZXMgb3B0LmlkXG4gICAgICAgIC8vIEV4dHJhY3QgcGFyYW1ldGVyIG5hbWUgZnJvbSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZTsgLy8gVGhpcyBpcyBhbHJlYWR5IGZvcm1hdHRlZCBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiBmb3JtYXR0ZWRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgICAgPyBmb3JtYXR0ZWRWYWx1ZS5zbGljZSgyLCAtMSlcbiAgICAgICAgICA6IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHJhdyB2YWx1ZSAoc3RvcmUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBmb3JtYXR0aW5nKVxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZSAoc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGZvciB0ZW1wbGF0ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0gdXNlIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXAgJiYgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIGZvcm1hdHRlZCB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayBhbmQgZW1pdFxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50ICh0aGlzIGlzIHdoYXQgZ2V0cyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSlcbiAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZS5uYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgZW52aXJvbm1lbnRzIGZyb20gZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKi9cbiAgZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZW52TWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZm9yRWFjaChlbnYgPT4ge1xuICAgICAgaWYgKCFlbnZNYXAuaGFzKGVudi5lbnZpcm9ubWVudCkpIHtcbiAgICAgICAgZW52TWFwLnNldChlbnYuZW52aXJvbm1lbnQsIHtcbiAgICAgICAgICBpZDogZW52LmVudmlyb25tZW50LFxuICAgICAgICAgIG5hbWU6IGVudi5lbnZpcm9ubWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnZNYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoZW52aXJvbm1lbnROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50T3B0aW9uc1xuICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudE5hbWUpXG4gICAgICAubWFwKGVudiA9PiAoe1xuICAgICAgICBpZDogZW52Lm5hbWUsXG4gICAgICAgIG5hbWU6IGVudi5uYW1lXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biAtIHNlbGVjdCBlbnZpcm9ubWVudClcbiAgICovXG4gIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2Vudmlyb25tZW50YDtcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHNcbiAgICBjb25zdCB1bmlxdWVFbnZpcm9ubWVudHMgPSB0aGlzLmdldFVuaXF1ZUVudmlyb25tZW50cygpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSB1bmlxdWVFbnZpcm9ubWVudHMubWFwKGVudiA9PiAoe1xuICAgICAgaWQ6IGVudi5pZCxcbiAgICAgIHZhbHVlOiBlbnYubmFtZSxcbiAgICAgIG5hbWU6IGVudi5uYW1lLFxuICAgICAgbGFiZWw6IGVudi5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVudmlyb25tZW50IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RW52ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50RW52KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZEVudmlyb25tZW50JywgLy8gVXNlICdzZWxlY3RlZEVudmlyb25tZW50JyBhcyBrZXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0IEVudmlyb25tZW50YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbnZpcm9ubWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52aXJvbm1lbnRzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIGVudmlyb25tZW50IG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRCBmcm9tIGVudmlyb25tZW50T3B0aW9uc1xuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBvcHRpb24gd2l0aCBtYXRjaGluZyBlbnZpcm9ubWVudCBuYW1lIHRvIGdldCB0aGUgSURcbiAgICAgICAgY29uc3QgZW52T3B0aW9uID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmluZChlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IG51bWVyaWMgSUQgZnJvbSBlbnZPcHRpb24uaWQgKGZvcm1hdDogXCJlbnYtNzQtdGVzdFwiIC0+IDc0KVxuICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgICAgaWYgKGlkTWF0Y2ggJiYgaWRNYXRjaFsxXSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkRW52aXJvbm1lbnQgY29udHJvbFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIG5ldyBlbnZpcm9ubWVudFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gdXBkYXRlIFVJXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoRW52aXJvbm1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIC0gc2VsZWN0IHBhcmFtZXRlciBmcm9tIGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBzZWxlY3RlZEVudmlyb25tZW50ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudDtcbiAgICBpZiAoIXNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRW52aXJvbm1lbnQgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcGFyYW1ldGVycyBmb3IgdGhlIHNlbGVjdGVkIGVudmlyb25tZW50XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckVudmlyb25tZW50KHNlbGVjdGVkRW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiAoe1xuICAgICAgaWQ6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIHZhbHVlOiBgKnwke3BhcmFtLm5hbWV9fGAsXG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgUGFyYW1ldGVyYCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFdoZW4gcGFyYW1ldGVyIGlzIHNlbGVjdGVkLCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBmb3JtYXQgaXRcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnZpcm9ubWVudCBJRCBpcyBhbHJlYWR5IHN0b3JlZCBvbiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWRcbiAgICAgICAgLy8gKGl0IHdhcyBzZXQgd2hlbiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQpXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAtIGtlZXAgcmF3IHZhbHVlIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIHJhdyB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAvLyBFbWl0IGZvcm1hdHRlZCB2YWx1ZSBmb3IgcGFyZW50IGNvbXBvbmVudFxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRW52aXJvbm1lbnQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBJRCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudElkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW52aXJvbm1lbnQgSURzIGZvciB2YXJpYWJsZXMgdGhhdCB1c2UgZW52aXJvbm1lbnQgdHlwZVxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIHZhcmlhYmxlIG5hbWUgdG8gZW52aXJvbm1lbnQgSURcbiAgICovXG4gIGdldEVudmlyb25tZW50SWRzRm9yVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IGVudklkcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpIHtcbiAgICAgICAgZW52SWRzLnNldCh2YXJpYWJsZS5uYW1lLCB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlbnZJZHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGxhaW4tdGV4dFxuICAgKi9cbiAgaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGxhaW4tdGV4dCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGFyYW1ldGVyXG4gICAqL1xuICBpc1BhcmFtZXRlclR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGRhdGEgc2V0IGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHNldCAoZnJvbSB0ZXN0IGNhc2UpXG4gICAqIElmIHRydWUsIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGRyb3Bkb3ducyBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIGhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgZW52aXJvbm1lbnRcbiAgICovXG4gIGlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICB9XG5cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcnVudGltZVxuICAgKi9cbiAgaXNSdW50aW1lVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3J1bnRpbWUnO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLXgtNiBjcWEtZ2FwLXktNCBjcWEtZmxleC13cmFwIHRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXCIgW25nQ2xhc3NdPVwieydjcWEtZmxleC1jb2wnOiBpc0VkaXRJbkRlcHRofVwiICpuZ0lmPVwiIWNyZWF0ZUVsZW1lbnRWaXNpYmxlXCI+XG4gIFxuICA8IS0tIE1ldGFkYXRhIC0gT25seSBzaG93IGlmIGVsZW1lbnQgaXMgYXZhaWxhYmxlIGluIGZvcm0gLS0+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgTWV0YWRhdGFcbiAgICA8L2xhYmVsPlxuICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwibWV0YWRhdGFcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm1ldGFkYXRhQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBEZXNjcmlwdGlvblxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJkZXNjcmlwdGlvblwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cbiAgXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIHRlbXBsYXRlVmFyaWFibGVzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmFyaWFibGVcIj5cbiAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtjaGVja2VkXT1cInZhcmlhYmxlc0Zvcm0uYXQoaSk/LmdldCgndmFsdWUnKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50LmNoZWNrZWQpXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBOb24tYm9vbGVhbiwgbm9uLWN1c3RvbV9jb2RlIHZhcmlhYmxlcyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbidcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpOyBlbHNlIGRlZmF1bHRJbnB1dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dD5cbiAgICAgICAgPCEtLSBUZXN0LWRhdGEsIHNvdXJjZS12YWx1ZSwgb3IgdGFyZ2V0LXZhbHVlIHdpdGggZGF0YSB0eXBlIGRyb3Bkb3duIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSByZWd1bGFySW5wdXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19IFR5cGVcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBOYW1lXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkRW52aXJvbm1lbnQodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgIEVudmlyb25tZW50IFZhbHVlXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBUZXN0IERhdGEgUHJvZmlsZVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXRcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWREYXRhU2V0KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlKSB8fCBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSAgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8IS0tIFNob3cgY3VzdG9tIGlucHV0IGZvciBwbGFpbi10ZXh0IHR5cGUgLS0+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImdldFJhd1ZhbHVlKHZhcmlhYmxlKVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRlc3REYXRhVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNyZWd1bGFySW5wdXQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICA8Y3FhLWVsZW1lbnQtZm9ybVxuICAgIFtpc0NyZWF0ZU1vZGVdPVwidHJ1ZVwiXG4gICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICBbaXNFZGl0SW5EZXB0aEF2YWlsYWJsZV09XCJmYWxzZVwiXG4gICAgKGNyZWF0ZUVsZW1lbnQpPVwib25DcmVhdGVFbGVtZW50KCRldmVudClcIlxuICAgIChjYW5jZWwpPVwib25DYW5jZWxFbGVtZW50Rm9ybSgpXCJcbiAgICAoc2VhcmNoU2NyZWVuTmFtZSk9XCJzZWFyY2hTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIj5cbiAgPC9jcWEtZWxlbWVudC1mb3JtPlxuPC9kaXY+Il19
|
|
1925
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUE2Q25FLE1BQU0sT0FBTyw4QkFBOEI7SUE4RnpDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0ZqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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QU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkE0Q0Usb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbGVtZW50Q3JlYXRlUGF5bG9hZCwgU2NyZWVuTmFtZU9wdGlvbiB9IGZyb20gJy4uLy4uL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC1mb3JtLWRhdGEnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7XG4gIHNjcmVlbk5hbWVPYmo/OiBhbnk7IC8vIEZpeGVkOiB1c2UgJ2FueScgc2luY2UgJ0VsZW1lbnRTY3JlZW5OYW1lJyBpcyBub3QgZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlVmFyaWFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGFLZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xuICAvLyBBZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIG1hbmFnaW5nIHZhcmlhYmxlIHN0YXRlXG4gIGRhdGFUeXBlPzogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnO1xuICByYXdWYWx1ZT86IHN0cmluZzsgLy8gUmF3IHZhbHVlIHdpdGhvdXQgZm9ybWF0dGluZyAoZm9yIHNlbGVjdCBkcm9wZG93bnMpXG4gIHNlbGVjdGVkRW52aXJvbm1lbnQ/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGVudmlyb25tZW50IG5hbWUgKGZvciBlbnZpcm9ubWVudCB0eXBlKVxuICBzZWxlY3RlZEVudmlyb25tZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVudmlyb25tZW50IElEIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIG5hbWUgKGZvciBwYXJhbWV0ZXIgdHlwZSlcbiAgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgKGZvciBwYXJhbWV0ZXIgdHlwZSlcbiAgc2VsZWN0ZWREYXRhU2V0Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBkYXRhIHNldCBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkU2NyZWVuTmFtZT86IHN0cmluZzsgLy8gU2VsZWN0ZWQgc2NyZWVuIG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIHNjcmVlbk5hbWVJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgc2NyZWVuIG5hbWUgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgZWxlbWVudCBJRCAoZm9yIGVsZW1lbnQgdHlwZSlcbiAgZWxlbWVudExvY2F0b3I/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGVsZW1lbnQgbG9jYXRvciB2YWx1ZSAoZm9yIGVsZW1lbnQgdHlwZSlcbiAgZWxlbWVudE5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGVsZW1lbnQgbmFtZSAoZm9yIGVsZW1lbnQgdHlwZSlcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVZhcmlhYmxlc0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0ZW1wbGF0ZVZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdID0gW107XG4gIEBJbnB1dCgpIHZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xuICBASW5wdXQoKSBtZXRhZGF0YTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZWxlbWVudE9wdGlvbnM6IEVsZW1lbnRbXSA9IFtdOyAvLyBFbGVtZW50IG9iamVjdHMgZm9yIGVsZW1lbnQgZHJvcGRvd25cbiAgQElucHV0KCkgaGFzTW9yZUVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7IC8vIFdoZXRoZXIgbW9yZSBlbGVtZW50cyBhcmUgYXZhaWxhYmxlXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0VsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7IC8vIExvYWRpbmcgc3RhdGUgZm9yIGVsZW1lbnRzXG4gIC8qKiBTY3JlZW4gbmFtZSBvcHRpb25zIGZvciBlbGVtZW50IGZvcm0gYXV0b2NvbXBsZXRlIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IFNjcmVlbk5hbWVPcHRpb25bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHNjcmVlbiBuYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHNjcmVlbiBuYW1lcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRlc3QgZGF0YSBwcm9maWxlcyBmb3IgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgLSByYXcgVGVzdERhdGEgb2JqZWN0cyAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gdXNpbmcgYW55IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgLyoqIFdoZXRoZXIgbW9yZSBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBwYXJhbWV0ZXJzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBFbnZpcm9ubWVudCBvcHRpb25zIGZvciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIGVudmlyb25tZW50cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZUVudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBlbnZpcm9ubWVudHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCBmcm9tIHRlc3QgY2FzZSAoaWYgYXZhaWxhYmxlLCBwcm9maWxlIGFuZCBkYXRhIHNldCBkcm9wZG93bnMgd2lsbCBiZSBkaXNhYmxlZCkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgc3RhcnQgaW5kZXggZnJvbSB0ZXN0IGNhc2UgKGRhdGEgc2V0IGluZGV4IGluIHRoZSBwcm9maWxlKSAqL1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBpc0VkaXRJbkRlcHRoOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBAT3V0cHV0KCkgdmFyaWFibGVWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHZhcmlhYmxlQm9vbGVhbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBtZXRhZGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBsb2FkIG1vcmUgaXMgcmVxdWVzdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZWxlbWVudHNcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNjcmVlbk5hbWVJZDogbnVtYmVyOyBzZWFyY2hUZXJtPzogc3RyaW5nIH0+KCk7IC8vIEVtaXQgd2hlbiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RWxlbWVudENyZWF0ZVBheWxvYWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCBwYXlsb2FkXG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGNyZWF0ZSBhIG5ldyBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgY2FuY2VsRWxlbWVudEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGZvcm0gaXMgY2FuY2VsbGVkXG4gIEBPdXRwdXQoKSBlbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGZvcm0gdmlzaWJpbGl0eSBjaGFuZ2VzXG4gIFxuICAvLyBDYWNoZSBmb3Igc2VsZWN0IGNvbmZpZ3MgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHByaXZhdGUgc2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZGF0YSB0eXBlIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBzY3JlZW4gbmFtZSBzZWxlY3QgY29uZmlncyAoZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICBwcml2YXRlIHNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbGVtZW50IHNlbGVjdCBjb25maWdzIChmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZSlcbiAgcHJpdmF0ZSBlbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0IGNvbmZpZ3MgKGZpcnN0IGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICBwcml2YXRlIHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGRhdGEgc2V0IHNlbGVjdCBjb25maWdzIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICBwcml2YXRlIGRhdGFTZXRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3MgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICBwcml2YXRlIHBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgbmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNob3VsZFNob3dEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIFByZS1jb21wdXRlZCBkYXRhIHR5cGUgb3B0aW9ucyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3BsYWluLXRleHQnLCB2YWx1ZTogJ3BsYWluLXRleHQnLCBuYW1lOiAnUGxhaW4gVGV4dCcsIGxhYmVsOiAnUGxhaW4gVGV4dCcgfSxcbiAgICB7IGlkOiAncGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInLCBuYW1lOiAnQHxQYXJhbWV0ZXJ8JywgbGFiZWw6ICdAfFBhcmFtZXRlcnwnIH0sXG4gICAgeyBpZDogJ3J1bnRpbWUnLCB2YWx1ZTogJ3J1bnRpbWUnLCBuYW1lOiAnJHxSdW50aW1lfCcsIGxhYmVsOiAnJHxSdW50aW1lfCcgfSxcbiAgICB7IGlkOiAnZW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JywgbmFtZTogJyp8RW52aXJvbm1lbnR8JywgbGFiZWw6ICcqfEVudmlyb25tZW50fCcgfVxuICBdO1xuXG4gIEBJbnB1dCgpIGNyZWF0ZUVsZW1lbnRWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25DcmVhdGVFbGVtZW50KHBheWxvYWQ6IEVsZW1lbnRDcmVhdGVQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50LmVtaXQocGF5bG9hZCk7XG4gICAgdGhpcy5lbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNhbmNlbEVsZW1lbnRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1sndmFyaWFibGVzRm9ybSddIHx8IGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgXG4gICAgICAgIGNoYW5nZXNbJ2hhc01vcmVFbGVtZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0VsZW1lbnRzJ10gfHxcbiAgICAgICAgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVQYXJhbWV0ZXJzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nUGFyYW1ldGVycyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbnZpcm9ubWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbnZpcm9ubWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgIFxuICAgICAgLy8gT25seSBjbGVhciBjYWNoZXMgZm9yIGNoYW5nZWQgaW5wdXRzLCBub3QgYWxsIGNhY2hlc1xuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gfHwgY2hhbmdlc1sndmFyaWFibGVzRm9ybSddKSB7XG4gICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZXMgd2hlbiB0ZW1wbGF0ZSB2YXJpYWJsZXMgb3IgZm9ybSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBlbGVtZW50IGFuZCBzY3JlZW4gbmFtZSBjYWNoZXMgb25seSB3aGVuIHRoZWlyIG9wdGlvbnMgY2hhbmdlXG4gICAgICBpZiAoY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRWxlbWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbGVtZW50cyddKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydzY3JlZW5OYW1lT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVTY3JlZW5OYW1lcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1NjcmVlbk5hbWVzJ10pIHtcbiAgICAgICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlUGFyYW1ldGVycyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1BhcmFtZXRlcnMnXSkge1xuICAgICAgICB0aGlzLnBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbnZpcm9ubWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbnZpcm9ubWVudHMnXSkge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgZGF0YSB0eXBlcyBhbmQgcmF3IHZhbHVlcyBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlc1xuICAgICAgLy8gQWxzbyByZS1pbml0aWFsaXplIGlmIGRlZmF1bHQgdmFsdWVzIG9yIHBhcmFtZXRlck9wdGlvbnMgY2hhbmdlICh0byBzZXQgZGVmYXVsdCBzZWxlY3Rpb25zKVxuICAgICAgaWYgKChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSB8fCBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgdGVtcGxhdGVWYXJpYWJsZXMgY2hhbmdlZCwgaW5pdGlhbGl6ZSBzY3JlZW4gbmFtZSBmb3JtIGNvbnRyb2xzIGZvciBlbGVtZW50IHZhcmlhYmxlcyB0aGF0IGhhdmUgc2NyZWVuTmFtZUlkXG4gICAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JlZW4gbmFtZSBmb3JtIGNvbnRyb2wgd2l0aCBzY3JlZW5OYW1lSWQgKHNpbmNlIHZhbHVlQnkgaXMgJ3NjcmVlbk5hbWVJZCcpXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2wodmFyaWFibGUuc2NyZWVuTmFtZUlkKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiBpdCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUodmFyaWFibGUuc2NyZWVuTmFtZUlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjcmVlbk5hbWVJZCBidXQgbm90IHNlbGVjdGVkU2NyZWVuTmFtZSwgZmluZCBpdCBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lICYmIHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBtYXRjaGluZ1NjcmVlbk5hbWUubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzY3JlZW5OYW1lT3B0aW9ucyBjaGFuZ2VkLCB1cGRhdGUgc2VsZWN0ZWRTY3JlZW5OYW1lIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkICYmICF2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1NjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWxlbWVudE9wdGlvbnMgb3Igc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHZhcmlhYmxlc1xuICAgICAgaWYgKChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHRvIGZvcmNlIHJlY29tcHV0YXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBlbGVtZW50cyBhcmUgbG9hZGVkIGFmdGVyIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiwgdGhlIGNvbmZpZyBpcyByZWNvbXB1dGVkXG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCBpZiBhdmFpbGFibGUgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YXJpYWJsZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAyOiBGaW5kIGJ5IGVsZW1lbnROYW1lIGlmIGF2YWlsYWJsZSAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5uYW1lID09PSB2YXJpYWJsZS5lbGVtZW50TmFtZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDM6IEZpbmQgYnkgbG9jYXRvclZhbHVlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5sb2NhdG9yVmFsdWUgPT09IGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHNjcmVlbiBuYW1lIGluZm8gZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVJZCAmJiBlbGVtZW50LnNjcmVlbk5hbWVPYmopIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IGVsZW1lbnQuc2NyZWVuTmFtZU9iai5uYW1lO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gZWxlbWVudC5zY3JlZW5OYW1lSWQ7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAvLyBTaW5jZSB2YWx1ZUJ5IGlzICdzY3JlZW5OYW1lSWQnLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBzY3JlZW5OYW1lSWQgKG51bWJlcikgaW4gdGhlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woZWxlbWVudC5zY3JlZW5OYW1lSWQpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoZWxlbWVudC5zY3JlZW5OYW1lSWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGFsbCBjb25maWdzIHRvIGF2b2lkIGNhbGxpbmcgbWV0aG9kcyBpbiB0ZW1wbGF0ZVxuICAgICAgLy8gVGhpcyB3aWxsIHJlY29tcHV0ZSBlbGVtZW50IGNvbmZpZ3Mgd2l0aCB0aGUgbmV3IGVsZW1lbnRPcHRpb25zXG4gICAgICAvLyBPbmx5IHByZWNvbXB1dGUgaWYgdGVtcGxhdGVWYXJpYWJsZXMgZXhpc3QgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucHJlY29tcHV0ZUNvbmZpZ3MoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciByZWNvbXB1dGluZyBjb25maWdzIChvbmx5IG9uY2UgYXQgdGhlIGVuZClcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgXG4gICAgICAvLyBJZiBlbnZpcm9ubWVudCBvcHRpb25zIGNoYW5nZWQgYW5kIHdlIGhhdmUgc2VsZWN0ZWQgZW52aXJvbm1lbnRzLCByZWZyZXNoIHBhcmFtZXRlciBjb25maWdzXG4gICAgICBpZiAoY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10pIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlLm5hbWV9X2VudlBhcmFtYCk7XG4gICAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgcGFyYW1ldGVyIG9wdGlvbnMgY2hhbmdlZCBhbmQgd2UgaGF2ZSBkZWZhdWx0IHZhbHVlcywgdHJ5IHRvIGluaXRpYWxpemUgdGhlbVxuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBub3cgdGhhdCBwYXJhbWV0ZXJPcHRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgcGFyYW1ldGVyIG9wdGlvbnMgY2hhbmdlZCBhbmQgd2UgaGF2ZSBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZXMsIHJlZnJlc2ggY29uZmlnc1xuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgICAgLy8gQ2xlYXIgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0IGNvbmZpZyBjYWNoZSBzaW5jZSBwcm9maWxlcyBsaXN0IG1heSBoYXZlIGNoYW5nZWRcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1BhcmFtZXRlclR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUgZm9yIGNhY2hlIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHt2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAvLyBTZXQgcHJvcGVydGllcyBkaXJlY3RseSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZGF0YSB0eXBlIGluIHRoZSBGb3JtQXJyYXlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHBhcmFtZXRlciB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgcGFyYW1ldGVyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVOYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERvbid0IHNldCBwYXJhbWV0ZXIgdmFsdWUgeWV0IC0gdXNlciB3aWxsIHNlbGVjdCBpdFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIGNvbmZpZ3Mgd2l0aCBuZXcgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgdmFyaWFibGUgdG8gZW5zdXJlIGZyZXNoIGNvbmZpZ3NcbiAgICAgICAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBjYWNoZSAtIG5lZWQgdG8gY2xlYXIgYWxsIHBvc3NpYmxlIGtleXMgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3QgZm9ybWF0XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBjYWNoZSAtIG5lZWQgdG8gY2xlYXIgYWxsIHBvc3NpYmxlIGtleXNcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbUtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZGVmYXVsdCB2YWx1ZXMgLSB1c2UgZXhpc3RpbmcgbG9naWMgdG8gZmluZCBmcm9tIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIHRoaXMgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIHRlc3QgZGF0YSBwcm9maWxlcyBhbmQgdGhlaXIgZGF0YSBzZXRzXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kUHJvZmlsZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmREYXRhU2V0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGVzdERhdGFQcm9maWxlIG9mIHRoaXMucGFyYW1ldGVyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHRlc3REYXRhUHJvZmlsZS5kYXRhICYmIHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyBpbiB0aGlzIHByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhU2V0IG9mIHRlc3REYXRhUHJvZmlsZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhICYmIGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZERhdGFTZXQgPSBkYXRhU2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRQcm9maWxlICYmIGZvdW5kRGF0YVNldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBmb3VuZFByb2ZpbGUubmFtZSB8fCBmb3VuZFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBmb3VuZERhdGFTZXQubmFtZTtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSBwcm9maWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBmb3VuZFByb2ZpbGUuaWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChwcm9maWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVOYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBwYXJhbSBuYW1lIChmb3IgZHJvcGRvd24gZGlzcGxheSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1OYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseSBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHBhcmFtTmFtZSwgJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgbm90IGZvdW5kLCBmb3JtYXQgdGhlIHJhdyB2YWx1ZSBpZiBpdCdzIGEgcGFyYW1ldGVyIHR5cGVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3QgZW52aXJvbm1lbnQgYW5kIHBhcmFtZXRlclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQgdmFsdWVzIGFyZSBpbiBmb3JtYXQgKnxwYXJhbWV0ZXJOYW1lfFxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIHdoaWNoIGVudmlyb25tZW50IHRoaXMgcGFyYW1ldGVyIGJlbG9uZ3MgdG9cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJhd1ZhbHVlO1xuICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSkge1xuICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbnZpcm9ubWVudCB0aGF0IGNvbnRhaW5zIHRoaXMgcGFyYW1ldGVyXG4gICAgICAgICAgICAgIGNvbnN0IGVudk9wdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmZpbmQoZW52ID0+IGVudi5uYW1lID09PSBwYXJhbU5hbWUpO1xuICAgICAgICAgICAgICBpZiAoZW52T3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IGVudk9wdGlvbi5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRFxuICAgICAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgICAgICAgICAgaWYgKGlkTWF0Y2ggJiYgaWRNYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGVudk9wdGlvbi5lbnZpcm9ubWVudCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZShlbnZPcHRpb24uZW52aXJvbm1lbnQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoYCp8JHtwYXJhbU5hbWV9fGAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIGVsZW1lbnQgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3Qgc2NyZWVuIG5hbWUgYW5kIGVsZW1lbnRcbiAgICAgICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByaW9yaXR5IDE6IEZpbmQgYnkgZWxlbWVudElkIGlmIGF2YWlsYWJsZSAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMjogRmluZCBieSBlbGVtZW50TmFtZSBpZiBhdmFpbGFibGUgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5uYW1lID09PSB2YXJpYWJsZS5lbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByaW9yaXR5IDM6IEZpbmQgYnkgbG9jYXRvclZhbHVlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5sb2NhdG9yVmFsdWUgPT09IGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2NyZWVuTmFtZUlkICYmIGVsZW1lbnQuc2NyZWVuTmFtZU9iaikge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IGVsZW1lbnQuc2NyZWVuTmFtZU9iai5uYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgLy8gU2luY2UgdmFsdWVCeSBpcyAnc2NyZWVuTmFtZUlkJywgd2UgbmVlZCB0byBzdG9yZSB0aGUgc2NyZWVuTmFtZUlkIChudW1iZXIpIGluIHRoZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woZWxlbWVudC5zY3JlZW5OYW1lSWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShlbGVtZW50LnNjcmVlbk5hbWVJZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gRm9yIHNlbGVjdG9yLCB1c2UgZWxlbWVudExvY2F0b3IgYXMgdmFsdWU7IGZvciBvdGhlcnMsIHVzZSBlbGVtZW50TmFtZVxuICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YXJpYWJsZS52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2woZWxlbWVudC5pZCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShlbGVtZW50LmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgLy8gS2VlcCBlbGVtZW50SWQgYW5kIGVsZW1lbnROYW1lIGlmIHRoZXkgZXhpc3QgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudElkIGJ1dCBlbGVtZW50IGlzbid0IGZvdW5kLCB3ZSBtaWdodCBuZWVkIHRvIGZldGNoIGVsZW1lbnRzXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBhZ2FpbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdmlhIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBmb3IgYSB2YXJpYWJsZSBieSBuYW1lIGZyb20gRm9ybUFycmF5ICovXG4gIGdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IChjb250cm9sIGFzIEZvcm1Hcm91cCkuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgYXQgYSBzcGVjaWZpYyBpbmRleCBmcm9tIEZvcm1BcnJheSAoZm9yIHRlbXBsYXRlIHVzZSkgKi9cbiAgZ2V0Rm9ybUdyb3VwQXQoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy52YXJpYWJsZXNGb3JtLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVzRm9ybS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwcmVjb21wdXRlQ29uZmlncygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHJldHVybjtcbiAgICBcbiAgICAvLyBQcmUtY29tcHV0ZSBhbGwgc2VsZWN0IGNvbmZpZ3NcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgLy8gUHJlLWNvbXB1dGUgcmVndWxhciBzZWxlY3QgY29uZmlnc1xuICAgICAgaWYgKHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcmUtY29tcHV0ZSBkYXRhIHR5cGUgc2VsZWN0IGNvbmZpZ3NcbiAgICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhpcy5nZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBwYXJhbWV0ZXIgYW5kIGVudmlyb25tZW50IHNlbGVjdCBjb25maWdzIGlmIG5lZWRlZFxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgIHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGUgZGF0YSBzZXQgY29uZmlnIGlmIHRlc3QgZGF0YSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgLy8gUHJlLWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZyBpZiBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIFByZS1jb21wdXRlIGVudmlyb25tZW50IHBhcmFtZXRlciBjb25maWcgaWYgZW52aXJvbm1lbnQgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGVsZW1lbnQgdmFyaWFibGUgY29uZmlncyAoc2NyZWVuIG5hbWUgKyBlbGVtZW50KVxuICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhpcy5nZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIGVsZW1lbnQgY29uZmlnIGlmIHNjcmVlbiBuYW1lIGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSkge1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgcGFyc2VUZXN0RGF0YVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcsIHJhd1ZhbHVlOiBzdHJpbmcgfSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BsYWluLXRleHQnLCByYXdWYWx1ZTogJycgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHBhcmFtZXRlciBmb3JtYXQ6IEB8dmFsdWV8XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwYXJhbWV0ZXInLCByYXdWYWx1ZTogdmFsdWUuc2xpY2UoMiwgLTEpIH07XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBydW50aW1lIGZvcm1hdDogJHx2YWx1ZXxcbiAgICBlbHNlIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncnVudGltZScsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIGVudmlyb25tZW50IGZvcm1hdDogKnx2YWx1ZXxcbiAgICBlbHNlIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAnZW52aXJvbm1lbnQnLCByYXdWYWx1ZTogdmFsdWUuc2xpY2UoMiwgLTEpIH07XG4gICAgfVxuICAgIC8vIFBsYWluIHRleHQgKG5vIGZvcm1hdHRpbmcpXG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BsYWluLXRleHQnLCByYXdWYWx1ZTogdmFsdWUgfTtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZTogc3RyaW5nLCBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnKTogc3RyaW5nIHtcbiAgICBpZiAoIXJhd1ZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIFxuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgIGNhc2UgJ3BhcmFtZXRlcic6XG4gICAgICAgIHJldHVybiBgQHwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAncnVudGltZSc6XG4gICAgICAgIHJldHVybiBgJHwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAnZW52aXJvbm1lbnQnOlxuICAgICAgICByZXR1cm4gYCp8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ3BsYWluLXRleHQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJhd1ZhbHVlO1xuICAgIH1cbiAgfVxuICBcbiAgdHJhY2tCeVZhcmlhYmxlKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYW55IHtcbiAgICByZXR1cm4gdmFyaWFibGUubmFtZSB8fCBpbmRleDtcbiAgfVxuICBcbiAgZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgLy8gRm9yIGVsZW1lbnQgdmFyaWFibGVzLCBpbmNsdWRlIGVsZW1lbnRPcHRpb25zLCBoYXNNb3JlRWxlbWVudHMsIGFuZCBpc0xvYWRpbmdFbGVtZW50cyBpbiBjYWNoZSBrZXlcbiAgICAvLyBPcHRpbWl6ZSBjYWNoZSBrZXkgY29tcHV0YXRpb24gLSB1c2UgbGVuZ3RoIGluc3RlYWQgb2YgZnVsbCBhcnJheSBqb2luIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBvcHRpb25zS2V5ID0gdmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCdcbiAgICAgID8gYCR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5tYXAoZWwgPT4gZWwuaWQgfHwgJycpLmpvaW4oJywnKX1gIFxuICAgICAgOiBgJHt2YXJpYWJsZS5vcHRpb25zPy5sZW5ndGggfHwgMH1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICAvLyBJbmNsdWRlIGhhc01vcmVFbGVtZW50cyBhbmQgaXNMb2FkaW5nRWxlbWVudHMgaW4gY2FjaGUga2V5IGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnXG4gICAgICA/IGAke3ZhcmlhYmxlLm5hbWV9XyR7b3B0aW9uc0tleX1fJHt0aGlzLmhhc01vcmVFbGVtZW50c31fJHt0aGlzLmlzTG9hZGluZ0VsZW1lbnRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGlmIHZhcmlhYmxlIG5hbWUgaXMgJ3NlbGVjdG9yJywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgLy8gRXh0cmFjdCBlbGVtZW50IG5hbWVzIGZyb20gRWxlbWVudCBvYmplY3RzXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCcpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBvcHRpb25zQXJyYXkgPSB0aGlzLmVsZW1lbnRPcHRpb25zXG4gICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGxvY2F0b3JWYWx1ZSwgLy8gVXNlIGxvY2F0b3JWYWx1ZSBhcyBpZCBzbyBpdCBnZXRzIHJldHVybmVkIGFzIHRoZSB2YWx1ZVxuICAgICAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiBsb2NhdG9yVmFsdWUsIC8vIEFsc28gc2V0IHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgbmFtZTogYCR7ZWwubmFtZX0gKCR7ZWwuc2NyZWVuTmFtZU9iaj8ubmFtZSB8fCAnJ30pYCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICAgICAgb3RoZXJMb2NhdG9yOiBlbC5vdGhlckxvY2F0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uc0FycmF5ID0gdmFyaWFibGUub3B0aW9ucz8ubWFwKG9wdCA9PiB7cmV0dXJuIHtpZDogb3B0LCB2YWx1ZTogb3B0LCBuYW1lOiBvcHQsIGxhYmVsOiBvcHR9fSkgYXMgU2VsZWN0T3B0aW9uW10gfHwgW107XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICd2YWx1ZScsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIC8vIEFkZCBsb2FkIG1vcmUgYW5kIHNlYXJjaCBzdXBwb3J0IGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCcpIHtcbiAgICAgIGNvbmZpZy5zZWFyY2hhYmxlID0gdHJ1ZTsgLy8gRW5hYmxlIHNlYXJjaCBmb3Igc2VsZWN0b3IgZHJvcGRvd25cbiAgICAgIGNvbmZpZy5zZXJ2ZXJTZWFyY2ggPSB0cnVlOyAvLyBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoXG4gICAgICBjb25maWcuaGFzTW9yZSA9IHRoaXMuaGFzTW9yZUVsZW1lbnRzO1xuICAgICAgY29uZmlnLmlzTG9hZGluZyA9IHRoaXMuaXNMb2FkaW5nRWxlbWVudHM7XG4gICAgICBjb25maWcub25Mb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH07XG4gICAgICBjb25maWcub25TZWFyY2ggPSAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBFbWl0IHNlYXJjaCBldmVudCB3aGVuIHVzZXIgdHlwZXMgaW4gdGhlIHNlYXJjaCBib3hcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICghdmFyaWFibGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBJZiB0aGlzIGlzIGEgdGVzdC1kYXRhIHZhcmlhYmxlLCBwYXJzZSBhbmQgdXBkYXRlIHJhdyB2YWx1ZSBhbmQgZGF0YSB0eXBlXG4gICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgY29uc3QgeyBkYXRhVHlwZSwgcmF3VmFsdWUgfSA9IHRoaXMucGFyc2VUZXN0RGF0YVZhbHVlKHZhbHVlIHx8ICcnKTtcbiAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgZGF0YSB0eXBlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgfVxuICBcbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gTm90ZTogSWYgdmFyaWFibGUgZG9lc24ndCBleGlzdCBpbiBGb3JtQXJyYXksIGl0IHNob3VsZCBiZSBhZGRlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZUJvb2xlYW5DaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMgKGRhdGFLZXkgPT09ICdlbGVtZW50JyksIHdlIHVzZSBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgLy8gU28gcmV0dXJuIGZhbHNlIHRvIHVzZSB0aGUgY2FzY2FkaW5nIGRyb3Bkb3duIHBhdHRlcm5cbiAgICBjb25zdCByZXN1bHQgPSB2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnO1xuICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgbmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgY29uc3QgZGF0YUtleSA9IHZhcmlhYmxlLmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZSc7XG4gICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RhdGljIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVPcHRpb25zO1xuICB9XG4gIFxuICBnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVR5cGVgO1xuICAgIGlmICh0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFUeXBlJywgLy8gVXNlICdkYXRhVHlwZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVHlwZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIGdldEN1cnJlbnREYXRhVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgfVxuICBcbiAgZ2V0UmF3VmFsdWUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YXJpYWJsZS5yYXdWYWx1ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGFyYW1ldGVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgb25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgZGF0YSB0eXBlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGRhdGFUeXBlO1xuICAgIFxuICAgIC8vIENsZWFyIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZyBjYWNoZXMgc2luY2UgZGF0YSB0eXBlIGNoYW5nZWRcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2RhdGFTZXRgKTtcbiAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9wYXJhbUZvckRhdGFTZXRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52aXJvbm1lbnRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52UGFyYW1gKTtcbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgaWYgc3dpdGNoaW5nIGF3YXkgZnJvbSBwYXJhbWV0ZXIgdHlwZVxuICAgIGlmIChkYXRhVHlwZSAhPT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZW52aXJvbm1lbnQgaWYgc3dpdGNoaW5nIGF3YXkgZnJvbSBlbnZpcm9ubWVudCB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgY3VycmVudCByYXcgdmFsdWVcbiAgICBjb25zdCByYXdWYWx1ZSA9IHZhcmlhYmxlLnJhd1ZhbHVlIHx8ICcnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gbmV3IGRhdGEgdHlwZVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChhbHdheXMgc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGluIHZhcmlhYmxlKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgLy8gRm9yIHBhcmFtZXRlciB0eXBlLCBzZXQgZm9ybSBjb250cm9sIHRvIHJhdyB2YWx1ZSBzbyBzZWxlY3QgY2FuIGRpc3BsYXkgaXRcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShyYXdWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgICAgLy8gRm9yIGVudmlyb25tZW50IHR5cGUsIGNsZWFyIHZhbHVlIGFuZCBzZWxlY3RlZEVudmlyb25tZW50XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBzZWxlY3RlZEVudmlyb25tZW50IGNvbnRyb2wgaWYgbm90IGVudmlyb25tZW50IHR5cGVcbiAgICAgIGlmIChkYXRhVHlwZSAhPT0gJ2Vudmlyb25tZW50JyAmJiB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8gcGFyYW1ldGVyIHR5cGUsIGNoZWNrIGZvciBkZWZhdWx0IHZhbHVlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZU5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIHRvIGZvcmNlIHJlY29tcHV0YXRpb24gb2YgY29uZmlncyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgdGhlIG5ldyBzZWxlY3QgY29uZmlnIGlmIG5lZWRlZFxuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBjb25maWdcbiAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBJZiBhIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGNvbnNvbGUubG9nKCdvbkRhdGFUeXBlQ2hhbmdlJywgdmFyaWFibGVOYW1lLCBkYXRhVHlwZSwgZm9ybWF0dGVkVmFsdWUpO1xuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudCB3aXRoIGZvcm1hdHRlZCB2YWx1ZVxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cbiAgXG4gIG9uRWxlbWVudFNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gT25seSBoYW5kbGUgc2VhcmNoIGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICAvLyBUaGUga2V5IHdpbGwgYmUgJ3ZhbHVlJyBzaW5jZSB0aGF0J3Mgd2hhdCB3ZSBzZXQgaW4gdGhlIGNvbmZpZ1xuICAgIC8vIEVtaXQgdGhlIHNlYXJjaCBxdWVyeSB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgcmF3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgcmF3IHZhbHVlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IGRhdGEgdHlwZVxuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWVcbiAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXMgZnJvbSBwYXJhbWV0ZXIgb3B0aW9ucyAocmF3IFRlc3REYXRhIG9iamVjdHMpXG4gICAqL1xuICBnZXRVbmlxdWVUZXN0RGF0YVByb2ZpbGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgcHJvZmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5mb3JFYWNoKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyB0ZXN0RGF0YS5uYW1lIGlzIHRoZSB0ZXN0RGF0YU5hbWUgKHByb2ZpbGUgbmFtZSlcbiAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICBpZiAocHJvZmlsZU5hbWUgJiYgIXByb2ZpbGVNYXAuaGFzKHByb2ZpbGVOYW1lKSkge1xuICAgICAgICBwcm9maWxlTWFwLnNldChwcm9maWxlTmFtZSwge1xuICAgICAgICAgIGlkOiBTdHJpbmcodGVzdERhdGEuaWQpLFxuICAgICAgICAgIG5hbWU6IHByb2ZpbGVOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb2ZpbGVzID0gQXJyYXkuZnJvbShwcm9maWxlTWFwLnZhbHVlcygpKTtcbiAgICByZXR1cm4gcHJvZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgc2V0cyBmb3IgYSBzcGVjaWZpYyB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBSZXR1cm5zIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZSdzIGRhdGEgYXJyYXlcbiAgICovXG4gIGdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZDogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBpZFxuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWQpO1xuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGVzdERhdGFQcm9maWxlIHx8ICF0ZXN0RGF0YVByb2ZpbGUuZGF0YSB8fCB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmV0dXJuIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZVxuICAgIHJldHVybiB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5tYXAoKGRhdGFTZXQ6IGFueSkgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgaW4gYSB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBFeHRyYWN0cyBwYXJhbWV0ZXIgbmFtZXMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkT3JOYW1lOiBzdHJpbmcsIGRhdGFTZXROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkIG9yIG5hbWVcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IElEIGZpcnN0IChpZiBwcm9maWxlSWRPck5hbWUgaXMgYSBudW1iZXIpXG4gICAgICBjb25zdCBpZE1hdGNoID0gIWlzTmFOKE51bWJlcihwcm9maWxlSWRPck5hbWUpKSAmJiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSk7XG4gICAgICAvLyBPdGhlcndpc2UgdHJ5IHRvIG1hdGNoIGJ5IG5hbWVcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9ICh0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZSkgPT09IHByb2ZpbGVJZE9yTmFtZTtcbiAgICAgIHJldHVybiBpZE1hdGNoIHx8IG5hbWVNYXRjaDtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNwZWNpZmljIGRhdGEgc2V0IGJ5IG5hbWVcbiAgICBjb25zdCBkYXRhU2V0ID0gdGVzdERhdGFQcm9maWxlLmRhdGEuZmluZCgoZHM6IGFueSkgPT4gZHMubmFtZSA9PT0gZGF0YVNldE5hbWUpO1xuICAgIGlmICghZGF0YVNldCB8fCAhZGF0YVNldC5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBhbGwgcGFyYW1ldGVyIGtleXMgZnJvbSB0aGUgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gT2JqZWN0LmtleXMoZGF0YVNldC5kYXRhKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyTmFtZXMubWFwKHBhcmFtTmFtZSA9PiAoe1xuICAgICAgaWQ6IHBhcmFtTmFtZSxcbiAgICAgIG5hbWU6IHBhcmFtTmFtZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIHRlc3QgZGF0YSBwcm9maWxlIGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgICovXG4gIGdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgO1xuICAgIFxuICAgIC8vIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLmdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTtcbiAgICAvLyBDcmVhdGUgb3B0aW9ucyB3aXRoIHByb2ZpbGUgbmFtZSBhbmQgSUQgKGRpc3BsYXkgbmFtZSB3aXRoIElEKVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwcm9maWxlcy5tYXAocHJvZmlsZSA9PiB7XG4gICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSB0byBnZXQgdGhlIElEXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBwcm9maWxlLm5hbWU7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQgfHwgcHJvZmlsZS5pZDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IFN0cmluZyhwcm9maWxlSWQpLFxuICAgICAgICB2YWx1ZTogcHJvZmlsZS5uYW1lLFxuICAgICAgICBuYW1lOiBgJHtwcm9maWxlLm5hbWV9YCwgLy8gRGlzcGxheSBuYW1lIHdpdGggSURcbiAgICAgICAgbGFiZWw6IGAke3Byb2ZpbGUubmFtZX1gXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiBhbmQgdXBkYXRlIGl0XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIFxuICAgICAgICAgID8gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpIFxuICAgICAgICAgIDogKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8ICcnKTtcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50VmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgcHJvZmlsZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSB2YWx1ZSBpcyBzZXQgZXZlbiBpZiBjb25maWcgd2FzIGNhY2hlZFxuICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHdoaWNoIG1hdGNoZXMgb3B0LmlkKSBpbnN0ZWFkIG9mIHByb2ZpbGUgbmFtZSAod2hpY2ggbWF0Y2hlcyBvcHQudmFsdWUpXG4gICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBwcm9maWxlIElEIGV4aXN0cyBpbiBvcHRpb25zIGJlZm9yZSBzZXR0aW5nXG4gICAgICAgIGNvbnN0IHByb2ZpbGVFeGlzdHMgPSBvcHRpb25zQXJyYXkuc29tZShvcHQgPT4gb3B0LmlkID09PSBwcm9maWxlSWRTdHJpbmcpO1xuICAgICAgICBpZiAocHJvZmlsZUV4aXN0cykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250cm9sVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sVmFsdWUgIT09IHByb2ZpbGVJZFN0cmluZykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAvLyBGYWxsYmFjazogaWYgd2Ugb25seSBoYXZlIHRoZSBwcm9maWxlIG5hbWUsIGZpbmQgdGhlIG1hdGNoaW5nIG9wdGlvbiBhbmQgdXNlIGl0cyBJRFxuICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9IG9wdGlvbnNBcnJheS5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gbWF0Y2hpbmdPcHRpb24uaWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShtYXRjaGluZ09wdGlvbi5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIHZhcmlhYmxlJ3MgcHJvZmlsZSBJRCBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBOdW1iZXIobWF0Y2hpbmdPcHRpb24uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGNhY2hlIGFmdGVyIGVuc3VyaW5nIGZvcm0gY29udHJvbCBpcyBzZXRcbiAgICBpZiAodGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIHRoZSBwcm9maWxlIElEIChzdHJpbmcpIGZyb20gdGhlIG1hdC1vcHRpb25cbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgdG8gZ2V0IHRoZSBuYW1lXG4gICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlc3REYXRhLmlkID09PSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3JlIGJvdGggSUQgYW5kIG5hbWVcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlPy5uYW1lIHx8IHRlc3REYXRhUHJvZmlsZT8udGVzdERhdGFOYW1lIHx8ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3Mgc2luY2UgcHJvZmlsZSBjaGFuZ2VkXG4gICAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIGNvbmZpZ3MgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRgKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHNlbGVjdGVkIGRhdGEgc2V0IHdoZW4gcHJvZmlsZSBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBkYXRhIHNldCBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgICovXG4gIGdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCAocHJlZmVycmVkKSBvciBuYW1lIChmYWxsYmFjaylcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgXG4gICAgaWYgKCFzZWxlY3RlZFByb2ZpbGVJZCAmJiAhc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICAvLyBSZXR1cm4gZW1wdHkgY29uZmlnIGlmIG5vIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3NlbGVjdGVkRGF0YVNldCcsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmluZCBJRCBmcm9tIHByb2ZpbGUgbmFtZVxuICAgIGxldCBwcm9maWxlSWRUb1VzZTogc3RyaW5nO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVJZCkge1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIHRoZSBwcm9maWxlIElEIGZyb20gdGhlIHByb2ZpbGUgbmFtZVxuICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgfSk7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IHRlc3REYXRhUHJvZmlsZT8uaWQgPyBTdHJpbmcodGVzdERhdGFQcm9maWxlLmlkKSA6ICcnO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9maWxlIElEIGZvciBjYWNoZSBrZXkgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldF8ke3Byb2ZpbGVJZFRvVXNlIHx8IHNlbGVjdGVkUHJvZmlsZSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IGRhdGEgc2V0cyBmb3IgdGhlIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIHVzaW5nIElEXG4gICAgY29uc3QgZGF0YVNldHMgPSB0aGlzLmdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZFRvVXNlKTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gZGF0YVNldHMubWFwKGRhdGFTZXQgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICB2YWx1ZTogZGF0YVNldC5uYW1lLFxuICAgICAgbmFtZTogZGF0YVNldC5uYW1lLFxuICAgICAgbGFiZWw6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHNldCBzZWxlY3Rpb25cbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgfHwgJyc7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhU2V0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBhIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCAtIGlmIHNvLCBkaXNhYmxlIHRoZSBkcm9wZG93blxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpO1xuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IERhdGEgU2V0JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgc2VsZWN0aW9uIHdoZW4gZGF0YSBzZXQgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZyBzaW5jZSBkYXRhIHNldCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKChjb25maWdWYWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF9gKSkge1xuICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgcGFyYW1ldGVyIGRyb3Bkb3duICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIHBhcmFtZXRlcnMgZnJvbSBzZWxlY3RlZCBkYXRhIHNldClcbiAgICovXG4gIGdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKSBhbmQgZGF0YSBzZXRcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRhU2V0ID0gdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0O1xuICAgIFxuICAgIGlmICgoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHx8ICFzZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgcHJvZmlsZSBvciBkYXRhIHNldCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IChzZWxlY3RlZFByb2ZpbGVJZCB8fCBzZWxlY3RlZFByb2ZpbGUpID8gJ1NlbGVjdCBEYXRhIFNldCBmaXJzdCcgOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gc2VsZWN0ZWRQcm9maWxlSWQgPyBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpIDogKHNlbGVjdGVkUHJvZmlsZSB8fCAnJyk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHtzZWxlY3RlZERhdGFTZXR9YDtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQgdXNpbmcgcHJvZmlsZSBJRCBvciBuYW1lXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkZW50aWZpZXIsIHNlbGVjdGVkRGF0YVNldCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBVc2UgcGFyYW0ubmFtZSBhcyBpZCAobWF0LW9wdGlvbiB3aWxsIHVzZSB0aGlzKVxuICAgICAgdmFsdWU6IGBAfCR7cGFyYW0ubmFtZX18YCwgLy8gRm9ybWF0dGVkIHZhbHVlIGZvciBkaXNwbGF5XG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBhbmQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUsIGVuc3VyZSBmb3JtIGNvbnRyb2wgbWF0Y2hlcyB0aGUgb3B0aW9uIGlkIChmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIENoZWNrIGlmIHZhbHVlIGlzIGFscmVhZHkgZm9ybWF0dGVkIChlLmcuLCBcIkB8ZW1haWx8XCIpXG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGN1cnJlbnRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgID8gY3VycmVudFZhbHVlXG4gICAgICAgIDogKGN1cnJlbnRWYWx1ZSA/IGBAfCR7Y3VycmVudFZhbHVlfXxgIDogJycpO1xuICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBmb3JtYXR0ZWQgdmFsdWUgKG1hdGNoZXMgb3B0LmlkKSBzbyBzZWxlY3QgZGlzcGxheXMgY29ycmVjdGx5XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgJiYgcGFyYW1ldGVycy5zb21lKHAgPT4gYEB8JHtwLm5hbWV9fGAgPT09IGZvcm1hdHRlZFZhbHVlKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogZmFsc2UsIC8vIENsaWVudC1zaWRlIHNlYXJjaCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYWxsIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLCAvLyBObyBwYWdpbmF0aW9uIGZvciBwYXJhbWV0ZXJzIHdpdGhpbiBhIGRhdGEgc2V0XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIHJlY2VpdmVkIGlzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgKGUuZy4sIFwiQHxlbWFpbHxcIikgYmVjYXVzZSBtYXQtb3B0aW9uIHVzZXMgb3B0LmlkXG4gICAgICAgIC8vIEV4dHJhY3QgcGFyYW1ldGVyIG5hbWUgZnJvbSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZTsgLy8gVGhpcyBpcyBhbHJlYWR5IGZvcm1hdHRlZCBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiBmb3JtYXR0ZWRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgICAgPyBmb3JtYXR0ZWRWYWx1ZS5zbGljZSgyLCAtMSlcbiAgICAgICAgICA6IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHJhdyB2YWx1ZSAoc3RvcmUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBmb3JtYXR0aW5nKVxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZSAoc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGZvciB0ZW1wbGF0ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0gdXNlIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXAgJiYgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIGZvcm1hdHRlZCB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayBhbmQgZW1pdFxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50ICh0aGlzIGlzIHdoYXQgZ2V0cyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSlcbiAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZS5uYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgZW52aXJvbm1lbnRzIGZyb20gZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKi9cbiAgZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZW52TWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZm9yRWFjaChlbnYgPT4ge1xuICAgICAgaWYgKCFlbnZNYXAuaGFzKGVudi5lbnZpcm9ubWVudCkpIHtcbiAgICAgICAgZW52TWFwLnNldChlbnYuZW52aXJvbm1lbnQsIHtcbiAgICAgICAgICBpZDogZW52LmVudmlyb25tZW50LFxuICAgICAgICAgIG5hbWU6IGVudi5lbnZpcm9ubWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnZNYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoZW52aXJvbm1lbnROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50T3B0aW9uc1xuICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudE5hbWUpXG4gICAgICAubWFwKGVudiA9PiAoe1xuICAgICAgICBpZDogZW52Lm5hbWUsXG4gICAgICAgIG5hbWU6IGVudi5uYW1lXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biAtIHNlbGVjdCBlbnZpcm9ubWVudClcbiAgICovXG4gIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2Vudmlyb25tZW50YDtcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHNcbiAgICBjb25zdCB1bmlxdWVFbnZpcm9ubWVudHMgPSB0aGlzLmdldFVuaXF1ZUVudmlyb25tZW50cygpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSB1bmlxdWVFbnZpcm9ubWVudHMubWFwKGVudiA9PiAoe1xuICAgICAgaWQ6IGVudi5pZCxcbiAgICAgIHZhbHVlOiBlbnYubmFtZSxcbiAgICAgIG5hbWU6IGVudi5uYW1lLFxuICAgICAgbGFiZWw6IGVudi5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVudmlyb25tZW50IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RW52ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50RW52KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZEVudmlyb25tZW50JywgLy8gVXNlICdzZWxlY3RlZEVudmlyb25tZW50JyBhcyBrZXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0IEVudmlyb25tZW50YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbnZpcm9ubWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52aXJvbm1lbnRzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIGVudmlyb25tZW50IG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRCBmcm9tIGVudmlyb25tZW50T3B0aW9uc1xuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBvcHRpb24gd2l0aCBtYXRjaGluZyBlbnZpcm9ubWVudCBuYW1lIHRvIGdldCB0aGUgSURcbiAgICAgICAgY29uc3QgZW52T3B0aW9uID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmluZChlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IG51bWVyaWMgSUQgZnJvbSBlbnZPcHRpb24uaWQgKGZvcm1hdDogXCJlbnYtNzQtdGVzdFwiIC0+IDc0KVxuICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgICAgaWYgKGlkTWF0Y2ggJiYgaWRNYXRjaFsxXSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkRW52aXJvbm1lbnQgY29udHJvbFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIG5ldyBlbnZpcm9ubWVudFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gdXBkYXRlIFVJXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoRW52aXJvbm1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIC0gc2VsZWN0IHBhcmFtZXRlciBmcm9tIGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBzZWxlY3RlZEVudmlyb25tZW50ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudDtcbiAgICBpZiAoIXNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRW52aXJvbm1lbnQgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcGFyYW1ldGVycyBmb3IgdGhlIHNlbGVjdGVkIGVudmlyb25tZW50XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckVudmlyb25tZW50KHNlbGVjdGVkRW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiAoe1xuICAgICAgaWQ6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIHZhbHVlOiBgKnwke3BhcmFtLm5hbWV9fGAsXG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgUGFyYW1ldGVyYCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFdoZW4gcGFyYW1ldGVyIGlzIHNlbGVjdGVkLCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBmb3JtYXQgaXRcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnZpcm9ubWVudCBJRCBpcyBhbHJlYWR5IHN0b3JlZCBvbiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWRcbiAgICAgICAgLy8gKGl0IHdhcyBzZXQgd2hlbiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQpXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAtIGtlZXAgcmF3IHZhbHVlIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIHJhdyB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAvLyBFbWl0IGZvcm1hdHRlZCB2YWx1ZSBmb3IgcGFyZW50IGNvbXBvbmVudFxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRW52aXJvbm1lbnQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBJRCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudElkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW52aXJvbm1lbnQgSURzIGZvciB2YXJpYWJsZXMgdGhhdCB1c2UgZW52aXJvbm1lbnQgdHlwZVxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIHZhcmlhYmxlIG5hbWUgdG8gZW52aXJvbm1lbnQgSURcbiAgICovXG4gIGdldEVudmlyb25tZW50SWRzRm9yVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IGVudklkcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpIHtcbiAgICAgICAgZW52SWRzLnNldCh2YXJpYWJsZS5uYW1lLCB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlbnZJZHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGxhaW4tdGV4dFxuICAgKi9cbiAgaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGxhaW4tdGV4dCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGFyYW1ldGVyXG4gICAqL1xuICBpc1BhcmFtZXRlclR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGRhdGEgc2V0IGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHNldCAoZnJvbSB0ZXN0IGNhc2UpXG4gICAqIElmIHRydWUsIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGRyb3Bkb3ducyBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIGhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgZW52aXJvbm1lbnRcbiAgICovXG4gIGlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhcmlhYmxlIGlzIGVsZW1lbnQgdHlwZSAoZGF0YUtleSA9PT0gJ2VsZW1lbnQnKVxuICAgKi9cbiAgaXNFbGVtZW50VHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgZm9yIGFuIGVsZW1lbnQgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkU2NyZWVuTmFtZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3Igc2NyZWVuIG5hbWUgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIGZvciBlbGVtZW50IHZhcmlhYmxlcylcbiAgICovXG4gIGdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEluY2x1ZGUgbG9hZGluZyBzdGF0ZSBpbiBjYWNoZSBrZXkgdG8gaW52YWxpZGF0ZSB3aGVuIGxvYWRpbmcgY29tcGxldGVzXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9zY3JlZW5OYW1lXyR7dGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdTY3JlZW5OYW1lc31gO1xuICAgIGlmICh0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNjcmVlbk5hbWVPcHRpb25zIGZyb20gQVBJIChub3QgZXh0cmFjdGVkIGZyb20gZWxlbWVudE9wdGlvbnMpXG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubWFwKHNjcmVlbk5hbWUgPT4gKHtcbiAgICAgIGlkOiBzY3JlZW5OYW1lLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgIG5hbWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgIGxhYmVsOiBzY3JlZW5OYW1lLm5hbWUsXG4gICAgICBzY3JlZW5OYW1lSWQ6IHNjcmVlbk5hbWUuaWRcbiAgICB9KSk7XG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIHNjcmVlbiBuYW1lIHNlbGVjdGlvblxuICAgIC8vIFNpbmNlIHZhbHVlQnkgaXMgJ3NjcmVlbk5hbWVJZCcsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHNjcmVlbk5hbWVJZCAobnVtYmVyKSBpbiB0aGUgZm9ybSBjb250cm9sXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBzY3JlZW5OYW1lSWQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgbnVsbFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgfHwgbnVsbDtcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS5zY3JlZW5OYW1lSWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICB2YWx1ZUJ5OiAnc2NyZWVuTmFtZUlkJyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBzY3JlZW4gbmFtZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIC8vIHZhbHVlIGlzIHRoZSBzY3JlZW5OYW1lSWQgKG51bWJlcikgc2luY2UgdmFsdWVCeSBpcyAnc2NyZWVuTmFtZUlkJ1xuICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uICYmIHNjcmVlbk5hbWVPcHRpb24uaWQpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBzY3JlZW5OYW1lT3B0aW9uLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHRoZSBlbGVtZW50IHNlbGVjdGlvbiB3aGVuIHNjcmVlbiBuYW1lIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSAnJztcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGVsZW1lbnQgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAga2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBmb3JtIGNvbnRyb2wgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgKHNjcmVlbk5hbWVJZCkgZnJvbSB0aGUgZHJvcGRvd25cbiAgICAgICAgICAvLyBObyBuZWVkIHRvIHVwZGF0ZSBpdCBoZXJlIGFzIGl0J3MgYWxyZWFkeSBzZXQgYnkgbWF0LXNlbGVjdFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNlbGVjdGVkIHNjcmVlbiBuYW1lXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoe1xuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQsXG4gICAgICAgICAgICBzZWFyY2hUZXJtOiAnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBUaGUgZWxlbWVudCBjb25maWcgd2lsbCBiZSByZWNvbXB1dGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBlbGVtZW50T3B0aW9ucyBpbnB1dCBjaGFuZ2VzXG4gICAgICAgIC8vIHZpYSBuZ09uQ2hhbmdlcywgd2hpY2ggd2lsbCBjbGVhciB0aGUgY2FjaGUgYW5kIHRyaWdnZXIgcmUtY29tcHV0YXRpb25cbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCcnKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hTY3JlZW5OYW1lLmVtaXQocXVlcnkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZWxlbWVudCBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIC0gZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWUpXG4gICAqIE9wdGltaXplZCB0byByZXR1cm4gaW1tZWRpYXRlbHkgZnJvbSBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBjYWxscyBkdXJpbmcgY2hhbmdlIGRldGVjdGlvblxuICAgKi9cbiAgZ2V0RWxlbWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHNjcmVlbiBuYW1lIElEXG4gICAgY29uc29sZS5sb2coJ3ZhcmlhYmxlJywgdmFyaWFibGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGFuZCBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbGVtZW50XyR7c2VsZWN0ZWRTY3JlZW5OYW1lSWQgfHwgJyd9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc3RpbGwgbG9hZGluZywgcmV0dXJuIGEgbG9hZGluZyBjb25maWcgYW5kIGNhY2hlIGl0XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ0xvYWRpbmcgZWxlbWVudHMuLi4nLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBsb2FkaW5nQ29uZmlnKTtcbiAgICAgIHJldHVybiBsb2FkaW5nQ29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZpbmQgYW5kIHBhdGNoIHRoZSBzZWxlY3RvciB2YXJpYWJsZSB3aXRoIGRhdGFLZXkgJ25vdF9mb3VuZCdcbiAgICAgICAgICBjb25zdCBzZWxlY3RvclZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKFxuICAgICAgICAgICAgdiA9PiB2Lm5hbWUgPT09ICdzZWxlY3RvcicgJiYgdi5kYXRhS2V5ID09PSAnbm90X2ZvdW5kJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGUgJiYgc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBmb3JtIGdyb3VwIGZvciB0aGUgc2VsZWN0b3IgdmFyaWFibGVcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAoc2VsZWN0b3JWYXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RvclZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RvciB2YXJpYWJsZSdzIHZhbHVlIHdpdGggdGhlIGVsZW1lbnQgbG9jYXRvclxuICAgICAgICAgICAgICBzZWxlY3RvclZhcmlhYmxlLnZhbHVlID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFBhdGNoIHRoZSBmb3JtIGNvbnRyb2wgdmFsdWVcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvclZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGVsZW1lbnQgbm90IGZvdW5kLCBqdXN0IHNldCB0aGUgdmFsdWVcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTY3JlZW4gbmFtZSBJRCBpcyBhbHJlYWR5IHN0b3JlZCBvbiB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWVJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIHNjcmVlbiBuYW1lIHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vbi1ib29sZWFuLCBub24tY3VzdG9tX2NvZGUgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnICYmIHZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJ1wiPlxuICAgICAgPCEtLSBFbGVtZW50IHZhcmlhYmxlcyB3aXRoIGNhc2NhZGluZyBkcm9wZG93bnMgKHNjcmVlbiBuYW1lICsgZWxlbWVudCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbGVtZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICBTY3JlZW4gTmFtZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgPCEtLSBPdGhlciBkcm9wZG93biB2YXJpYWJsZXMgKHR5cGUsIHNjcm9sbFRvLCBsYWJlbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkU2hvd0Ryb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSBkZWZhdWx0SW5wdXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXQ+XG4gICAgICAgIDwhLS0gVGVzdC1kYXRhLCBzb3VyY2UtdmFsdWUsIG9yIHRhcmdldC12YWx1ZSB3aXRoIGRhdGEgdHlwZSBkcm9wZG93biAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgcmVndWxhcklucHV0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBUeXBlXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnQgTmFtZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYWx1ZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BhcmFtZXRlclR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgVGVzdCBEYXRhIFByb2ZpbGVcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIERhdGEgU2V0XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzUGxhaW5UZXh0VHlwZSh2YXJpYWJsZSkgfHwgaXNSdW50aW1lVHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX0gXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSBpbnB1dCBmb3IgcGxhaW4tdGV4dCB0eXBlIC0tPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZSh2YXJpYWJsZSlcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcklucHV0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgPGNxYS1lbGVtZW50LWZvcm1cbiAgICBbaXNDcmVhdGVNb2RlXT1cInRydWVcIlxuICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgW2lzRWRpdEluRGVwdGhBdmFpbGFibGVdPVwiZmFsc2VcIlxuICAgIChjcmVhdGVFbGVtZW50KT1cIm9uQ3JlYXRlRWxlbWVudCgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsRWxlbWVudEZvcm0oKVwiXG4gICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCI+XG4gIDwvY3FhLWVsZW1lbnQtZm9ybT5cbjwvZGl2PiJdfQ==
|