@cqa-lib/cqa-ui 1.1.402 → 1.1.405
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/step-builder/step-builder-action/step-builder-action.component.mjs +9 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +8 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +8 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +259 -33
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +14 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +315 -58
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +293 -38
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +5 -1
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +3 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +3 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +10 -1
- package/package.json +1 -1
package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs
CHANGED
|
@@ -40,6 +40,8 @@ export class TemplateVariablesFormComponent {
|
|
|
40
40
|
this.hasMoreEnvironments = false;
|
|
41
41
|
/** True while parent is loading environments (search or load more) */
|
|
42
42
|
this.isLoadingEnvironments = false;
|
|
43
|
+
/** True when the edited step is inside a FOR loop. */
|
|
44
|
+
this.isInsideForLoopStep = false;
|
|
43
45
|
this.isEditInDepth = false;
|
|
44
46
|
this.isDebug = false;
|
|
45
47
|
this.variableValueChange = new EventEmitter();
|
|
@@ -79,6 +81,8 @@ export class TemplateVariablesFormComponent {
|
|
|
79
81
|
this.testDataProfileSelectConfigCache = new Map();
|
|
80
82
|
// Cache for data set select configs (second dropdown for parameters - shows data sets from selected profile)
|
|
81
83
|
this.dataSetSelectConfigCache = new Map();
|
|
84
|
+
// Cache for data set start/end configs (FOR loop context)
|
|
85
|
+
this.dataSetRangeSelectConfigCache = new Map();
|
|
82
86
|
// Cache for parameter select configs for a specific data set (third dropdown for parameters)
|
|
83
87
|
this.parameterForDataSetSelectConfigCache = new Map();
|
|
84
88
|
// Cache for computed properties
|
|
@@ -104,11 +108,23 @@ export class TemplateVariablesFormComponent {
|
|
|
104
108
|
this.cdr.markForCheck();
|
|
105
109
|
}
|
|
106
110
|
ngOnChanges(changes) {
|
|
111
|
+
if (changes['defaultTestDataProfileId']) {
|
|
112
|
+
console.log("defaultTestDataProfileId changed", changes['defaultTestDataProfileId']);
|
|
113
|
+
}
|
|
114
|
+
if (changes['defaultTestDataStartIndex']) {
|
|
115
|
+
console.log("defaultTestDataStartIndex changed", changes['defaultTestDataStartIndex']);
|
|
116
|
+
}
|
|
117
|
+
if (changes['defaultTestDataEndIndex']) {
|
|
118
|
+
console.log("defaultTestDataEndIndex changed", changes['defaultTestDataEndIndex']);
|
|
119
|
+
}
|
|
120
|
+
if (changes['isInsideForLoopStep']) {
|
|
121
|
+
console.log("isInsideForLoopStep changed", changes['isInsideForLoopStep']);
|
|
122
|
+
}
|
|
107
123
|
if (changes['templateVariables'] || changes['variablesForm'] || changes['elementOptions'] ||
|
|
108
124
|
changes['hasMoreElements'] || changes['isLoadingElements'] ||
|
|
109
125
|
changes['parameterOptions'] || changes['hasMoreParameters'] || changes['isLoadingParameters'] ||
|
|
110
126
|
changes['environmentOptions'] || changes['hasMoreEnvironments'] || changes['isLoadingEnvironments'] ||
|
|
111
|
-
changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex']) {
|
|
127
|
+
changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex'] || changes['defaultTestDataEndIndex'] || changes['isInsideForLoopStep']) {
|
|
112
128
|
// Only clear caches for changed inputs, not all caches
|
|
113
129
|
if (changes['templateVariables'] || changes['variablesForm']) {
|
|
114
130
|
// Clear all caches when template variables or form changes
|
|
@@ -121,6 +137,7 @@ export class TemplateVariablesFormComponent {
|
|
|
121
137
|
this.elementSelectConfigCache.clear();
|
|
122
138
|
this.testDataProfileSelectConfigCache.clear();
|
|
123
139
|
this.dataSetSelectConfigCache.clear();
|
|
140
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
124
141
|
this.parameterForDataSetSelectConfigCache.clear();
|
|
125
142
|
this.needsDataTypeDropdownCache.clear();
|
|
126
143
|
this.shouldShowDropdownCache.clear();
|
|
@@ -137,6 +154,7 @@ export class TemplateVariablesFormComponent {
|
|
|
137
154
|
this.parameterSelectConfigCache.clear();
|
|
138
155
|
this.testDataProfileSelectConfigCache.clear();
|
|
139
156
|
this.dataSetSelectConfigCache.clear();
|
|
157
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
140
158
|
this.parameterForDataSetSelectConfigCache.clear();
|
|
141
159
|
}
|
|
142
160
|
if (changes['uploadOptions'] || changes['hasMoreUploads'] || changes['isLoadingUploads']) {
|
|
@@ -151,7 +169,7 @@ export class TemplateVariablesFormComponent {
|
|
|
151
169
|
// NOTE: We do NOT include 'parameterOptions' here because it changes on every search,
|
|
152
170
|
// which would reset the test-data type dropdown. Instead, parameterOptions initialization
|
|
153
171
|
// is handled separately below with a firstChange guard.
|
|
154
|
-
if ((changes['templateVariables'] || changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex']) && this.templateVariables) {
|
|
172
|
+
if ((changes['templateVariables'] || changes['defaultTestDataProfileId'] || changes['defaultTestDataStartIndex'] || changes['defaultTestDataEndIndex'] || changes['isInsideForLoopStep']) && this.templateVariables) {
|
|
155
173
|
this.initializeTestDataVariables();
|
|
156
174
|
}
|
|
157
175
|
// If templateVariables changed, initialize screen name form controls for element variables that have screenNameId
|
|
@@ -418,8 +436,24 @@ export class TemplateVariablesFormComponent {
|
|
|
418
436
|
if (this.parameterOptions.length > 0) {
|
|
419
437
|
let profileToUse = null;
|
|
420
438
|
let dataSetToUse = null;
|
|
421
|
-
|
|
422
|
-
|
|
439
|
+
const hasDefaultProfile = this.defaultTestDataProfileId != null;
|
|
440
|
+
const hasSavedProfile = variable.selectedTestDataProfileId != null;
|
|
441
|
+
const profileMismatchWithDefault = hasDefaultProfile &&
|
|
442
|
+
hasSavedProfile &&
|
|
443
|
+
Number(variable.selectedTestDataProfileId) !== Number(this.defaultTestDataProfileId);
|
|
444
|
+
// When default profile is different from saved profile, ignore saved template-variable selection.
|
|
445
|
+
// Use default profile/start-end and clear parameter value because profile context changed.
|
|
446
|
+
if (profileMismatchWithDefault) {
|
|
447
|
+
variable.selectedTestDataProfileId = undefined;
|
|
448
|
+
variable.selectedTestDataProfile = undefined;
|
|
449
|
+
variable.selectedDataSet = undefined;
|
|
450
|
+
variable.selectedDataSetStart = undefined;
|
|
451
|
+
variable.selectedDataSetEnd = undefined;
|
|
452
|
+
variable.rawValue = '';
|
|
453
|
+
variable.value = '';
|
|
454
|
+
}
|
|
455
|
+
// First, check saved profile only when there is no default profile override.
|
|
456
|
+
if (!hasDefaultProfile && variable.selectedTestDataProfileId != null && !profileMismatchWithDefault) {
|
|
423
457
|
profileToUse = this.parameterOptions.find((testData) => testData.id === variable.selectedTestDataProfileId);
|
|
424
458
|
if (profileToUse && profileToUse.data && profileToUse.data.length > 0) {
|
|
425
459
|
// If defaultTestDataStartIndex is provided, use it directly
|
|
@@ -448,11 +482,16 @@ export class TemplateVariablesFormComponent {
|
|
|
448
482
|
}
|
|
449
483
|
}
|
|
450
484
|
}
|
|
451
|
-
// Priority 2: Use default test data profile
|
|
452
|
-
if (!profileToUse && this.defaultTestDataProfileId
|
|
485
|
+
// Priority 2: Use default test data profile whenever provided (override template-variable profile).
|
|
486
|
+
if (!profileToUse && this.defaultTestDataProfileId != null) {
|
|
453
487
|
profileToUse = this.parameterOptions.find((testData) => testData.id === this.defaultTestDataProfileId);
|
|
454
|
-
if (profileToUse && profileToUse.data && profileToUse.data.length >
|
|
455
|
-
|
|
488
|
+
if (profileToUse && profileToUse.data && profileToUse.data.length > 0) {
|
|
489
|
+
if (this.defaultTestDataStartIndex != null && profileToUse.data.length > this.defaultTestDataStartIndex) {
|
|
490
|
+
dataSetToUse = profileToUse.data[this.defaultTestDataStartIndex];
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
dataSetToUse = profileToUse.data[0];
|
|
494
|
+
}
|
|
456
495
|
}
|
|
457
496
|
}
|
|
458
497
|
// If we found a profile and data set, set the variable properties
|
|
@@ -463,6 +502,16 @@ export class TemplateVariablesFormComponent {
|
|
|
463
502
|
variable.selectedTestDataProfile = profileName;
|
|
464
503
|
variable.selectedTestDataProfileId = profileToUse.id;
|
|
465
504
|
variable.selectedDataSet = dataSetName;
|
|
505
|
+
if (this.isInsideForLoopStep) {
|
|
506
|
+
variable.selectedDataSetStart = dataSetName;
|
|
507
|
+
if (this.defaultTestDataEndIndex != null && profileToUse.data.length > this.defaultTestDataEndIndex) {
|
|
508
|
+
const endDataSet = profileToUse.data[this.defaultTestDataEndIndex];
|
|
509
|
+
variable.selectedDataSetEnd = endDataSet?.name || dataSetName;
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
variable.selectedDataSetEnd = dataSetName;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
466
515
|
// Set form controls with the actual values so dropdowns display selected options
|
|
467
516
|
// Use profile ID (string) for selectedTestDataProfile form control to match option.id format
|
|
468
517
|
const profileIdString = String(profileToUse.id);
|
|
@@ -478,6 +527,20 @@ export class TemplateVariablesFormComponent {
|
|
|
478
527
|
else {
|
|
479
528
|
variableGroup.get('selectedDataSet')?.setValue(dataSetName, { emitEvent: false });
|
|
480
529
|
}
|
|
530
|
+
if (this.isInsideForLoopStep) {
|
|
531
|
+
if (!variableGroup.get('selectedDataSetStart')) {
|
|
532
|
+
variableGroup.addControl('selectedDataSetStart', new FormControl(variable.selectedDataSetStart || dataSetName));
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
variableGroup.get('selectedDataSetStart')?.setValue(variable.selectedDataSetStart || dataSetName, { emitEvent: false });
|
|
536
|
+
}
|
|
537
|
+
if (!variableGroup.get('selectedDataSetEnd')) {
|
|
538
|
+
variableGroup.addControl('selectedDataSetEnd', new FormControl(variable.selectedDataSetEnd || dataSetName));
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
variableGroup.get('selectedDataSetEnd')?.setValue(variable.selectedDataSetEnd || dataSetName, { emitEvent: false });
|
|
542
|
+
}
|
|
543
|
+
}
|
|
481
544
|
// Set parameter value if we found it in the data set, otherwise clear it for user selection
|
|
482
545
|
if (variableGroup.get('value')) {
|
|
483
546
|
// If we found the parameter in a data set, set it; otherwise clear for user selection
|
|
@@ -497,6 +560,7 @@ export class TemplateVariablesFormComponent {
|
|
|
497
560
|
}
|
|
498
561
|
});
|
|
499
562
|
dataSetKeysToDelete.forEach(key => this.dataSetSelectConfigCache.delete(key));
|
|
563
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
500
564
|
// Clear parameter cache - need to clear all possible keys
|
|
501
565
|
const paramKeysToDelete = [];
|
|
502
566
|
this.parameterForDataSetSelectConfigCache.forEach((value, key) => {
|
|
@@ -507,8 +571,8 @@ export class TemplateVariablesFormComponent {
|
|
|
507
571
|
paramKeysToDelete.forEach(key => this.parameterForDataSetSelectConfigCache.delete(key));
|
|
508
572
|
}
|
|
509
573
|
}
|
|
510
|
-
// Priority 3: If no
|
|
511
|
-
if (!variable.selectedTestDataProfileId && this.parameterOptions.length > 0) {
|
|
574
|
+
// Priority 3: If no default profile override and no saved profile found, search by parameter value
|
|
575
|
+
if (this.defaultTestDataProfileId == null && !variable.selectedTestDataProfileId && this.parameterOptions.length > 0) {
|
|
512
576
|
// No default values - use existing logic to find from parameter value
|
|
513
577
|
const paramName = rawValue;
|
|
514
578
|
if (paramName) {
|
|
@@ -537,11 +601,12 @@ export class TemplateVariablesFormComponent {
|
|
|
537
601
|
variable.selectedTestDataProfileId = foundProfile.id;
|
|
538
602
|
variable.selectedDataSet = dataSetName;
|
|
539
603
|
// Set form controls
|
|
604
|
+
const profileIdString = String(foundProfile.id);
|
|
540
605
|
if (!variableGroup.get('selectedTestDataProfile')) {
|
|
541
|
-
variableGroup.addControl('selectedTestDataProfile', new FormControl(
|
|
606
|
+
variableGroup.addControl('selectedTestDataProfile', new FormControl(profileIdString));
|
|
542
607
|
}
|
|
543
608
|
else {
|
|
544
|
-
variableGroup.get('selectedTestDataProfile')?.setValue(
|
|
609
|
+
variableGroup.get('selectedTestDataProfile')?.setValue(profileIdString, { emitEvent: false });
|
|
545
610
|
}
|
|
546
611
|
if (!variableGroup.get('selectedDataSet')) {
|
|
547
612
|
variableGroup.addControl('selectedDataSet', new FormControl(dataSetName));
|
|
@@ -1065,6 +1130,7 @@ export class TemplateVariablesFormComponent {
|
|
|
1065
1130
|
// Clear parameter and environment select config caches since data type changed
|
|
1066
1131
|
this.testDataProfileSelectConfigCache.delete(`${variableName}_testDataProfile`);
|
|
1067
1132
|
this.dataSetSelectConfigCache.delete(`${variableName}_dataSet`);
|
|
1133
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
1068
1134
|
this.parameterForDataSetSelectConfigCache.delete(`${variableName}_paramForDataSet`);
|
|
1069
1135
|
this.environmentSelectConfigCache.delete(`${variableName}_environment`);
|
|
1070
1136
|
this.environmentParameterSelectConfigCache.delete(`${variableName}_envParam`);
|
|
@@ -1075,6 +1141,8 @@ export class TemplateVariablesFormComponent {
|
|
|
1075
1141
|
variable.selectedTestDataProfile = undefined;
|
|
1076
1142
|
variable.selectedTestDataProfileId = undefined;
|
|
1077
1143
|
variable.selectedDataSet = undefined;
|
|
1144
|
+
variable.selectedDataSetStart = undefined;
|
|
1145
|
+
variable.selectedDataSetEnd = undefined;
|
|
1078
1146
|
variable.rawValue = '';
|
|
1079
1147
|
// Remove parameter-related form controls when switching away from parameter type
|
|
1080
1148
|
if (variableGroup) {
|
|
@@ -1084,6 +1152,12 @@ export class TemplateVariablesFormComponent {
|
|
|
1084
1152
|
if (variableGroup.get('selectedDataSet')) {
|
|
1085
1153
|
variableGroup.removeControl('selectedDataSet');
|
|
1086
1154
|
}
|
|
1155
|
+
if (variableGroup.get('selectedDataSetStart')) {
|
|
1156
|
+
variableGroup.removeControl('selectedDataSetStart');
|
|
1157
|
+
}
|
|
1158
|
+
if (variableGroup.get('selectedDataSetEnd')) {
|
|
1159
|
+
variableGroup.removeControl('selectedDataSetEnd');
|
|
1160
|
+
}
|
|
1087
1161
|
}
|
|
1088
1162
|
}
|
|
1089
1163
|
else {
|
|
@@ -1093,6 +1167,10 @@ export class TemplateVariablesFormComponent {
|
|
|
1093
1167
|
variable.selectedTestDataProfile = undefined;
|
|
1094
1168
|
variable.selectedTestDataProfileId = undefined;
|
|
1095
1169
|
variable.selectedDataSet = undefined;
|
|
1170
|
+
variable.selectedDataSetStart = undefined;
|
|
1171
|
+
variable.selectedDataSetEnd = undefined;
|
|
1172
|
+
variable.selectedDataSetStart = undefined;
|
|
1173
|
+
variable.selectedDataSetEnd = undefined;
|
|
1096
1174
|
variable.rawValue = '';
|
|
1097
1175
|
// Clear form controls if they exist
|
|
1098
1176
|
if (variableGroup) {
|
|
@@ -1102,6 +1180,12 @@ export class TemplateVariablesFormComponent {
|
|
|
1102
1180
|
if (variableGroup.get('selectedDataSet')) {
|
|
1103
1181
|
variableGroup.get('selectedDataSet')?.setValue('', { emitEvent: false });
|
|
1104
1182
|
}
|
|
1183
|
+
if (variableGroup.get('selectedDataSetStart')) {
|
|
1184
|
+
variableGroup.get('selectedDataSetStart')?.setValue('', { emitEvent: false });
|
|
1185
|
+
}
|
|
1186
|
+
if (variableGroup.get('selectedDataSetEnd')) {
|
|
1187
|
+
variableGroup.get('selectedDataSetEnd')?.setValue('', { emitEvent: false });
|
|
1188
|
+
}
|
|
1105
1189
|
}
|
|
1106
1190
|
}
|
|
1107
1191
|
}
|
|
@@ -1134,20 +1218,35 @@ export class TemplateVariablesFormComponent {
|
|
|
1134
1218
|
// If switching to parameter type, check for default values and initialize them
|
|
1135
1219
|
if (dataType === 'parameter') {
|
|
1136
1220
|
const index = this.templateVariables.indexOf(variable);
|
|
1137
|
-
// Check if default test data profile
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1221
|
+
// Check if default test data profile is provided from test case/FOR context.
|
|
1222
|
+
// Even when default start index is missing, profile should still be preselected.
|
|
1223
|
+
if (this.defaultTestDataProfileId != null && this.parameterOptions.length > 0) {
|
|
1224
|
+
// Find the test data profile by ID (numeric-safe match for string/number IDs)
|
|
1225
|
+
const defaultProfile = this.parameterOptions.find((testData) => Number(testData.id) === Number(this.defaultTestDataProfileId));
|
|
1226
|
+
if (defaultProfile) {
|
|
1143
1227
|
const profileName = defaultProfile.name || defaultProfile.testDataName;
|
|
1144
|
-
const
|
|
1145
|
-
|
|
1228
|
+
const profileData = Array.isArray(defaultProfile.data) ? defaultProfile.data : [];
|
|
1229
|
+
const defaultStartIndex = this.defaultTestDataStartIndex != null ? this.defaultTestDataStartIndex : 0;
|
|
1230
|
+
const resolvedStartIndex = profileData.length > 0
|
|
1231
|
+
? Math.min(Math.max(defaultStartIndex, 0), profileData.length - 1)
|
|
1232
|
+
: -1;
|
|
1233
|
+
const defaultDataSet = resolvedStartIndex >= 0 ? profileData[resolvedStartIndex] : null;
|
|
1234
|
+
const dataSetName = defaultDataSet?.name || '';
|
|
1235
|
+
// Always set selected profile when default profile is available.
|
|
1146
1236
|
variable.selectedTestDataProfile = profileName;
|
|
1147
1237
|
variable.selectedTestDataProfileId = defaultProfile.id;
|
|
1148
|
-
variable.selectedDataSet = dataSetName;
|
|
1149
|
-
|
|
1150
|
-
|
|
1238
|
+
variable.selectedDataSet = dataSetName || undefined;
|
|
1239
|
+
if (this.isInsideForLoopStep && dataSetName) {
|
|
1240
|
+
variable.selectedDataSetStart = dataSetName;
|
|
1241
|
+
if (this.defaultTestDataEndIndex != null && profileData.length > this.defaultTestDataEndIndex) {
|
|
1242
|
+
const endDataSet = profileData[this.defaultTestDataEndIndex];
|
|
1243
|
+
variable.selectedDataSetEnd = endDataSet?.name || dataSetName;
|
|
1244
|
+
}
|
|
1245
|
+
else {
|
|
1246
|
+
variable.selectedDataSetEnd = dataSetName;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
// Set form controls with the actual values so dropdowns display selected options.
|
|
1151
1250
|
if (variableGroup) {
|
|
1152
1251
|
const profileIdString = String(defaultProfile.id);
|
|
1153
1252
|
if (!variableGroup.get('selectedTestDataProfile')) {
|
|
@@ -1156,14 +1255,30 @@ export class TemplateVariablesFormComponent {
|
|
|
1156
1255
|
else {
|
|
1157
1256
|
variableGroup.get('selectedTestDataProfile')?.setValue(profileIdString, { emitEvent: false });
|
|
1158
1257
|
}
|
|
1159
|
-
if (
|
|
1160
|
-
variableGroup.
|
|
1258
|
+
if (dataSetName) {
|
|
1259
|
+
if (!variableGroup.get('selectedDataSet')) {
|
|
1260
|
+
variableGroup.addControl('selectedDataSet', new FormControl(dataSetName));
|
|
1261
|
+
}
|
|
1262
|
+
else {
|
|
1263
|
+
variableGroup.get('selectedDataSet')?.setValue(dataSetName, { emitEvent: false });
|
|
1264
|
+
}
|
|
1161
1265
|
}
|
|
1162
|
-
|
|
1163
|
-
variableGroup.get('
|
|
1266
|
+
if (this.isInsideForLoopStep && dataSetName) {
|
|
1267
|
+
if (!variableGroup.get('selectedDataSetStart')) {
|
|
1268
|
+
variableGroup.addControl('selectedDataSetStart', new FormControl(variable.selectedDataSetStart || dataSetName));
|
|
1269
|
+
}
|
|
1270
|
+
else {
|
|
1271
|
+
variableGroup.get('selectedDataSetStart')?.setValue(variable.selectedDataSetStart || dataSetName, { emitEvent: false });
|
|
1272
|
+
}
|
|
1273
|
+
if (!variableGroup.get('selectedDataSetEnd')) {
|
|
1274
|
+
variableGroup.addControl('selectedDataSetEnd', new FormControl(variable.selectedDataSetEnd || dataSetName));
|
|
1275
|
+
}
|
|
1276
|
+
else {
|
|
1277
|
+
variableGroup.get('selectedDataSetEnd')?.setValue(variable.selectedDataSetEnd || dataSetName, { emitEvent: false });
|
|
1278
|
+
}
|
|
1164
1279
|
}
|
|
1165
1280
|
}
|
|
1166
|
-
// Clear caches to force recomputation of configs with new values
|
|
1281
|
+
// Clear caches to force recomputation of configs with new values.
|
|
1167
1282
|
this.testDataProfileSelectConfigCache.delete(`${variableName}_testDataProfile`);
|
|
1168
1283
|
const dataSetKeysToDelete = [];
|
|
1169
1284
|
this.dataSetSelectConfigCache.forEach((value, key) => {
|
|
@@ -1172,6 +1287,7 @@ export class TemplateVariablesFormComponent {
|
|
|
1172
1287
|
}
|
|
1173
1288
|
});
|
|
1174
1289
|
dataSetKeysToDelete.forEach(key => this.dataSetSelectConfigCache.delete(key));
|
|
1290
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
1175
1291
|
const paramKeysToDelete = [];
|
|
1176
1292
|
this.parameterForDataSetSelectConfigCache.forEach((value, key) => {
|
|
1177
1293
|
if (key.startsWith(`${variableName}_paramForDataSet`)) {
|
|
@@ -1409,6 +1525,8 @@ export class TemplateVariablesFormComponent {
|
|
|
1409
1525
|
variable.selectedTestDataProfile = testDataProfile?.name || testDataProfile?.testDataName || '';
|
|
1410
1526
|
// Clear data set and parameter selection when profile changes
|
|
1411
1527
|
variable.selectedDataSet = undefined;
|
|
1528
|
+
variable.selectedDataSetStart = undefined;
|
|
1529
|
+
variable.selectedDataSetEnd = undefined;
|
|
1412
1530
|
variable.rawValue = '';
|
|
1413
1531
|
variable.value = '';
|
|
1414
1532
|
// Update form controls
|
|
@@ -1420,6 +1538,12 @@ export class TemplateVariablesFormComponent {
|
|
|
1420
1538
|
if (varGroup.get('selectedDataSet')) {
|
|
1421
1539
|
varGroup.get('selectedDataSet')?.setValue('', { emitEvent: false });
|
|
1422
1540
|
}
|
|
1541
|
+
if (varGroup.get('selectedDataSetStart')) {
|
|
1542
|
+
varGroup.get('selectedDataSetStart')?.setValue('', { emitEvent: false });
|
|
1543
|
+
}
|
|
1544
|
+
if (varGroup.get('selectedDataSetEnd')) {
|
|
1545
|
+
varGroup.get('selectedDataSetEnd')?.setValue('', { emitEvent: false });
|
|
1546
|
+
}
|
|
1423
1547
|
if (varGroup.get('value')) {
|
|
1424
1548
|
varGroup.get('value')?.setValue('', { emitEvent: false });
|
|
1425
1549
|
}
|
|
@@ -1433,6 +1557,7 @@ export class TemplateVariablesFormComponent {
|
|
|
1433
1557
|
}
|
|
1434
1558
|
});
|
|
1435
1559
|
dataSetKeysToDelete.forEach(key => this.dataSetSelectConfigCache.delete(key));
|
|
1560
|
+
this.dataSetRangeSelectConfigCache.clear();
|
|
1436
1561
|
const paramKeysToDelete = [];
|
|
1437
1562
|
this.parameterForDataSetSelectConfigCache.forEach((value, key) => {
|
|
1438
1563
|
if (key.startsWith(`${variable.name}_paramForDataSet`)) {
|
|
@@ -1548,6 +1673,96 @@ export class TemplateVariablesFormComponent {
|
|
|
1548
1673
|
this.dataSetSelectConfigCache.set(cacheKey, config);
|
|
1549
1674
|
return config;
|
|
1550
1675
|
}
|
|
1676
|
+
/** Data Set Start/End select config for FOR-loop context. */
|
|
1677
|
+
getDataSetRangeSelectConfig(variable, index, range) {
|
|
1678
|
+
const selectedProfileId = variable.selectedTestDataProfileId;
|
|
1679
|
+
const selectedProfile = variable.selectedTestDataProfile;
|
|
1680
|
+
if (!selectedProfileId && !selectedProfile) {
|
|
1681
|
+
return {
|
|
1682
|
+
key: range === 'start' ? 'selectedDataSetStart' : 'selectedDataSetEnd',
|
|
1683
|
+
placeholder: 'Select Test Data Profile first',
|
|
1684
|
+
multiple: false,
|
|
1685
|
+
searchable: false,
|
|
1686
|
+
options: []
|
|
1687
|
+
};
|
|
1688
|
+
}
|
|
1689
|
+
let profileIdToUse;
|
|
1690
|
+
if (selectedProfileId) {
|
|
1691
|
+
profileIdToUse = String(selectedProfileId);
|
|
1692
|
+
}
|
|
1693
|
+
else {
|
|
1694
|
+
const testDataProfile = this.parameterOptions.find((testData) => {
|
|
1695
|
+
const name = testData.name || testData.testDataName;
|
|
1696
|
+
return name === selectedProfile;
|
|
1697
|
+
});
|
|
1698
|
+
profileIdToUse = testDataProfile?.id ? String(testDataProfile.id) : '';
|
|
1699
|
+
}
|
|
1700
|
+
const cacheKey = `${variable.name}_dataSetRange_${range}_${profileIdToUse || selectedProfile || ''}`;
|
|
1701
|
+
if (this.dataSetRangeSelectConfigCache.has(cacheKey)) {
|
|
1702
|
+
return this.dataSetRangeSelectConfigCache.get(cacheKey);
|
|
1703
|
+
}
|
|
1704
|
+
const dataSets = this.getDataSetsForTestDataProfile(profileIdToUse);
|
|
1705
|
+
const optionsArray = dataSets.map(dataSet => ({
|
|
1706
|
+
id: dataSet.name,
|
|
1707
|
+
value: dataSet.name,
|
|
1708
|
+
name: dataSet.name,
|
|
1709
|
+
label: dataSet.name
|
|
1710
|
+
}));
|
|
1711
|
+
const key = range === 'start' ? 'selectedDataSetStart' : 'selectedDataSetEnd';
|
|
1712
|
+
const currentVal = range === 'start' ? (variable.selectedDataSetStart || '') : (variable.selectedDataSetEnd || '');
|
|
1713
|
+
const variableGroup = this.getVariableFormGroup(variable.name);
|
|
1714
|
+
if (variableGroup) {
|
|
1715
|
+
if (!variableGroup.get(key)) {
|
|
1716
|
+
variableGroup.addControl(key, new FormControl(currentVal));
|
|
1717
|
+
}
|
|
1718
|
+
else if (currentVal && variableGroup.get(key)?.value !== currentVal) {
|
|
1719
|
+
variableGroup.get(key)?.setValue(currentVal, { emitEvent: false });
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
const isDisabled = this.hasDefaultTestDataSelection();
|
|
1723
|
+
const config = {
|
|
1724
|
+
key,
|
|
1725
|
+
placeholder: range === 'start' ? 'Select Data Set Start' : 'Select Data Set End',
|
|
1726
|
+
multiple: false,
|
|
1727
|
+
searchable: false,
|
|
1728
|
+
options: optionsArray,
|
|
1729
|
+
hasMore: false,
|
|
1730
|
+
isLoading: false,
|
|
1731
|
+
disabled: isDisabled,
|
|
1732
|
+
onChange: (value) => {
|
|
1733
|
+
if (range === 'start') {
|
|
1734
|
+
variable.selectedDataSetStart = value;
|
|
1735
|
+
// Parameter options are resolved from selectedDataSet; keep this alias in sync.
|
|
1736
|
+
variable.selectedDataSet = value;
|
|
1737
|
+
}
|
|
1738
|
+
else {
|
|
1739
|
+
variable.selectedDataSetEnd = value;
|
|
1740
|
+
}
|
|
1741
|
+
const varGroup = this.getVariableFormGroup(variable.name);
|
|
1742
|
+
if (varGroup) {
|
|
1743
|
+
varGroup.get(key)?.setValue(value, { emitEvent: false });
|
|
1744
|
+
if (range === 'start' && varGroup.get('selectedDataSet')) {
|
|
1745
|
+
varGroup.get('selectedDataSet')?.setValue(value, { emitEvent: false });
|
|
1746
|
+
}
|
|
1747
|
+
if (varGroup.get('value')) {
|
|
1748
|
+
varGroup.get('value')?.setValue('', { emitEvent: false });
|
|
1749
|
+
}
|
|
1750
|
+
}
|
|
1751
|
+
variable.rawValue = '';
|
|
1752
|
+
variable.value = '';
|
|
1753
|
+
const paramKeysToDelete = [];
|
|
1754
|
+
this.parameterForDataSetSelectConfigCache.forEach((configValue, k) => {
|
|
1755
|
+
if (k.startsWith(`${variable.name}_paramForDataSet_`)) {
|
|
1756
|
+
paramKeysToDelete.push(k);
|
|
1757
|
+
}
|
|
1758
|
+
});
|
|
1759
|
+
paramKeysToDelete.forEach(k => this.parameterForDataSetSelectConfigCache.delete(k));
|
|
1760
|
+
this.cdr.markForCheck();
|
|
1761
|
+
}
|
|
1762
|
+
};
|
|
1763
|
+
this.dataSetRangeSelectConfigCache.set(cacheKey, config);
|
|
1764
|
+
return config;
|
|
1765
|
+
}
|
|
1551
1766
|
/**
|
|
1552
1767
|
* Get select config for parameter dropdown (third dropdown for parameters - shows parameters from selected data set)
|
|
1553
1768
|
*/
|
|
@@ -1839,19 +2054,26 @@ export class TemplateVariablesFormComponent {
|
|
|
1839
2054
|
* Check if test data profile is selected for a variable
|
|
1840
2055
|
*/
|
|
1841
2056
|
hasSelectedTestDataProfile(variable) {
|
|
1842
|
-
return !!variable.selectedTestDataProfile;
|
|
2057
|
+
return !!(variable.selectedTestDataProfile || variable.selectedTestDataProfileId != null);
|
|
1843
2058
|
}
|
|
1844
2059
|
/**
|
|
1845
2060
|
* Check if data set is selected for a variable
|
|
1846
2061
|
*/
|
|
1847
2062
|
hasSelectedDataSet(variable) {
|
|
1848
|
-
return
|
|
2063
|
+
return this.isInsideForLoopStep
|
|
2064
|
+
? !!(variable.selectedDataSetStart || variable.selectedDataSet)
|
|
2065
|
+
: !!variable.selectedDataSet;
|
|
1849
2066
|
}
|
|
1850
2067
|
/**
|
|
1851
2068
|
* Check if default test data profile and data set are set (from test case)
|
|
1852
2069
|
* If true, profile and data set dropdowns should be disabled
|
|
1853
2070
|
*/
|
|
1854
2071
|
hasDefaultTestDataSelection() {
|
|
2072
|
+
if (this.isInsideForLoopStep) {
|
|
2073
|
+
return !!(this.defaultTestDataProfileId != null &&
|
|
2074
|
+
this.defaultTestDataStartIndex != null &&
|
|
2075
|
+
this.defaultTestDataEndIndex != null);
|
|
2076
|
+
}
|
|
1855
2077
|
return !!(this.defaultTestDataProfileId != null && this.defaultTestDataStartIndex != null);
|
|
1856
2078
|
}
|
|
1857
2079
|
/**
|
|
@@ -2207,10 +2429,10 @@ export class TemplateVariablesFormComponent {
|
|
|
2207
2429
|
}
|
|
2208
2430
|
}
|
|
2209
2431
|
TemplateVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2210
|
-
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", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isEditInDepth: "isEditInDepth", isDebug: "isDebug", 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", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<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 <ng-container *ngIf=\"variable.type === 'dropdown'\">\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\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\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 [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\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 capitalize-first\">\n {{ variable.label }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" 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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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-container>\n </ng-template>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], 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 });
|
|
2432
|
+
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", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", isEditInDepth: "isEditInDepth", isDebug: "isDebug", 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", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<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 <ng-container *ngIf=\"variable.type === 'dropdown'\">\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\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\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 [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\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 capitalize-first\">\n {{ variable.label }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" 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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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-container>\n </ng-template>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" 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<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" 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 Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" 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 End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], 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 });
|
|
2211
2433
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, decorators: [{
|
|
2212
2434
|
type: Component,
|
|
2213
|
-
args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<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 <ng-container *ngIf=\"variable.type === 'dropdown'\">\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\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\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 [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\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 capitalize-first\">\n {{ variable.label }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" 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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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-container>\n </ng-template>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
|
|
2435
|
+
args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<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 <ng-container *ngIf=\"variable.type === 'dropdown'\">\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\n <!-- Number variables with number input -->\n <ng-container *ngIf=\"variable.type === 'number' && variable.dataKey !== 'element'\">\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 [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown' && !(variable.type === 'number' && variable.dataKey !== 'element')\">\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 capitalize-first\">\n {{ variable.label }} Screen Name<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" 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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <ng-container *ngIf=\"variable.type === 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-custom-input [type]=\"'number'\" [placeholder]=\"'Number Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'number'\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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-container>\n </ng-template>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\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<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && !isInsideForLoopStep\" 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<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" 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 Start<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'start')\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable) && isInsideForLoopStep\" 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 End<span class=\"cqa-text-red-500\">*</span>\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetRangeSelectConfig(variable, i, 'end')\">\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 }}<span class=\"cqa-text-red-500\">*</span>\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 }}<span class=\"cqa-text-red-500\">*</span>\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: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
|
|
2214
2436
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { templateVariables: [{
|
|
2215
2437
|
type: Input
|
|
2216
2438
|
}], variablesForm: [{
|
|
@@ -2253,6 +2475,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2253
2475
|
type: Input
|
|
2254
2476
|
}], defaultTestDataStartIndex: [{
|
|
2255
2477
|
type: Input
|
|
2478
|
+
}], defaultTestDataEndIndex: [{
|
|
2479
|
+
type: Input
|
|
2480
|
+
}], isInsideForLoopStep: [{
|
|
2481
|
+
type: Input
|
|
2256
2482
|
}], isEditInDepth: [{
|
|
2257
2483
|
type: Input
|
|
2258
2484
|
}], isDebug: [{
|
|
@@ -2298,4 +2524,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2298
2524
|
}], createElementVisible: [{
|
|
2299
2525
|
type: Input
|
|
2300
2526
|
}] } });
|
|
2301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUE2Q25FLE1BQU0sT0FBTyw4QkFBOEI7SUF1R3pDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEdqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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O2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQTRDRSxvQkFBb0I7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZW1lbnRDcmVhdGVQYXlsb2FkLCBTY3JlZW5OYW1lT3B0aW9uIH0gZnJvbSAnLi4vLi4vdGVzdC1jYXNlLWRldGFpbHMvZWxlbWVudC1wb3B1cC9lbGVtZW50LXBvcHVwLWZvcm0tZGF0YSc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIHNjcmVlbk5hbWVJZD86IG51bWJlcjtcbiAgc2NyZWVuTmFtZU9iaj86IGFueTsgLy8gRml4ZWQ6IHVzZSAnYW55JyBzaW5jZSAnRWxlbWVudFNjcmVlbk5hbWUnIGlzIG5vdCBkZWZpbmVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVWYXJpYWJsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGF0YUtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBtYW5hZ2luZyB2YXJpYWJsZSBzdGF0ZVxuICBkYXRhVHlwZT86ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JztcbiAgcmF3VmFsdWU/OiBzdHJpbmc7IC8vIFJhdyB2YWx1ZSB3aXRob3V0IGZvcm1hdHRpbmcgKGZvciBzZWxlY3QgZHJvcGRvd25zKVxuICBzZWxlY3RlZEVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBJRCAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkRGF0YVNldD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZFNjcmVlbk5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVsZW1lbnQgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRMb2NhdG9yPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IGxvY2F0b3IgdmFsdWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnROYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVXBsb2FkIG9wdGlvbnMgZm9yIHVwbG9hZCBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgdXBsb2FkcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVVwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgdXBsb2FkcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nVXBsb2FkczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBAT3V0cHV0KCkgdmFyaWFibGVWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHZhcmlhYmxlQm9vbGVhbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBtZXRhZGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBsb2FkIG1vcmUgaXMgcmVxdWVzdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZWxlbWVudHNcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNjcmVlbk5hbWVJZDogbnVtYmVyOyBzZWFyY2hUZXJtPzogc3RyaW5nIH0+KCk7IC8vIEVtaXQgd2hlbiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RWxlbWVudENyZWF0ZVBheWxvYWQ+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCBwYXlsb2FkXG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGNyZWF0ZSBhIG5ldyBzY3JlZW4gbmFtZVxuICBAT3V0cHV0KCkgc2VhcmNoUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBzZWFyY2hVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciB1cGxvYWRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVVwbG9hZHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHVwbG9hZHNcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgZW52aXJvbm1lbnRzXG4gIEBPdXRwdXQoKSBjYW5jZWxFbGVtZW50Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSBpcyBjYW5jZWxsZWRcbiAgQE91dHB1dCgpIGVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgXG4gIC8vIENhY2hlIGZvciBzZWxlY3QgY29uZmlncyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHR5cGUgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBkYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIHBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNjcmVlbiBuYW1lIHNlbGVjdCBjb25maWdzIChmb3IgZWxlbWVudCB2YXJpYWJsZXMpXG4gIHByaXZhdGUgc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVsZW1lbnQgc2VsZWN0IGNvbmZpZ3MgKGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICBwcml2YXRlIGVsZW1lbnRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlncyAoZmlyc3QgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMpXG4gIHByaXZhdGUgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZGF0YSBzZXQgc2VsZWN0IGNvbmZpZ3MgKHNlY29uZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIGRhdGEgc2V0cyBmcm9tIHNlbGVjdGVkIHByb2ZpbGUpXG4gIHByaXZhdGUgZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlncyBmb3IgYSBzcGVjaWZpYyBkYXRhIHNldCAodGhpcmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMpXG4gIHByaXZhdGUgcGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBuZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gUHJlLWNvbXB1dGVkIGRhdGEgdHlwZSBvcHRpb25zIChzdGF0aWMsIG5vIG5lZWQgdG8gcmVjcmVhdGUpXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVR5cGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAncGxhaW4tdGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcsIG5hbWU6ICdQbGFpbiBUZXh0JywgbGFiZWw6ICdQbGFpbiBUZXh0JyB9LFxuICAgIHsgaWQ6ICdwYXJhbWV0ZXInLCB2YWx1ZTogJ3BhcmFtZXRlcicsIG5hbWU6ICdAfFBhcmFtZXRlcnwnLCBsYWJlbDogJ0B8UGFyYW1ldGVyfCcgfSxcbiAgICB7IGlkOiAncnVudGltZScsIHZhbHVlOiAncnVudGltZScsIG5hbWU6ICckfFJ1bnRpbWV8JywgbGFiZWw6ICckfFJ1bnRpbWV8JyB9LFxuICAgIHsgaWQ6ICdlbnZpcm9ubWVudCcsIHZhbHVlOiAnZW52aXJvbm1lbnQnLCBuYW1lOiAnKnxFbnZpcm9ubWVudHwnLCBsYWJlbDogJyp8RW52aXJvbm1lbnR8JyB9XG4gIF07XG5cbiAgQElucHV0KCkgY3JlYXRlRWxlbWVudFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBvbkNyZWF0ZUVsZW1lbnQocGF5bG9hZDogRWxlbWVudENyZWF0ZVBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnQuZW1pdChwYXlsb2FkKTtcbiAgICB0aGlzLmVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWxlbWVudEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5jYW5jZWxFbGVtZW50Rm9ybS5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10gfHwgY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSkge1xuICAgICAgXG4gICAgICAvLyBPbmx5IGNsZWFyIGNhY2hlcyBmb3IgY2hhbmdlZCBpbnB1dHMsIG5vdCBhbGwgY2FjaGVzXG4gICAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10pIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlcyB3aGVuIHRlbXBsYXRlIHZhcmlhYmxlcyBvciBmb3JtIGNoYW5nZXNcbiAgICAgICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGVsZW1lbnQgYW5kIHNjcmVlbiBuYW1lIGNhY2hlcyBvbmx5IHdoZW4gdGhlaXIgb3B0aW9ucyBjaGFuZ2VcbiAgICAgIGlmIChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbGVtZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0VsZW1lbnRzJ10pIHtcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVNjcmVlbk5hbWVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nU2NyZWVuTmFtZXMnXSkge1xuICAgICAgICB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVQYXJhbWV0ZXJzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nUGFyYW1ldGVycyddKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGFyYW1ldGVyT3B0aW9ucyBjaGFuZ2VkXCIsIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1sndXBsb2FkT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVVcGxvYWRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nVXBsb2FkcyddKSB7XG4gICAgICAgIC8vIENsZWFyIHNlbGVjdCBjb25maWcgY2FjaGUgZm9yIHVwbG9hZCB2YXJpYWJsZXNcbiAgICAgICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzIGFuZCByYXcgdmFsdWVzIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzXG4gICAgICAvLyBOT1RFOiBXZSBkbyBOT1QgaW5jbHVkZSAncGFyYW1ldGVyT3B0aW9ucycgaGVyZSBiZWNhdXNlIGl0IGNoYW5nZXMgb24gZXZlcnkgc2VhcmNoLFxuICAgICAgLy8gd2hpY2ggd291bGQgcmVzZXQgdGhlIHRlc3QtZGF0YSB0eXBlIGRyb3Bkb3duLiBJbnN0ZWFkLCBwYXJhbWV0ZXJPcHRpb25zIGluaXRpYWxpemF0aW9uXG4gICAgICAvLyBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVsb3cgd2l0aCBhIGZpcnN0Q2hhbmdlIGd1YXJkLlxuICAgICAgaWYgKChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSkgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiB0ZW1wbGF0ZVZhcmlhYmxlcyBjaGFuZ2VkLCBpbml0aWFsaXplIHNjcmVlbiBuYW1lIGZvcm0gY29udHJvbHMgZm9yIGVsZW1lbnQgdmFyaWFibGVzIHRoYXQgaGF2ZSBzY3JlZW5OYW1lSWRcbiAgICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHNjcmVlbiBuYW1lIGZvcm0gY29udHJvbCB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA/IFN0cmluZyh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIDogJ25vbmUnO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgaXQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA/IFN0cmluZyh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIDogJ25vbmUnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IGV4cGVjdGVkVmFsdWUgJiYgY3VycmVudFZhbHVlICE9PSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoZXhwZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBzY3JlZW5OYW1lSWQgYnV0IG5vdCBzZWxlY3RlZFNjcmVlbk5hbWUsIGZpbmQgaXQgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSAmJiB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGluZ1NjcmVlbk5hbWUgPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nU2NyZWVuTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgdXBkYXRlIHNlbGVjdGVkU2NyZWVuTmFtZSBmb3IgdmFyaWFibGVzIHRoYXQgaGF2ZSBzY3JlZW5OYW1lSWRcbiAgICAgIGlmIChjaGFuZ2VzWydzY3JlZW5OYW1lT3B0aW9ucyddICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCAmJiAhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1NjcmVlbk5hbWUgPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IG1hdGNoaW5nU2NyZWVuTmFtZS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGVsZW1lbnRPcHRpb25zIG9yIHNjcmVlbk5hbWVPcHRpb25zIGNoYW5nZWQsIHJlLWluaXRpYWxpemUgZWxlbWVudCB2YXJpYWJsZXNcbiAgICAgIGlmICgoY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydzY3JlZW5OYW1lT3B0aW9ucyddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIC8vIENsZWFyIGVsZW1lbnQgY29uZmlnIGNhY2hlIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gZWxlbWVudHMgYXJlIGxvYWRlZCBhZnRlciBzY3JlZW4gbmFtZSBzZWxlY3Rpb24sIHRoZSBjb25maWcgaXMgcmVjb21wdXRlZFxuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgICAvLyBJZiBubyBlbGVtZW50SWQsIGRvbid0IHNlbGVjdCBhbnl0aGluZyAtIHVzZSBkZWZhdWx0IHZhbHVlc1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudElkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogRmluZCBieSBlbGVtZW50SWQgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAyOiBGaW5kIGJ5IGVsZW1lbnROYW1lIGlmIGVsZW1lbnRJZCBzZWFyY2ggZGlkbid0IGZpbmQgaXQgKGZhbGxiYWNrKVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5uYW1lID09PSB2YXJpYWJsZS5lbGVtZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDM6IEZpbmQgYnkgbG9jYXRvclZhbHVlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5sb2NhdG9yVmFsdWUgPT09IGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAvLyBTZXQgc2NyZWVuIG5hbWUgaW5mbyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgZWxlbWVudC5zY3JlZW5OYW1lT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IGVsZW1lbnQuc2NyZWVuTmFtZU9iai5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBlbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbChzY3JlZW5OYW1lSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBmb3JtIGNvbnRyb2wgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSB2YWxpZCBzY3JlZW4gbmFtZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVzZXR0aW5nIHVzZXIncyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVTdHIgPSBjdXJyZW50VmFsdWUgIT0gbnVsbCA/IFN0cmluZyhjdXJyZW50VmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlU3RyICE9PSBzY3JlZW5OYW1lSWRTdHJpbmcgJiYgY3VycmVudFZhbHVlU3RyICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldC91cGRhdGUgZWxlbWVudCBkZXRhaWxzIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgZWxlbWVudE5hbWUgaWYgaXQgd2Fzbid0IGFscmVhZHkgc2V0IChwcmVzZXJ2ZSBmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gRm9yIHNlbGVjdG9yLCB1c2UgZWxlbWVudExvY2F0b3IgYXMgdmFsdWU7IGZvciBvdGhlcnMsIHVzZSBlbGVtZW50TmFtZVxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YXJpYWJsZS52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50Lm5hbWUgfHwgZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2woZWxlbWVudC5pZCkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5vdCBmb3VuZCBpbiBlbGVtZW50T3B0aW9ucyB5ZXQgLSBtaWdodCBuZWVkIHRvIGZldGNoXG4gICAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZWxlbWVudElkIGJ1dCBlbGVtZW50IGlzbid0IGZvdW5kLCB3ZSBtaWdodCBuZWVkIHRvIGZldGNoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBrbm93IHRoZSBzY3JlZW4gbmFtZSB5ZXQsIHNvIHdlJ2xsIHdhaXQgZm9yIGVsZW1lbnRPcHRpb25zIHRvIGJlIGxvYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgLy8gQnV0IGRvbid0IG92ZXJyaWRlIHVzZXIncyBzY3JlZW4gbmFtZSBzZWxlY3Rpb24gaWYgdGhleSd2ZSBhbHJlYWR5IHNlbGVjdGVkIG9uZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZm9ybSBjb250cm9sIGhhcyBhIHZhbGlkIHNjcmVlbiBuYW1lIChub3QgJ25vbmUnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB0byBkZWZhdWx0IHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLy8gU2NyZWVuIG5hbWUgc2hvdWxkIGJlICdub25lJyAoU2VsZWN0IG9wdGlvbilcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKCdub25lJykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBJRCBzaG91bGQgYmUgbnVsbFxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGFsbCBjb25maWdzIHRvIGF2b2lkIGNhbGxpbmcgbWV0aG9kcyBpbiB0ZW1wbGF0ZVxuICAgICAgLy8gVGhpcyB3aWxsIHJlY29tcHV0ZSBlbGVtZW50IGNvbmZpZ3Mgd2l0aCB0aGUgbmV3IGVsZW1lbnRPcHRpb25zXG4gICAgICAvLyBPbmx5IHByZWNvbXB1dGUgaWYgdGVtcGxhdGVWYXJpYWJsZXMgZXhpc3QgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucHJlY29tcHV0ZUNvbmZpZ3MoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciByZWNvbXB1dGluZyBjb25maWdzIChvbmx5IG9uY2UgYXQgdGhlIGVuZClcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgXG4gICAgICAvLyBJZiBlbnZpcm9ubWVudCBvcHRpb25zIGNoYW5nZWQsIHJlZnJlc2ggcGFyYW1ldGVyIGNvbmZpZ3MgYW5kIHJlLWluaXQgYW55IHVuaW5pdGlhbGl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIGFuZCByZWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIHRoZSBmaXJzdCB0aW1lIGVudmlyb25tZW50T3B0aW9ucyBhcnJpdmUsIHJlLWluaXRpYWxpemUgYW55IGVudmlyb25tZW50LXR5cGUgdmFyaWFibGVzXG4gICAgICAgIC8vIHRoYXQgd2VyZW4ndCBib3VuZCB5ZXQgKG9wdGlvbnMgd2VyZSBlbXB0eSB3aGVuIHRlbXBsYXRlVmFyaWFibGVzIGZpcnN0IGxvYWRlZCkuXG4gICAgICAgIC8vIE9ubHkgcnVucyBpbiBkZWJ1ZyBtb2RlIHRvIGF2b2lkIGludGVyZmVyaW5nIHdpdGggbm9uLWRlYnVnIHN0ZXAtYnVpbGRlciBwcmUtZmlsbCBmbG93cy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNEZWJ1ZyAmJlxuICAgICAgICAgIGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddLmZpcnN0Q2hhbmdlICYmXG4gICAgICAgICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiYgdi5kYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JyAmJiAhdi5zZWxlY3RlZEVudmlyb25tZW50XG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLXJ1biBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMgd2hlbmV2ZXIgcGFyYW1ldGVyT3B0aW9ucyBjaGFuZ2VzIGFuZCB0aGVyZSBhcmUgc3RpbGxcbiAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IG5lZWQgaW5pdGlhbGl6YXRpb24gKGhhdmUgcHJvZmlsZUlkIGJ1dCBtaXNzaW5nIHByb2ZpbGUgbmFtZSBvciBkYXRhU2V0KS5cbiAgICAgIC8vIFdlIGRvIE5PVCB1c2UgZmlyc3RDaGFuZ2UgaGVyZSBiZWNhdXNlIHRoZSBzYXZlZCBwcm9maWxlIG1heSBhcnJpdmUgaW4gYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgIC8vIChpZEA8cHJvZmlsZUlkPikgYWZ0ZXIgdGhlIGluaXRpYWwgcGFnaW5hdGVkIGxpc3QsIHNvIGZpcnN0Q2hhbmdlIHdvdWxkIG1pc3MgaXQuXG4gICAgICAvLyBUaGUgaW5uZXIgc29tZSgpIGd1YXJkIGVuc3VyZXMgd2Ugb25seSByZS1ydW4gd2hlbiB2YXJpYWJsZXMgYXJlIHN0aWxsIGluY29tcGxldGUsXG4gICAgICAvLyBwcmV2ZW50aW5nIHVubmVjZXNzYXJ5IHJlLXJ1bnMgb24gdXNlciBzZWFyY2ggdXBkYXRlcy5cbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddICYmXG4gICAgICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgIChcbiAgICAgICAgICAvLyBDaGVjayBpZiBhbnkgdmFyaWFibGUgaGFzIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgYnV0IGlzIG1pc3Npbmcgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgb3Igc2VsZWN0ZWREYXRhU2V0XG4gICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gbG9hZGluZyBhIHNhdmVkIHN0ZXAgLSBzZXRUZW1wbGF0ZVZhcmlhYmxlcyBzZXRzIHRoZSBJRCwgYnV0IHdlIG5lZWQgcGFyYW1ldGVyT3B0aW9ucyB0byBzZXQgdGhlIG5hbWUgYW5kIGRhdGEgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8uc29tZSh2ID0+XG4gICAgICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2KSAmJlxuICAgICAgICAgICAgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgICAgIHYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmXG4gICAgICAgICAgICAoIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgIXYuc2VsZWN0ZWREYXRhU2V0KVxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2KSAmJiB2LmRhdGFUeXBlID09PSAncGFyYW1ldGVyJyAmJiAhdi5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAvLyBUaGUgZXh0cmEgdW5pbml0aWFsaXplZC12YXJpYWJsZSBjaGVjayBiZWxvdyBpcyBkZWJ1Zy1vbmx5OiBvbmx5IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgICAgLy8gdG8gYXZvaWQgZG91YmxlLWluaXRpYWxpc2luZyB2YXJpYWJsZXMgaW4gbm9uLWRlYnVnIHN0ZXAtYnVpbGRlciBmbG93cy5cbiAgICAgICAgICAodGhpcy5pc0RlYnVnICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiYgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiYgIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVcbiAgICAgICAgICApKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIEluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlc1wiLCBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10pO1xuICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBub3cgdGhhdCBwYXJhbWV0ZXJPcHRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBhZnRlciBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgcGFyYW1ldGVyIG9wdGlvbnMgb3IgbG9hZGluZyBzdGF0ZSBjaGFuZ2VkLCByZWZyZXNoIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ3MgKHNvIHNlYXJjaC9sb2FkIG1vcmUgYW5kIG9wdGlvbnMgc3RheSBpbiBzeW5jKVxuICAgICAgaWYgKGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlUGFyYW1ldGVycyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1BhcmFtZXRlcnMnXSB8fFxuICAgICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcInBhcmFtZXRlck9wdGlvbnMgUmVmcmVzaFRlc3REYXRhVmFyaWFibGVzXCIsIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSk7XG4gICAgICAgIC8vIENsZWFyIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgY2FjaGUgc2luY2UgcHJvZmlsZXMgbGlzdCBvciBsb2FkaW5nIHN0YXRlIG1heSBoYXZlIGNoYW5nZWRcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1BhcmFtZXRlclR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUgZm9yIGNhY2hlIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHt2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICAvLyBQcmVzZXJ2ZSBleGlzdGluZyBkYXRhVHlwZSBpZiBhbHJlYWR5IHNldCAoZS5nLiwgZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcyB3aGVuIGxvYWRpbmcgc2F2ZWQgc3RlcClcbiAgICAgICAgY29uc3QgZXhpc3RpbmdEYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlO1xuICAgICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAvLyBTZXQgcHJvcGVydGllcyBkaXJlY3RseSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBkYXRhVHlwZSBpZiBpdCB3YXMgYWxyZWFkeSBzZXQsIG90aGVyd2lzZSB1c2UgcGFyc2VkIGRhdGFUeXBlXG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZXhpc3RpbmdEYXRhVHlwZSB8fCBkYXRhVHlwZTtcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgdHlwZSBpbiB0aGUgRm9ybUFycmF5XG4gICAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZTsgLy8gVXNlIHRoZSBmaW5hbCBkYXRhVHlwZSAoZXhpc3Rpbmcgb3IgcGFyc2VkKVxuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGZpbmFsRGF0YVR5cGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpPy5zZXRWYWx1ZShmaW5hbERhdGFUeXBlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBwYXJhbWV0ZXIgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3QgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKGZpbmFsRGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBVc2Ugc2F2ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0U3RlcC50ZXN0RGF0YUxpc3QgKHNldCBieSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VlZCBpZiBwYXJhbWV0ZXJPcHRpb25zIGFyZSBsb2FkZWRcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgcHJvZmlsZVRvVXNlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICBsZXQgZGF0YVNldFRvVXNlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHZhcmlhYmxlIGFscmVhZHkgaGFzIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgKGZyb20gc2F2ZWQgc3RlcClcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4IGlzIHByb3ZpZGVkLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiBwcm9maWxlVG9Vc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGF0YSBzZXQgaGFzIHRoZSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgZm91bmQgYnkgcGFyYW1ldGVyIG5hbWUsIHVzZSBmaXJzdCBkYXRhIHNldCBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFTZXRUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IFVzZSBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBmcm9tIHRlc3QgY2FzZVxuICAgICAgICAgICAgICBpZiAoIXByb2ZpbGVUb1VzZSAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgcHJvZmlsZVRvVXNlLmRhdGEgJiYgcHJvZmlsZVRvVXNlLmRhdGEubGVuZ3RoID4gdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICBkYXRhU2V0VG9Vc2UgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBwcm9maWxlIGFuZCBkYXRhIHNldCwgc2V0IHRoZSB2YXJpYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgZGF0YVNldFRvVXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBwcm9maWxlVG9Vc2UubmFtZSB8fCBwcm9maWxlVG9Vc2UudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGF0YVNldFRvVXNlLm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IHZhcmlhYmxlIHByb3BlcnRpZXMgLSB0aGlzIGVuc3VyZXMgaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUoKSBhbmQgaGFzU2VsZWN0ZWREYXRhU2V0KCkgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBwcm9maWxlVG9Vc2UuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgd2l0aCB0aGUgYWN0dWFsIHZhbHVlcyBzbyBkcm9wZG93bnMgZGlzcGxheSBzZWxlY3RlZCBvcHRpb25zXG4gICAgICAgICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHN0cmluZykgZm9yIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlIGZvcm0gY29udHJvbCB0byBtYXRjaCBvcHRpb24uaWQgZm9ybWF0XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKHByb2ZpbGVUb1VzZS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChwcm9maWxlSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTZXQgcGFyYW1ldGVyIHZhbHVlIGlmIHdlIGZvdW5kIGl0IGluIHRoZSBkYXRhIHNldCwgb3RoZXJ3aXNlIGNsZWFyIGl0IGZvciB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgdGhlIHBhcmFtZXRlciBpbiBhIGRhdGEgc2V0LCBzZXQgaXQ7IG90aGVyd2lzZSBjbGVhciBmb3IgdXNlciBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSByYXdWYWx1ZSAmJiBkYXRhU2V0VG9Vc2UgJiYgZGF0YVNldFRvVXNlLmRhdGEgJiYgZGF0YVNldFRvVXNlLmRhdGEuaGFzT3duUHJvcGVydHkocmF3VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gdmFyaWFibGUudmFsdWUgLy8gVXNlIHRoZSBmb3JtYXR0ZWQgdmFsdWUgKGUuZy4sIEB8dDY2NjY2NnwpXG4gICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1WYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIHZhcmlhYmxlIHRvIGVuc3VyZSBmcmVzaCBjb25maWdzXG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogSWYgbm8gc2F2ZWQgb3IgZGVmYXVsdCBwcm9maWxlIGZvdW5kLCBzZWFyY2ggYnkgcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gTm8gZGVmYXVsdCB2YWx1ZXMgLSB1c2UgZXhpc3RpbmcgbG9naWMgdG8gZmluZCBmcm9tIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIHRoaXMgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIHRlc3QgZGF0YSBwcm9maWxlcyBhbmQgdGhlaXIgZGF0YSBzZXRzXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kUHJvZmlsZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmREYXRhU2V0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGVzdERhdGFQcm9maWxlIG9mIHRoaXMucGFyYW1ldGVyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgaWYgKHRlc3REYXRhUHJvZmlsZS5kYXRhICYmIHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyBpbiB0aGlzIHByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhU2V0IG9mIHRlc3REYXRhUHJvZmlsZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhICYmIGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZERhdGFTZXQgPSBkYXRhU2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRQcm9maWxlICYmIGZvdW5kRGF0YVNldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSBmb3VuZFByb2ZpbGUubmFtZSB8fCBmb3VuZFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBmb3VuZERhdGFTZXQubmFtZTtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSBwcm9maWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBmb3VuZFByb2ZpbGUuaWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChwcm9maWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVOYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBwYXJhbSBuYW1lIChmb3IgZHJvcGRvd24gZGlzcGxheSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1OYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseSBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHBhcmFtTmFtZSwgJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgbm90IGZvdW5kLCBmb3JtYXQgdGhlIHJhdyB2YWx1ZSBpZiBpdCdzIGEgcGFyYW1ldGVyIHR5cGVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3QgZW52aXJvbm1lbnQgYW5kIHBhcmFtZXRlclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQgdmFsdWVzIGFyZSBpbiBmb3JtYXQgKnxwYXJhbWV0ZXJOYW1lfFxuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcmF3VmFsdWU7XG4gICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzYXZlZCBlbnZpcm9ubWVudElkLCB1c2UgaXQgZm9yIGFuIGV4YWN0IG1hdGNoIChlbnYte2lkfS17cGFyYW19KVxuICAgICAgICAgICAgICAvLyB0byBhdm9pZCBzZWxlY3RpbmcgdGhlIHdyb25nIGVudmlyb25tZW50IHdoZW4gbXVsdGlwbGUgZW52aXJvbm1lbnRzIHNoYXJlIHBhcmFtIG5hbWVzLlxuICAgICAgICAgICAgICBsZXQgZW52T3B0aW9uOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGFjdElkID0gYGVudi0ke3ZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZH0tJHtwYXJhbU5hbWV9YDtcbiAgICAgICAgICAgICAgICBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuaWQgPT09IGV4YWN0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBtYXRjaCBieSBwYXJhbSBuYW1lIG9ubHkgKGxlZ2FjeSAvIGZpcnN0LXRpbWUgc2F2ZSlcbiAgICAgICAgICAgICAgaWYgKCFlbnZPcHRpb24pIHtcbiAgICAgICAgICAgICAgICBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYubmFtZSA9PT0gcGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gZW52T3B0aW9uLmVudmlyb25tZW50O1xuXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbmQgc3RvcmUgZW52aXJvbm1lbnQgSUQgZnJvbSB0aGUgb3B0aW9uIGlkXG4gICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChlbnZPcHRpb24uZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZW52T3B0aW9uLmVudmlyb25tZW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGAqfCR7cGFyYW1OYW1lfXxgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBlbGVtZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgLy8gSWYgbm8gZWxlbWVudElkLCBkb24ndCBzZWxlY3QgYW55dGhpbmcgLSB1c2UgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gdmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAzOiBGaW5kIGJ5IGxvY2F0b3JWYWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubG9jYXRvclZhbHVlID09PSBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgZWxlbWVudC5zY3JlZW5OYW1lT2JqKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayB0byBlbnN1cmUgVUkgdXBkYXRlcyBhZnRlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSBmcm9tIEZvcm1BcnJheSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGF0IGEgc3BlY2lmaWMgaW5kZXggZnJvbSBGb3JtQXJyYXkgKGZvciB0ZW1wbGF0ZSB1c2UpICovXG4gIGdldEZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIHByaXZhdGUgcHJlY29tcHV0ZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSByZXR1cm47XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgYWxsIHNlbGVjdCBjb25maWdzXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIC8vIFByZS1jb21wdXRlIHJlZ3VsYXIgc2VsZWN0IGNvbmZpZ3NcbiAgICAgIGlmICh0aGlzLnNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhpcy5nZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZGF0YSB0eXBlIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgcGFyYW1ldGVyIGFuZCBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlncyBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZyBpZiB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWcgaWYgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGlmIGVudmlyb25tZW50IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcmUtY29tcHV0ZSBlbGVtZW50IHZhcmlhYmxlIGNvbmZpZ3MgKHNjcmVlbiBuYW1lICsgZWxlbWVudClcbiAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbGVtZW50IGNvbmZpZyBpZiBzY3JlZW4gbmFtZSBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICB0aGlzLmdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIHBhcnNlVGVzdERhdGFWYWx1ZSh2YWx1ZTogc3RyaW5nKTogeyBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnLCByYXdWYWx1ZTogc3RyaW5nIH0ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6ICcnIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBwYXJhbWV0ZXIgZm9ybWF0OiBAfHZhbHVlfFxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGFyYW1ldGVyJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgcnVudGltZSBmb3JtYXQ6ICR8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3J1bnRpbWUnLCByYXdWYWx1ZTogdmFsdWUuc2xpY2UoMiwgLTEpIH07XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBlbnZpcm9ubWVudCBmb3JtYXQ6ICp8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBQbGFpbiB0ZXh0IChubyBmb3JtYXR0aW5nKVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6IHZhbHVlIH07XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHN0cmluZyB7XG4gICAgaWYgKCFyYXdWYWx1ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdwYXJhbWV0ZXInOlxuICAgICAgICByZXR1cm4gYEB8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ3J1bnRpbWUnOlxuICAgICAgICByZXR1cm4gYCR8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ2Vudmlyb25tZW50JzpcbiAgICAgICAgcmV0dXJuIGAqfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdwbGFpbi10ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByYXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIGdldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIEZvciBlbGVtZW50IHZhcmlhYmxlcywgaW5jbHVkZSBlbGVtZW50T3B0aW9ucywgaGFzTW9yZUVsZW1lbnRzLCBhbmQgaXNMb2FkaW5nRWxlbWVudHMgaW4gY2FjaGUga2V5XG4gICAgLy8gRm9yIHVwbG9hZCB2YXJpYWJsZXMsIGluY2x1ZGUgdXBsb2FkT3B0aW9ucywgaGFzTW9yZVVwbG9hZHMsIGFuZCBpc0xvYWRpbmdVcGxvYWRzIGluIGNhY2hlIGtleVxuICAgIC8vIE9wdGltaXplIGNhY2hlIGtleSBjb21wdXRhdGlvbiAtIHVzZSBsZW5ndGggaW5zdGVhZCBvZiBmdWxsIGFycmF5IGpvaW4gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGlzRWxlbWVudFZhcmlhYmxlID0gdmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCc7XG4gICAgY29uc3QgaXNVcGxvYWRWYXJpYWJsZSA9IHZhcmlhYmxlLm5hbWUgPT09ICd1cGxvYWQnICYmIHZhcmlhYmxlLnR5cGUgPT09ICdkcm9wZG93bic7XG4gICAgXG4gICAgY29uc3Qgb3B0aW9uc0tleSA9IGlzRWxlbWVudFZhcmlhYmxlXG4gICAgICA/IGAke3RoaXMuZWxlbWVudE9wdGlvbnMubGVuZ3RofV8ke3RoaXMuZWxlbWVudE9wdGlvbnMubWFwKGVsID0+IGVsLmlkIHx8ICcnKS5qb2luKCcsJyl9YFxuICAgICAgOiBpc1VwbG9hZFZhcmlhYmxlXG4gICAgICA/IGAke3RoaXMudXBsb2FkT3B0aW9ucy5sZW5ndGh9XyR7dGhpcy51cGxvYWRPcHRpb25zLm1hcCgodXA6IGFueSkgPT4gdXAuaWQgfHwgdXAubmFtZSB8fCAnJykuam9pbignLCcpfWBcbiAgICAgIDogYCR7dmFyaWFibGUub3B0aW9ucz8ubGVuZ3RoIHx8IDB9XyR7dmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnfWA7XG4gICAgXG4gICAgLy8gSW5jbHVkZSBoYXNNb3JlIGFuZCBpc0xvYWRpbmcgaW4gY2FjaGUga2V5IGZvciBlbGVtZW50IGFuZCB1cGxvYWQgdmFyaWFibGVzXG4gICAgY29uc3QgY2FjaGVLZXkgPSBpc0VsZW1lbnRWYXJpYWJsZVxuICAgICAgPyBgJHt2YXJpYWJsZS5uYW1lfV8ke29wdGlvbnNLZXl9XyR7dGhpcy5oYXNNb3JlRWxlbWVudHN9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZVVwbG9hZHN9XyR7dGhpcy5pc0xvYWRpbmdVcGxvYWRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGZvciBlbGVtZW50IHZhcmlhYmxlcywgdXBsb2FkT3B0aW9ucyBmb3IgdXBsb2FkIHZhcmlhYmxlcywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAoaXNFbGVtZW50VmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBvcHRpb25zQXJyYXkgPSB0aGlzLmVsZW1lbnRPcHRpb25zXG4gICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGxvY2F0b3JWYWx1ZSwgLy8gVXNlIGxvY2F0b3JWYWx1ZSBhcyBpZCBzbyBpdCBnZXRzIHJldHVybmVkIGFzIHRoZSB2YWx1ZVxuICAgICAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiBsb2NhdG9yVmFsdWUsIC8vIEFsc28gc2V0IHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgbmFtZTogYCR7ZWwubmFtZX0gKCR7ZWwuc2NyZWVuTmFtZU9iaj8ubmFtZSB8fCAnJ30pYCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICAgICAgb3RoZXJMb2NhdG9yOiBlbC5vdGhlckxvY2F0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVXBsb2FkVmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciB1cGxvYWQgb3B0aW9ucywgbWFwIHVwbG9hZCBvYmplY3RzIHRvIFNlbGVjdE9wdGlvbiBmb3JtYXRcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMudXBsb2FkT3B0aW9ucy5tYXAoKHVwbG9hZDogYW55KSA9PiB7XG4gICAgICAgIC8vIEFzc3VtaW5nIHVwbG9hZCBoYXMgaWQsIG5hbWUsIG9yIHNpbWlsYXIgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB1cGxvYWRJZCA9IHVwbG9hZC5pZD8udG9TdHJpbmcoKSB8fCB1cGxvYWQubmFtZSB8fCAnJztcbiAgICAgICAgY29uc3QgdXBsb2FkTmFtZSA9IHVwbG9hZC5uYW1lIHx8IHVwbG9hZC5maWxlTmFtZSB8fCB1cGxvYWRJZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdXBsb2FkSWQsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkLFxuICAgICAgICAgIG5hbWU6IHVwbG9hZE5hbWUsXG4gICAgICAgICAgbGFiZWw6IHVwbG9hZE5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQudmFsdWUsIHZhbHVlOiBvcHQudmFsdWUsIG5hbWU6IG9wdC5sYWJlbCwgbGFiZWw6IG9wdC5sYWJlbH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIGVsZW1lbnQgdmFyaWFibGVzXG4gICAgaWYgKGlzRWxlbWVudFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIGRyb3Bkb3duXG4gICAgICBjb25maWcuc2VydmVyU2VhcmNoID0gdHJ1ZTsgLy8gRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaFxuICAgICAgY29uZmlnLmhhc01vcmUgPSB0aGlzLmhhc01vcmVFbGVtZW50cztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ0VsZW1lbnRzO1xuICAgICAgY29uZmlnLm9uTG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVFbGVtZW50cy5lbWl0KCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uU2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRW1pdCBzZWFyY2ggZXZlbnQgd2hlbiB1c2VyIHR5cGVzIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbG9hZCBtb3JlIGFuZCBzZWFyY2ggc3VwcG9ydCBmb3IgdXBsb2FkIHZhcmlhYmxlc1xuICAgIGlmIChpc1VwbG9hZFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHVwbG9hZCBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlVXBsb2FkcztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ1VwbG9hZHM7XG4gICAgICBjb25maWcub25Mb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVVwbG9hZHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaFVwbG9hZHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRlc3QtZGF0YSB2YXJpYWJsZSwgcGFyc2UgYW5kIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGRhdGEgdHlwZVxuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgIGNvbnN0IHsgZGF0YVR5cGU6IHBhcnNlZERhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgY29uc3QgY3VycmVudERhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgPVxuICAgICAgICAodmFyaWFibGUuZGF0YVR5cGUgYXMgYW55KSB8fCAncGxhaW4tdGV4dCc7XG5cbiAgICAgIC8vIENSSVRJQ0FMOiBXaGVuIHVzZXIgaXMgaW4gJ3BhcmFtZXRlcicgbW9kZSBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkgKGUuZy4sIHdoZW5cbiAgICAgIC8vIHNlbGVjdGluZy9jaGFuZ2luZyB0ZXN0LWRhdGEgcHJvZmlsZSwgd2hpY2ggY2xlYXJzIHRoZSB2YWx1ZSB0ZW1wb3JhcmlseSksIHdlIG11c3RcbiAgICAgIC8vIE5PVCBjaGFuZ2UgdGhlIGRhdGFUeXBlIGJhY2sgdG8gJ3BsYWluLXRleHQnLiBLZWVwIGl0IGFzICdwYXJhbWV0ZXInLlxuICAgICAgLy8gT25seSBjaGFuZ2UgZGF0YVR5cGUgaWY6XG4gICAgICAvLyAxLiBUaGUgcGFyc2VkIHR5cGUgbWF0Y2hlcyBjdXJyZW50IHR5cGUgKG5vIGNoYW5nZSBuZWVkZWQpLCBPUlxuICAgICAgLy8gMi4gVGhlIHZhbHVlIGlzIG5vdCBlbXB0eSAodXNlciBpcyBhY3R1YWxseSB0eXBpbmcvc2VsZWN0aW5nIGEgdmFsdWUpLCBPUlxuICAgICAgLy8gMy4gV2UncmUgc3dpdGNoaW5nIEZST00gcGxhaW4tdGV4dCBUTyBwYXJhbWV0ZXIgKGFsbG93IHRoaXMgdHJhbnNpdGlvbilcbiAgICAgIGxldCBmaW5hbERhdGFUeXBlID0gcGFyc2VkRGF0YVR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnREYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgcGFyc2VkRGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSlcbiAgICAgICkge1xuICAgICAgICAvLyBLZWVwIGFzIHBhcmFtZXRlciAtIGRvbid0IGNoYW5nZSB0byBwbGFpbi10ZXh0XG4gICAgICAgIGZpbmFsRGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH1cblxuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlO1xuICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGRhdGEgdHlwZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJyk/LnNldFZhbHVlKGZpbmFsRGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgfVxuICBcbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gTm90ZTogSWYgdmFyaWFibGUgZG9lc24ndCBleGlzdCBpbiBGb3JtQXJyYXksIGl0IHNob3VsZCBiZSBhZGRlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZUJvb2xlYW5DaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMgKGRhdGFLZXkgPT09ICdlbGVtZW50JyksIHdlIHVzZSBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgLy8gU28gcmV0dXJuIGZhbHNlIHRvIHVzZSB0aGUgY2FzY2FkaW5nIGRyb3Bkb3duIHBhdHRlcm5cbiAgICBjb25zdCByZXN1bHQgPSB2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnO1xuICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgbmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgY29uc3QgZGF0YUtleSA9IHZhcmlhYmxlLmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZSc7XG4gICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RhdGljIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVPcHRpb25zO1xuICB9XG4gIFxuICBnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVR5cGVgO1xuICAgIGlmICh0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFUeXBlJywgLy8gVXNlICdkYXRhVHlwZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVHlwZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIGdldEN1cnJlbnREYXRhVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgfVxuICBcbiAgZ2V0UmF3VmFsdWUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YXJpYWJsZS5yYXdWYWx1ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGFyYW1ldGVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgb25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgZGF0YSB0eXBlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGRhdGFUeXBlO1xuICAgIFxuICAgIC8vIENsZWFyIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZyBjYWNoZXMgc2luY2UgZGF0YSB0eXBlIGNoYW5nZWRcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2RhdGFTZXRgKTtcbiAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9wYXJhbUZvckRhdGFTZXRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52aXJvbm1lbnRgKTtcbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZW52UGFyYW1gKTtcbiAgICBcbiAgICAvLyBHZXQgdGhlIHZhcmlhYmxlIGdyb3VwXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgaWYgc3dpdGNoaW5nIGF3YXkgZnJvbSBwYXJhbWV0ZXIgdHlwZVxuICAgIGlmIChkYXRhVHlwZSAhPT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBwYXJhbWV0ZXItcmVsYXRlZCBmb3JtIGNvbnRyb2xzIHdoZW4gc3dpdGNoaW5nIGF3YXkgZnJvbSBwYXJhbWV0ZXIgdHlwZVxuICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdoZW4gc3dpdGNoaW5nIFRPIHBhcmFtZXRlciB0eXBlLCBjbGVhciBwcmV2aW91cyBzZWxlY3Rpb25zIHRvIHN0YXJ0IGZyZXNoXG4gICAgICAvLyAodW5sZXNzIGRlZmF1bHQgdmFsdWVzIGFyZSBwcm92aWRlZCwgd2hpY2ggd2lsbCBiZSBzZXQgYmVsb3cpXG4gICAgICBpZiAoIXRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkIHx8IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBmb3JtIGNvbnRyb2xzIGlmIHRoZXkgZXhpc3RcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIGVudmlyb25tZW50IGlmIHN3aXRjaGluZyBhd2F5IGZyb20gZW52aXJvbm1lbnQgdHlwZVxuICAgIGlmIChkYXRhVHlwZSAhPT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGVudmlyb25tZW50LXJlbGF0ZWQgZm9ybSBjb250cm9sc1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgdmFsdWUgd2hlbiBzd2l0Y2hpbmcgZGF0YSB0eXBlcyAoc3RhcnQgZnJlc2gpXG4gICAgdmFyaWFibGUudmFsdWUgPSAnJztcbiAgICBcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIGJhc2VkIG9uIG5ldyBkYXRhIHR5cGUgKHdpbGwgYmUgZW1wdHkgc3RyaW5nKVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKCcnLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChhbHdheXMgc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGluIHZhcmlhYmxlKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgIC8vIEZvciBhbGwgdHlwZXMsIHN0YXJ0IHdpdGggZW1wdHkgdmFsdWUgd2hlbiBzd2l0Y2hpbmdcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgYWxzbyBjbGVhciBzZWxlY3RlZEVudmlyb25tZW50XG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JyAmJiB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8gcGFyYW1ldGVyIHR5cGUsIGNoZWNrIGZvciBkZWZhdWx0IHZhbHVlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgIC8vIFVzZSBwcm9maWxlIElEIChzdHJpbmcpIGZvciBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZSBmb3JtIGNvbnRyb2wgdG8gbWF0Y2ggb3B0aW9uLmlkIGZvcm1hdFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcoZGVmYXVsdFByb2ZpbGUuaWQpO1xuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2xlYXIgY2FjaGVzIHRvIGZvcmNlIHJlY29tcHV0YXRpb24gb2YgY29uZmlncyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtS2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgdGhlIG5ldyBzZWxlY3QgY29uZmlnIGlmIG5lZWRlZFxuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBjb25maWdcbiAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBJZiBhIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWQsIHByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGNvbnNvbGUubG9nKCdvbkRhdGFUeXBlQ2hhbmdlJywgdmFyaWFibGVOYW1lLCBkYXRhVHlwZSwgZm9ybWF0dGVkVmFsdWUpO1xuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudCB3aXRoIGZvcm1hdHRlZCB2YWx1ZVxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cbiAgXG4gIG9uRWxlbWVudFNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gT25seSBoYW5kbGUgc2VhcmNoIGZvciBzZWxlY3RvciB2YXJpYWJsZXNcbiAgICAvLyBUaGUga2V5IHdpbGwgYmUgJ3ZhbHVlJyBzaW5jZSB0aGF0J3Mgd2hhdCB3ZSBzZXQgaW4gdGhlIGNvbmZpZ1xuICAgIC8vIEVtaXQgdGhlIHNlYXJjaCBxdWVyeSB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgcmF3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgcmF3IHZhbHVlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHJhd1ZhbHVlO1xuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IGRhdGEgdHlwZVxuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgdmFsdWUgYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWVcbiAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXMgZnJvbSBwYXJhbWV0ZXIgb3B0aW9ucyAocmF3IFRlc3REYXRhIG9iamVjdHMpXG4gICAqL1xuICBnZXRVbmlxdWVUZXN0RGF0YVByb2ZpbGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgcHJvZmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5mb3JFYWNoKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyB0ZXN0RGF0YS5uYW1lIGlzIHRoZSB0ZXN0RGF0YU5hbWUgKHByb2ZpbGUgbmFtZSlcbiAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICBpZiAocHJvZmlsZU5hbWUgJiYgIXByb2ZpbGVNYXAuaGFzKHByb2ZpbGVOYW1lKSkge1xuICAgICAgICBwcm9maWxlTWFwLnNldChwcm9maWxlTmFtZSwge1xuICAgICAgICAgIGlkOiBTdHJpbmcodGVzdERhdGEuaWQpLFxuICAgICAgICAgIG5hbWU6IHByb2ZpbGVOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb2ZpbGVzID0gQXJyYXkuZnJvbShwcm9maWxlTWFwLnZhbHVlcygpKTtcbiAgICByZXR1cm4gcHJvZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgc2V0cyBmb3IgYSBzcGVjaWZpYyB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBSZXR1cm5zIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZSdzIGRhdGEgYXJyYXlcbiAgICovXG4gIGdldERhdGFTZXRzRm9yVGVzdERhdGFQcm9maWxlKHByb2ZpbGVJZDogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBpZFxuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWQpO1xuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGVzdERhdGFQcm9maWxlIHx8ICF0ZXN0RGF0YVByb2ZpbGUuZGF0YSB8fCB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmV0dXJuIGFsbCBkYXRhIHNldHMgZnJvbSB0aGUgcHJvZmlsZVxuICAgIHJldHVybiB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5tYXAoKGRhdGFTZXQ6IGFueSkgPT4gKHtcbiAgICAgIGlkOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgaW4gYSB0ZXN0IGRhdGEgcHJvZmlsZVxuICAgKiBFeHRyYWN0cyBwYXJhbWV0ZXIgbmFtZXMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkT3JOYW1lOiBzdHJpbmcsIGRhdGFTZXROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkIG9yIG5hbWVcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IElEIGZpcnN0IChpZiBwcm9maWxlSWRPck5hbWUgaXMgYSBudW1iZXIpXG4gICAgICBjb25zdCBpZE1hdGNoID0gIWlzTmFOKE51bWJlcihwcm9maWxlSWRPck5hbWUpKSAmJiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSk7XG4gICAgICAvLyBPdGhlcndpc2UgdHJ5IHRvIG1hdGNoIGJ5IG5hbWVcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9ICh0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZSkgPT09IHByb2ZpbGVJZE9yTmFtZTtcbiAgICAgIHJldHVybiBpZE1hdGNoIHx8IG5hbWVNYXRjaDtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNwZWNpZmljIGRhdGEgc2V0IGJ5IG5hbWVcbiAgICBjb25zdCBkYXRhU2V0ID0gdGVzdERhdGFQcm9maWxlLmRhdGEuZmluZCgoZHM6IGFueSkgPT4gZHMubmFtZSA9PT0gZGF0YVNldE5hbWUpO1xuICAgIGlmICghZGF0YVNldCB8fCAhZGF0YVNldC5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBhbGwgcGFyYW1ldGVyIGtleXMgZnJvbSB0aGUgZGF0YSBzZXQncyBkYXRhIG9iamVjdFxuICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gT2JqZWN0LmtleXMoZGF0YVNldC5kYXRhKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyTmFtZXMubWFwKHBhcmFtTmFtZSA9PiAoe1xuICAgICAgaWQ6IHBhcmFtTmFtZSxcbiAgICAgIG5hbWU6IHBhcmFtTmFtZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIHRlc3QgZGF0YSBwcm9maWxlIGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgICovXG4gIGdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgO1xuICAgIFxuICAgIC8vIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLmdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTtcbiAgICAvLyBDcmVhdGUgb3B0aW9ucyB3aXRoIHByb2ZpbGUgbmFtZSBhbmQgSUQgKGRpc3BsYXkgbmFtZSB3aXRoIElEKVxuICAgIGxldCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gcHJvZmlsZXMubWFwKHByb2ZpbGUgPT4ge1xuICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgdG8gZ2V0IHRoZSBJRFxuICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gcHJvZmlsZS5uYW1lO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9maWxlSWQgPSB0ZXN0RGF0YVByb2ZpbGU/LmlkIHx8IHByb2ZpbGUuaWQ7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBTdHJpbmcocHJvZmlsZUlkKSxcbiAgICAgICAgdmFsdWU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgbmFtZTogYCR7cHJvZmlsZS5uYW1lfWAsIC8vIERpc3BsYXkgbmFtZSB3aXRoIElEXG4gICAgICAgIGxhYmVsOiBgJHtwcm9maWxlLm5hbWV9YFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBpdFxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgIC8vIFVzZSBwcm9maWxlIElEIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBwcm9maWxlIG5hbWVcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCBcbiAgICAgICAgICA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSBcbiAgICAgICAgICA6ICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSB8fCAnJyk7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudFZhbHVlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyB1cGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBhIHNlbGVjdGVkIHByb2ZpbGVcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgdmFsdWUgaXMgc2V0IGV2ZW4gaWYgY29uZmlnIHdhcyBjYWNoZWRcbiAgICAgIC8vIFVzZSBwcm9maWxlIElEICh3aGljaCBtYXRjaGVzIG9wdC5pZCkgaW5zdGVhZCBvZiBwcm9maWxlIG5hbWUgKHdoaWNoIG1hdGNoZXMgb3B0LnZhbHVlKVxuICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgcHJvZmlsZSBJRCBleGlzdHMgaW4gb3B0aW9ucyBiZWZvcmUgc2V0dGluZ1xuICAgICAgICBjb25zdCBwcm9maWxlRXhpc3RzID0gb3B0aW9uc0FycmF5LnNvbWUob3B0ID0+IG9wdC5pZCA9PT0gcHJvZmlsZUlkU3RyaW5nKTtcbiAgICAgICAgaWYgKHByb2ZpbGVFeGlzdHMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udHJvbFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udHJvbFZhbHVlICE9PSBwcm9maWxlSWRTdHJpbmcpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlSWRTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IGlmIHdlIG9ubHkgaGF2ZSB0aGUgcHJvZmlsZSBuYW1lLCBmaW5kIHRoZSBtYXRjaGluZyBvcHRpb24gYW5kIHVzZSBpdHMgSURcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSBvcHRpb25zQXJyYXkuZmluZChvcHQgPT4gb3B0LnZhbHVlID09PSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSk7XG4gICAgICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250cm9sVmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250cm9sVmFsdWUgIT09IG1hdGNoaW5nT3B0aW9uLmlkKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUobWF0Y2hpbmdPcHRpb24uaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIC8vIEFsc28gdXBkYXRlIHRoZSB2YXJpYWJsZSdzIHByb2ZpbGUgSUQgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKG1hdGNoaW5nT3B0aW9uLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwcm9maWxlIGlzIGFsd2F5cyBpbiB0aGUgb3B0aW9ucyBsaXN0IHNvIHdoZW4gdGhlIHVzZXJcbiAgICAvLyByZW9wZW5zIHRoZSBzZWxlY3QgYWZ0ZXIgc2VhcmNoaW5nL3NlbGVjdGluZywgdGhlIHNlbGVjdGVkIG9wdGlvbiBzdGlsbCBzaG93cy5cbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlID0gdmFyaWFibGVHcm91cD8uZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsID8gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpIDogKGN1cnJlbnRGb3JtVmFsdWUgIT0gbnVsbCAmJiBjdXJyZW50Rm9ybVZhbHVlICE9PSAnJyA/IFN0cmluZyhjdXJyZW50Rm9ybVZhbHVlKSA6IG51bGwpO1xuICAgIGlmIChzZWxlY3RlZElkICYmICFvcHRpb25zQXJyYXkuc29tZShvcHQgPT4gU3RyaW5nKG9wdC5pZCkgPT09IHNlbGVjdGVkSWQpKSB7XG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkSWQ7XG4gICAgICBvcHRpb25zQXJyYXkgPSBbXG4gICAgICAgIHsgaWQ6IHNlbGVjdGVkSWQsIHZhbHVlOiBkaXNwbGF5TmFtZSwgbmFtZTogZGlzcGxheU5hbWUsIGxhYmVsOiBkaXNwbGF5TmFtZSB9LFxuICAgICAgICAuLi5vcHRpb25zQXJyYXlcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gT25seSB1c2UgY2FjaGUgaWYgdGhlIGNhY2hlZCBjb25maWcncyBvcHRpb25zIGluY2x1ZGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIChzbyByZW9wZW5pbmcgc2hvd3Mgc2VsZWN0ZWQpXG4gICAgaWYgKHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWwgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJbkNhY2hlZCA9IGNvbnRyb2xWYWwgPT0gbnVsbCB8fCBjb250cm9sVmFsID09PSAnJyB8fCAoY2FjaGVkLm9wdGlvbnMgfHwgW10pLnNvbWUoKG86IFNlbGVjdE9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoY29udHJvbFZhbCkgfHwgby52YWx1ZSA9PT0gY29udHJvbFZhbCk7XG4gICAgICBpZiAoc2VsZWN0ZWRJbkNhY2hlZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgfVxuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoY2FjaGVLZXkpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgLSBpZiBzbywgZGlzYWJsZSB0aGUgZHJvcGRvd25cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVQYXJhbWV0ZXJzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1BhcmFtZXRlcnMsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFBhcmFtZXRlcnMuZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgaXMgdGhlIHByb2ZpbGUgSUQgKHN0cmluZykgZnJvbSB0aGUgbWF0LW9wdGlvblxuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRCB0byBnZXQgdGhlIG5hbWVcbiAgICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gU3RvcmUgYm90aCBJRCBhbmQgbmFtZVxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU/Lm5hbWUgfHwgdGVzdERhdGFQcm9maWxlPy50ZXN0RGF0YU5hbWUgfHwgJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIHByb2ZpbGUgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGNhY2hlcyBmb3IgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3QgY29uZmlncyBzaW5jZSBwcm9maWxlIGNoYW5nZWRcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZVxuICAgICAgICBjb25zdCBkYXRhU2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0YCkpIHtcbiAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZGF0YSBzZXQgd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGRhdGEgc2V0IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICAgKi9cbiAgZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmaW5kIElEIGZyb20gcHJvZmlsZSBuYW1lXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIHByb2ZpbGUgSUQgZnJvbSB0aGUgcHJvZmlsZSBuYW1lXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgZm9yIGNhY2hlIGtleSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0XyR7cHJvZmlsZUlkVG9Vc2UgfHwgc2VsZWN0ZWRQcm9maWxlIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGF0YSBzZXRzIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgdXNpbmcgSURcbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgc2V0IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCB8fCAnJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFTZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZERhdGFTZXQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGF0YSBTZXQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBkYXRhIHNldCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnIHNpbmNlIGRhdGEgc2V0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBwYXJhbWV0ZXIgZHJvcGRvd24gKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgcGFyYW1ldGVycyBmcm9tIHNlbGVjdGVkIGRhdGEgc2V0KVxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgKHByZWZlcnJlZCkgb3IgbmFtZSAoZmFsbGJhY2spIGFuZCBkYXRhIHNldFxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gICAgXG4gICAgaWYgKCghc2VsZWN0ZWRQcm9maWxlSWQgJiYgIXNlbGVjdGVkUHJvZmlsZSkgfHwgIXNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBwcm9maWxlIG9yIGRhdGEgc2V0IGlzIG5vdCBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogKHNlbGVjdGVkUHJvZmlsZUlkIHx8IHNlbGVjdGVkUHJvZmlsZSkgPyAnU2VsZWN0IERhdGEgU2V0IGZpcnN0JyA6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgcHJvZmlsZUlkZW50aWZpZXIgPSBzZWxlY3RlZFByb2ZpbGVJZCA/IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCkgOiAoc2VsZWN0ZWRQcm9maWxlIHx8ICcnKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF8ke3Byb2ZpbGVJZGVudGlmaWVyfV8ke3NlbGVjdGVkRGF0YVNldH1gO1xuICAgIGlmICh0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHBhcmFtZXRlcnMgZm9yIHRoZSBzZWxlY3RlZCBkYXRhIHNldCB1c2luZyBwcm9maWxlIElEIG9yIG5hbWVcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRlbnRpZmllciwgc2VsZWN0ZWREYXRhU2V0KTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gcGFyYW1ldGVycy5tYXAocGFyYW0gPT4gKHtcbiAgICAgIGlkOiBgQHwke3BhcmFtLm5hbWV9fGAsIC8vIFVzZSBwYXJhbS5uYW1lIGFzIGlkIChtYXQtb3B0aW9uIHdpbGwgdXNlIHRoaXMpXG4gICAgICB2YWx1ZTogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBGb3JtYXR0ZWQgdmFsdWUgZm9yIGRpc3BsYXlcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGFuZCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWx1ZSwgZW5zdXJlIGZvcm0gY29udHJvbCBtYXRjaGVzIHRoZSBvcHRpb24gaWQgKGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlIHx8ICcnO1xuICAgICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQgKGUuZy4sIFwiQHxlbWFpbHxcIilcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgY3VycmVudFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgPyBjdXJyZW50VmFsdWVcbiAgICAgICAgOiAoY3VycmVudFZhbHVlID8gYEB8JHtjdXJyZW50VmFsdWV9fGAgOiAnJyk7XG4gICAgICAvLyBTZXQgZm9ybSBjb250cm9sIHRvIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAmJiBwYXJhbWV0ZXJzLnNvbWUocCA9PiBgQHwke3AubmFtZX18YCA9PT0gZm9ybWF0dGVkVmFsdWUpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiBmYWxzZSwgLy8gQ2xpZW50LXNpZGUgc2VhcmNoIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhbGwgcGFyYW1ldGVycyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsIC8vIE5vIHBhZ2luYXRpb24gZm9yIHBhcmFtZXRlcnMgd2l0aGluIGEgZGF0YSBzZXRcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgcmVjZWl2ZWQgaXMgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgXCJAfGVtYWlsfFwiKSBiZWNhdXNlIG1hdC1vcHRpb24gdXNlcyBvcHQuaWRcbiAgICAgICAgLy8gRXh0cmFjdCBwYXJhbWV0ZXIgbmFtZSBmcm9tIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlOyAvLyBUaGlzIGlzIGFscmVhZHkgZm9ybWF0dGVkIGFzIEB8cGFyYW1OYW1lfFxuICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBmb3JtYXR0ZWRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGZvcm1hdHRlZFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgICA/IGZvcm1hdHRlZFZhbHVlLnNsaWNlKDIsIC0xKVxuICAgICAgICAgIDogZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgcmF3IHZhbHVlIChzdG9yZSBwYXJhbWV0ZXIgbmFtZSB3aXRob3V0IGZvcm1hdHRpbmcpXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcGFyYW1OYW1lO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgZm9yIHRlbXBsYXRlKVxuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXkgLSB1c2UgZm9ybWF0dGVkIHZhbHVlIChtYXRjaGVzIG9wdC5pZCkgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCAmJiB2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gZm9ybWF0dGVkIHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBcbiAgICAgICAgLy8gRW1pdCBmb3JtYXR0ZWQgdmFsdWUgZm9yIHBhcmVudCBjb21wb25lbnQgKHRoaXMgaXMgd2hhdCBnZXRzIHVzZWQgaW4gdGhlIHRlbXBsYXRlKVxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHMgZnJvbSBlbnZpcm9ubWVudCBvcHRpb25zXG4gICAqL1xuICBnZXRVbmlxdWVFbnZpcm9ubWVudHMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBlbnZNYXAgPSBuZXcgTWFwPHN0cmluZywgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5mb3JFYWNoKGVudiA9PiB7XG4gICAgICBpZiAoIWVudk1hcC5oYXMoZW52LmVudmlyb25tZW50KSkge1xuICAgICAgICBlbnZNYXAuc2V0KGVudi5lbnZpcm9ubWVudCwge1xuICAgICAgICAgIGlkOiBlbnYuZW52aXJvbm1lbnQsXG4gICAgICAgICAgbmFtZTogZW52LmVudmlyb25tZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVudk1hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICovXG4gIGdldFBhcmFtZXRlcnNGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAuZmlsdGVyKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IGVudmlyb25tZW50TmFtZSlcbiAgICAgIC5tYXAoZW52ID0+ICh7XG4gICAgICAgIGlkOiBlbnYubmFtZSxcbiAgICAgICAgbmFtZTogZW52Lm5hbWVcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIC0gc2VsZWN0IGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52aXJvbm1lbnRgO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgdW5pcXVlIGVudmlyb25tZW50c1xuICAgIGNvbnN0IHVuaXF1ZUVudmlyb25tZW50cyA9IHRoaXMuZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHVuaXF1ZUVudmlyb25tZW50cy5tYXAoZW52ID0+ICh7XG4gICAgICBpZDogZW52LmlkLFxuICAgICAgdmFsdWU6IGVudi5uYW1lLFxuICAgICAgbmFtZTogZW52Lm5hbWUsXG4gICAgICBsYWJlbDogZW52Lm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZW52aXJvbm1lbnQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFbnYgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50IHx8ICcnO1xuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRFbnYpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCAvLyBVc2UgJ3NlbGVjdGVkRW52aXJvbm1lbnQnIGFzIGtleVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgRW52aXJvbm1lbnRgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZUVudmlyb25tZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbnZpcm9ubWVudHMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgbmFtZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEIGZyb20gZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVudmlyb25tZW50IG9wdGlvbiB3aXRoIG1hdGNoaW5nIGVudmlyb25tZW50IG5hbWUgdG8gZ2V0IHRoZSBJRFxuICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IHZhbHVlKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBJRCBmcm9tIGVudk9wdGlvbi5pZCAoZm9ybWF0OiBcImVudi03NC10ZXN0XCIgLT4gNzQpXG4gICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciB0aGUgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRFbnZpcm9ubWVudCBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgbmV3IGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUlcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbnZpcm9ubWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBzZWxlY3QgcGFyYW1ldGVyIGZyb20gZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IHNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICAgIGlmICghc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBubyBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbnZpcm9ubWVudCBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYCp8JHtwYXJhbS5uYW1lfXxgLFxuICAgICAgdmFsdWU6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBQYXJhbWV0ZXJgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gV2hlbiBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQsIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGZvcm1hdCBpdFxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVudmlyb25tZW50IElEIGlzIGFscmVhZHkgc3RvcmVkIG9uIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0ga2VlcCByYXcgdmFsdWUgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gcmF3IHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IElEIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50SWQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnZpcm9ubWVudCBJRHMgZm9yIHZhcmlhYmxlcyB0aGF0IHVzZSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIFJldHVybnMgYSBtYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgZW52SWRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCkge1xuICAgICAgICBlbnZJZHMuc2V0KHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVudklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwbGFpbi10ZXh0XG4gICAqL1xuICBpc1BsYWluVGV4dFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwYXJhbWV0ZXJcbiAgICovXG4gIGlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBzZXQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgc2V0IChmcm9tIHRlc3QgY2FzZSlcbiAgICogSWYgdHJ1ZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBlbnZpcm9ubWVudFxuICAgKi9cbiAgaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFyaWFibGUgaXMgZWxlbWVudCB0eXBlIChkYXRhS2V5ID09PSAnZWxlbWVudCcpXG4gICAqL1xuICBpc0VsZW1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCBmb3IgYW4gZWxlbWVudCB2YXJpYWJsZVxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNlbGVjdGVkU2NyZWVuTmFtZSBvciBzY3JlZW5OYW1lSWQgaXMgc2V0IChhbmQgbm90IFwiTm9uZVwiKVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgc2NyZWVuTmFtZUlkIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBudW1iZXIgKG5vdCBudWxsL3VuZGVmaW5lZClcbiAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkICE9IG51bGwgJiYgdHlwZW9mIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogY2hlY2sgc2VsZWN0ZWRTY3JlZW5OYW1lXG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBzY3JlZW4gbmFtZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICAgKi9cbiAgZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gSW5jbHVkZSBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gbG9hZGluZyBjb21wbGV0ZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3NjcmVlbk5hbWVfJHt0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzfWA7XG4gICAgaWYgKHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvcHRpb25zOiBpbmNsdWRlIGEgXCJOb25lXCIgb3B0aW9uIChkaXNwbGF5ZWQgYXMgXCJTZWxlY3RcIikgcGx1cyBzY3JlZW5OYW1lT3B0aW9ucyBmcm9tIEFQSVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnbm9uZScsXG4gICAgICAgIHZhbHVlOiAnU2VsZWN0JyxcbiAgICAgICAgbmFtZTogJ05vbmUnLFxuICAgICAgICBsYWJlbDogJ05vbmUnXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5tYXAoc2NyZWVuTmFtZSA9PiAoe1xuICAgICAgICBpZDogc2NyZWVuTmFtZS5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbmFtZTogc2NyZWVuTmFtZS5uYW1lLFxuICAgICAgICBsYWJlbDogc2NyZWVuTmFtZS5uYW1lXG4gICAgICB9KSlcbiAgICBdO1xuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBzY3JlZW4gbmFtZSBzZWxlY3Rpb25cbiAgICAvLyBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAvLyBDb21wYXJlIGFzIHN0cmluZ3MgdG8gaGFuZGxlIGJvdGggbnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHNjcmVlbk5hbWVJZCwgZW5zdXJlIGZvcm0gY29udHJvbCBpcyAnbm9uZScgKGZvciBcIk5vbmVcIiBzZWxlY3Rpb24gYnkgZGVmYXVsdClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09ICdub25lJyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSWYgXCJOb25lXCIgaXMgc2VsZWN0ZWQgKHZhbHVlIGlzICdub25lJyBzdHJpbmcgb3IgbnVsbCksIGNsZWFyIHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50IGluZm9cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICdub25lJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudGApKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkU2NyZWVuTmFtZSB0byAnbm9uZScgdG8gc2hvdyBcIk5vbmVcIiBpcyBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IElEIGZvcm0gY29udHJvbCB0byBlbnN1cmUgZWxlbWVudElkIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBzdG9wIChubyBlbGVtZW50IGZldGNoIHdoZW4gTm9uZSlcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWx1ZSBpcyB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXIgZm9yIHNjcmVlbk5hbWVJZCBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZE51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICdub25lJyA/IHBhcnNlSW50KHZhbHVlLCAxMCkgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogbnVsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyZWVuTmFtZUlkTnVtICYmICFpc05hTihzY3JlZW5OYW1lSWROdW0pKSB7XG4gICAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNjcmVlbk5hbWVJZE51bTtcblxuICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVPcHRpb24gPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHNjcmVlbk5hbWVJZE51bSk7XG4gICAgICAgICAgaWYgKHNjcmVlbk5hbWVPcHRpb24pIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIG5vdCBmb3VuZCwgc3RpbGwgc2V0IHRoZSBJRCBidXQgY2xlYXIgdGhlIG5hbWVcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgZWxlbWVudCBzZWxlY3Rpb24gd2hlbiBzY3JlZW4gbmFtZSBjaGFuZ2VzXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIChhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkKVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzY3JlZW5OYW1lSWROdW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBzY3JlZW4gbmFtZVxuICAgICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCh7XG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCxcbiAgICAgICAgICAgIHNlYXJjaFRlcm06ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZSAtIGNsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZWxlbWVudE9wdGlvbnMgaW5wdXQgY2hhbmdlc1xuICAgICAgICAvLyB2aWEgbmdPbkNoYW5nZXMsIHdoaWNoIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGFuZCB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uXG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgnJyk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU2NyZWVuTmFtZS5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVsZW1lbnQgZHJvcGRvd24gKHNlY29uZCBkcm9wZG93biAtIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICAgKiBPcHRpbWl6ZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIGdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCBzY3JlZW4gbmFtZSBJRFxuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGFuZCBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbGVtZW50XyR7c2VsZWN0ZWRTY3JlZW5OYW1lSWQgfHwgJyd9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc3RpbGwgbG9hZGluZywgcmV0dXJuIGEgbG9hZGluZyBjb25maWcgYW5kIGNhY2hlIGl0XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ0xvYWRpbmcgZWxlbWVudHMuLi4nLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBsb2FkaW5nQ29uZmlnKTtcbiAgICAgIHJldHVybiBsb2FkaW5nQ29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzY3JlZW4gbmFtZSBmcm9tIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzY3JlZW4gbmFtZSBkcm9wZG93biBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3Rpb25cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmluZCBhbmQgc3RvcmUgc2NyZWVuIG5hbWUgbmFtZSBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmluZCBhbmQgcGF0Y2ggdGhlIHNlbGVjdG9yIHZhcmlhYmxlIHdpdGggZGF0YUtleSAnbm90X2ZvdW5kJ1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQoXG4gICAgICAgICAgICB2ID0+IHYubmFtZSA9PT0gJ3NlbGVjdG9yJyAmJiB2LmRhdGFLZXkgPT09ICdub3RfZm91bmQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZSAmJiBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBzZWxlY3RvciB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JWYXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cChzZWxlY3RvclZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdG9yIHZhcmlhYmxlJ3MgdmFsdWUgd2l0aCB0aGUgZWxlbWVudCBsb2NhdG9yXG4gICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGUudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogaWYgZWxlbWVudCBub3QgZm91bmQsIGp1c3Qgc2V0IHRoZSB2YWx1ZVxuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIGlmIGVsZW1lbnQgaGFzIGEgc2NyZWVuIG5hbWVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcmVlbiBuYW1lIElEIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPHN0eWxlPlxuICAuY2FwaXRhbGl6ZS1maXJzdDo6Zmlyc3QtbGV0dGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG48L3N0eWxlPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTnVtYmVyIHZhcmlhYmxlcyB3aXRoIG51bWJlciBpbnB1dCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ251bWJlcicgJiYgdmFyaWFibGUuZGF0YUtleSAhPT0gJ2VsZW1lbnQnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbdHlwZV09XCInbnVtYmVyJ1wiIFtwbGFjZWhvbGRlcl09XCInTnVtYmVyIElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBOb24tYm9vbGVhbiwgbm9uLWN1c3RvbV9jb2RlIHZhcmlhYmxlcyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbicgJiYgdmFyaWFibGUudHlwZSAhPT0gJ2Ryb3Bkb3duJyAmJiAhKHZhcmlhYmxlLnR5cGUgPT09ICdudW1iZXInICYmIHZhcmlhYmxlLmRhdGFLZXkgIT09ICdlbGVtZW50JylcIj5cbiAgICAgIDwhLS0gRWxlbWVudCB2YXJpYWJsZXMgd2l0aCBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWxlbWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBTY3JlZW4gTmFtZTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFNjcmVlbk5hbWUodmFyaWFibGUpOyBlbHNlIGVsZW1lbnRNYW51YWxJbnB1dFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI2VsZW1lbnRNYW51YWxJbnB1dD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ251bWJlcidcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3R5cGVdPVwiJ251bWJlcidcIiBbcGxhY2Vob2xkZXJdPVwiJ051bWJlciBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSAhPT0gJ251bWJlcidcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWxlbWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICA8IS0tIE90aGVyIGRyb3Bkb3duIHZhcmlhYmxlcyAodHlwZSwgc2Nyb2xsVG8sIGxhYmVsKSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpOyBlbHNlIGRlZmF1bHRJbnB1dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dD5cbiAgICAgICAgPCEtLSBUZXN0LWRhdGEsIHNvdXJjZS12YWx1ZSwgb3IgdGFyZ2V0LXZhbHVlIHdpdGggZGF0YSB0eXBlIGRyb3Bkb3duIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSByZWd1bGFySW5wdXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19IFR5cGU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgIEVudmlyb25tZW50IE5hbWU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYWx1ZTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldEVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBUZXN0IERhdGEgUHJvZmlsZTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBEYXRhIFNldDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlKSB8fCBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSAgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSBpbnB1dCBmb3IgcGxhaW4tdGV4dCB0eXBlIC0tPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZSh2YXJpYWJsZSlcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcklucHV0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgPGNxYS1lbGVtZW50LWZvcm1cbiAgICBbaXNDcmVhdGVNb2RlXT1cInRydWVcIlxuICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgW2lzRWRpdEluRGVwdGhBdmFpbGFibGVdPVwiZmFsc2VcIlxuICAgIChjcmVhdGVFbGVtZW50KT1cIm9uQ3JlYXRlRWxlbWVudCgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsRWxlbWVudEZvcm0oKVwiXG4gICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCI+XG4gIDwvY3FhLWVsZW1lbnQtZm9ybT5cbjwvZGl2PiJdfQ==
|
|
2527
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUErQ25FLE1BQU0sT0FBTyw4QkFBOEI7SUE2R3pDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBNUdqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbGVtZW50Q3JlYXRlUGF5bG9hZCwgU2NyZWVuTmFtZU9wdGlvbiB9IGZyb20gJy4uLy4uL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC1mb3JtLWRhdGEnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7XG4gIHNjcmVlbk5hbWVPYmo/OiBhbnk7IC8vIEZpeGVkOiB1c2UgJ2FueScgc2luY2UgJ0VsZW1lbnRTY3JlZW5OYW1lJyBpcyBub3QgZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlVmFyaWFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGFLZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W107XG4gIC8vIEFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgbWFuYWdpbmcgdmFyaWFibGUgc3RhdGVcbiAgZGF0YVR5cGU/OiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCc7XG4gIHJhd1ZhbHVlPzogc3RyaW5nOyAvLyBSYXcgdmFsdWUgd2l0aG91dCBmb3JtYXR0aW5nIChmb3Igc2VsZWN0IGRyb3Bkb3ducylcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZW52aXJvbm1lbnQgbmFtZSAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkRW52aXJvbm1lbnRJZD86IG51bWJlcjsgLy8gU2VsZWN0ZWQgZW52aXJvbm1lbnQgSUQgKGZvciBlbnZpcm9ubWVudCB0eXBlKVxuICBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZT86IHN0cmluZzsgLy8gU2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZERhdGFTZXQ/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGRhdGEgc2V0IG5hbWUgKGZvciBwYXJhbWV0ZXIgdHlwZSlcbiAgc2VsZWN0ZWREYXRhU2V0U3RhcnQ/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGRhdGEgc2V0IHN0YXJ0IG5hbWUgKGZvciBGT1IgbG9vcCBjb250ZXh0KVxuICBzZWxlY3RlZERhdGFTZXRFbmQ/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIGRhdGEgc2V0IGVuZCBuYW1lIChmb3IgRk9SIGxvb3AgY29udGV4dClcbiAgc2VsZWN0ZWRTY3JlZW5OYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBzY3JlZW4gbmFtZSAoZm9yIGVsZW1lbnQgdHlwZSlcbiAgc2NyZWVuTmFtZUlkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBzY3JlZW4gbmFtZSBJRCAoZm9yIGVsZW1lbnQgdHlwZSlcbiAgZWxlbWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbGVtZW50IElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50TG9jYXRvcj86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZWxlbWVudCBsb2NhdG9yIHZhbHVlIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50TmFtZT86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZWxlbWVudCBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRlbXBsYXRlVmFyaWFibGVzOiBUZW1wbGF0ZVZhcmlhYmxlW10gPSBbXTtcbiAgQElucHV0KCkgdmFyaWFibGVzRm9ybTogRm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XG4gIEBJbnB1dCgpIG1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogRWxlbWVudFtdID0gW107IC8vIEVsZW1lbnQgb2JqZWN0cyBmb3IgZWxlbWVudCBkcm9wZG93blxuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gV2hldGhlciBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGVcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTG9hZGluZyBzdGF0ZSBmb3IgZWxlbWVudHNcbiAgLyoqIFNjcmVlbiBuYW1lIG9wdGlvbnMgZm9yIGVsZW1lbnQgZm9ybSBhdXRvY29tcGxldGUgKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBzY3JlZW5OYW1lT3B0aW9uczogU2NyZWVuTmFtZU9wdGlvbltdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVGVzdCBkYXRhIHByb2ZpbGVzIGZvciBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAtIHJhdyBUZXN0RGF0YSBvYmplY3RzICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107IC8vIFRlc3REYXRhW10gLSB1c2luZyBhbnkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAvKiogV2hldGhlciBtb3JlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHBhcmFtZXRlcnMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFVwbG9hZCBvcHRpb25zIGZvciB1cGxvYWQgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSB1cGxvYWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHVwbG9hZHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVVcGxvYWRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHVwbG9hZHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1VwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IG9wdGlvbnMgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIGVudmlyb25tZW50cyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBEZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIElEIGZyb20gdGVzdCBjYXNlIChpZiBhdmFpbGFibGUsIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGRyb3Bkb3ducyB3aWxsIGJlIGRpc2FibGVkKSAqL1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IHRlc3QgZGF0YSBzdGFydCBpbmRleCBmcm9tIHRlc3QgY2FzZSAoZGF0YSBzZXQgaW5kZXggaW4gdGhlIHByb2ZpbGUpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXg/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IHRlc3QgZGF0YSBlbmQgaW5kZXggZnJvbSBGT1IgbG9vcCBjb250ZXh0ICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YUVuZEluZGV4PzogbnVtYmVyO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBlZGl0ZWQgc3RlcCBpcyBpbnNpZGUgYSBGT1IgbG9vcC4gKi9cbiAgQElucHV0KCkgaXNJbnNpZGVGb3JMb29wU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0VkaXRJbkRlcHRoOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIEBPdXRwdXQoKSB2YXJpYWJsZVZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9PigpO1xuICBAT3V0cHV0KCkgdmFyaWFibGVCb29sZWFuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfT4oKTtcbiAgQE91dHB1dCgpIG1ldGFkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBkZXNjcmlwdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGxvYWQgbW9yZSBpcyByZXF1ZXN0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbGVtZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxFbGVtZW50Q3JlYXRlUGF5bG9hZD4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZCB3aXRoIHBheWxvYWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIHNlYXJjaFVwbG9hZHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHVwbG9hZHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlVXBsb2FkcyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgdXBsb2Fkc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGNhbmNlbEVsZW1lbnRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIGlzIGNhbmNlbGxlZFxuICBAT3V0cHV0KCkgZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlc1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgcGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3Igc2NyZWVuIG5hbWUgc2VsZWN0IGNvbmZpZ3MgKGZvciBlbGVtZW50IHZhcmlhYmxlcylcbiAgcHJpdmF0ZSBzY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZWxlbWVudCBzZWxlY3QgY29uZmlncyAoZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWUpXG4gIHByaXZhdGUgZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWdzIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzZWxlY3QgY29uZmlncyAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgcHJpdmF0ZSBkYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzdGFydC9lbmQgY29uZmlncyAoRk9SIGxvb3AgY29udGV4dClcbiAgcHJpdmF0ZSBkYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3MgZm9yIGEgc3BlY2lmaWMgZGF0YSBzZXQgKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICBwcml2YXRlIHBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgbmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNob3VsZFNob3dEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIFByZS1jb21wdXRlZCBkYXRhIHR5cGUgb3B0aW9ucyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFUeXBlT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgeyBpZDogJ3BsYWluLXRleHQnLCB2YWx1ZTogJ3BsYWluLXRleHQnLCBuYW1lOiAnUGxhaW4gVGV4dCcsIGxhYmVsOiAnUGxhaW4gVGV4dCcgfSxcbiAgICB7IGlkOiAncGFyYW1ldGVyJywgdmFsdWU6ICdwYXJhbWV0ZXInLCBuYW1lOiAnQHxQYXJhbWV0ZXJ8JywgbGFiZWw6ICdAfFBhcmFtZXRlcnwnIH0sXG4gICAgeyBpZDogJ3J1bnRpbWUnLCB2YWx1ZTogJ3J1bnRpbWUnLCBuYW1lOiAnJHxSdW50aW1lfCcsIGxhYmVsOiAnJHxSdW50aW1lfCcgfSxcbiAgICB7IGlkOiAnZW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JywgbmFtZTogJyp8RW52aXJvbm1lbnR8JywgbGFiZWw6ICcqfEVudmlyb25tZW50fCcgfVxuICBdO1xuXG4gIEBJbnB1dCgpIGNyZWF0ZUVsZW1lbnRWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25DcmVhdGVFbGVtZW50KHBheWxvYWQ6IEVsZW1lbnRDcmVhdGVQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50LmVtaXQocGF5bG9hZCk7XG4gICAgdGhpcy5lbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNhbmNlbEVsZW1lbnRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYoY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkIGNoYW5nZWRcIiwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10pO1xuICAgIH1cbiAgICBpZihjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCBjaGFuZ2VkXCIsIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSk7XG4gICAgfVxuICAgIGlmKGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YUVuZEluZGV4J10pIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXggY2hhbmdlZFwiLCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddKTtcbiAgICB9XG4gICAgaWYoY2hhbmdlc1snaXNJbnNpZGVGb3JMb29wU3RlcCddKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImlzSW5zaWRlRm9yTG9vcFN0ZXAgY2hhbmdlZFwiLCBjaGFuZ2VzWydpc0luc2lkZUZvckxvb3BTdGVwJ10pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10gfHwgY2hhbmdlc1snZWxlbWVudE9wdGlvbnMnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZW52aXJvbm1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVudmlyb25tZW50cyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0Vudmlyb25tZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFFbmRJbmRleCddIHx8IGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSkge1xuICAgICAgXG4gICAgICAvLyBPbmx5IGNsZWFyIGNhY2hlcyBmb3IgY2hhbmdlZCBpbnB1dHMsIG5vdCBhbGwgY2FjaGVzXG4gICAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWyd2YXJpYWJsZXNGb3JtJ10pIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlcyB3aGVuIHRlbXBsYXRlIHZhcmlhYmxlcyBvciBmb3JtIGNoYW5nZXNcbiAgICAgICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBhbmQgc2NyZWVuIG5hbWUgY2FjaGVzIG9ubHkgd2hlbiB0aGVpciBvcHRpb25zIGNoYW5nZVxuICAgICAgaWYgKGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlU2NyZWVuTmFtZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdTY3JlZW5OYW1lcyddKSB7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIGNoYW5nZWRcIiwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ3VwbG9hZE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlVXBsb2FkcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1VwbG9hZHMnXSkge1xuICAgICAgICAvLyBDbGVhciBzZWxlY3QgY29uZmlnIGNhY2hlIGZvciB1cGxvYWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYW5nZXNbJ2Vudmlyb25tZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVFbnZpcm9ubWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbnZpcm9ubWVudHMnXSkge1xuICAgICAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgZGF0YSB0eXBlcyBhbmQgcmF3IHZhbHVlcyBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlc1xuICAgICAgLy8gTk9URTogV2UgZG8gTk9UIGluY2x1ZGUgJ3BhcmFtZXRlck9wdGlvbnMnIGhlcmUgYmVjYXVzZSBpdCBjaGFuZ2VzIG9uIGV2ZXJ5IHNlYXJjaCxcbiAgICAgIC8vIHdoaWNoIHdvdWxkIHJlc2V0IHRoZSB0ZXN0LWRhdGEgdHlwZSBkcm9wZG93bi4gSW5zdGVhZCwgcGFyYW1ldGVyT3B0aW9ucyBpbml0aWFsaXphdGlvblxuICAgICAgLy8gaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGJlbG93IHdpdGggYSBmaXJzdENoYW5nZSBndWFyZC5cbiAgICAgIGlmICgoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhRW5kSW5kZXgnXSB8fCBjaGFuZ2VzWydpc0luc2lkZUZvckxvb3BTdGVwJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgdGVtcGxhdGVWYXJpYWJsZXMgY2hhbmdlZCwgaW5pdGlhbGl6ZSBzY3JlZW4gbmFtZSBmb3JtIGNvbnRyb2xzIGZvciBlbGVtZW50IHZhcmlhYmxlcyB0aGF0IGhhdmUgc2NyZWVuTmFtZUlkXG4gICAgICBpZiAoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JlZW4gbmFtZSBmb3JtIGNvbnRyb2wgd2l0aCBzY3JlZW5OYW1lSWQgYXMgc3RyaW5nICh0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0KSwgb3IgJ25vbmUnIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsVmFsdWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIGl0IGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVTdHIgPSBjdXJyZW50VmFsdWUgIT0gbnVsbCA/IFN0cmluZyhjdXJyZW50VmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlU3RyICE9PSBleHBlY3RlZFZhbHVlICYmIGN1cnJlbnRWYWx1ZSAhPT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKGV4cGVjdGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc2NyZWVuTmFtZUlkIGJ1dCBub3Qgc2VsZWN0ZWRTY3JlZW5OYW1lLCBmaW5kIGl0IGZyb20gc2NyZWVuTmFtZU9wdGlvbnNcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgJiYgdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdTY3JlZW5OYW1lID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1NjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IG1hdGNoaW5nU2NyZWVuTmFtZS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHNjcmVlbk5hbWVPcHRpb25zIGNoYW5nZWQsIHVwZGF0ZSBzZWxlY3RlZFNjcmVlbk5hbWUgZm9yIHZhcmlhYmxlcyB0aGF0IGhhdmUgc2NyZWVuTmFtZUlkXG4gICAgICBpZiAoY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgJiYgIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdTY3JlZW5OYW1lID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nU2NyZWVuTmFtZSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBtYXRjaGluZ1NjcmVlbk5hbWUubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBlbGVtZW50T3B0aW9ucyBvciBzY3JlZW5OYW1lT3B0aW9ucyBjaGFuZ2VkLCByZS1pbml0aWFsaXplIGVsZW1lbnQgdmFyaWFibGVzXG4gICAgICBpZiAoKGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSkgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGVsZW1lbnRzIGFyZSBsb2FkZWQgYWZ0ZXIgc2NyZWVuIG5hbWUgc2VsZWN0aW9uLCB0aGUgY29uZmlnIGlzIHJlY29tcHV0ZWRcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBPbmx5IHRyeSB0byBmaW5kIGFuZCBzZXQgZWxlbWVudCBpZiBlbGVtZW50SWQgZXhpc3RzIGluIHRlbXBsYXRlIGRhdGFcbiAgICAgICAgICAgICAgLy8gSWYgbm8gZWxlbWVudElkLCBkb24ndCBzZWxlY3QgYW55dGhpbmcgLSB1c2UgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmVsZW1lbnRJZCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDE6IEZpbmQgYnkgZWxlbWVudElkIChmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwuaWQgPT09IHZhcmlhYmxlLmVsZW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMjogRmluZCBieSBlbGVtZW50TmFtZSBpZiBlbGVtZW50SWQgc2VhcmNoIGRpZG4ndCBmaW5kIGl0IChmYWxsYmFjaylcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gdmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAzOiBGaW5kIGJ5IGxvY2F0b3JWYWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubG9jYXRvclZhbHVlID09PSBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgLy8gU2V0IHNjcmVlbiBuYW1lIGluZm8gZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2NyZWVuTmFtZUlkICYmIGVsZW1lbnQuc2NyZWVuTmFtZU9iaikge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gZWxlbWVudC5zY3JlZW5OYW1lSWQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBzY3JlZW5OYW1lSWQgYXMgc3RyaW5nIHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQgKGZvciBjb25zaXN0ZW5jeSB3aXRoIGdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZFN0cmluZyA9IFN0cmluZyhlbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woc2NyZWVuTmFtZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyB1c2VyJ3Mgc2VsZWN0aW9uIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gc2NyZWVuTmFtZUlkU3RyaW5nICYmIGN1cnJlbnRWYWx1ZVN0ciAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKHNjcmVlbk5hbWVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQvdXBkYXRlIGVsZW1lbnQgZGV0YWlscyBmcm9tIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGVsZW1lbnROYW1lIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNldCAocHJlc2VydmUgZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGUuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5uYW1lID09PSAnc2VsZWN0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZWxlbWVudC5uYW1lIHx8IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBJRCBmb3JtIGNvbnRyb2wgZm9yIHRoZSBkcm9wZG93biAoa2V5IGlzICdpZCcgaW4gY29uZmlnKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShlbGVtZW50LmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFyaWFibGUudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBub3QgZm91bmQgaW4gZWxlbWVudE9wdGlvbnMgeWV0IC0gbWlnaHQgbmVlZCB0byBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gS2VlcCBlbGVtZW50SWQgYW5kIGVsZW1lbnROYW1lIGlmIHRoZXkgZXhpc3QgKGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyB0aGUgc2NyZWVuIG5hbWUgeWV0LCBzbyB3ZSdsbCB3YWl0IGZvciBlbGVtZW50T3B0aW9ucyB0byBiZSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiB3aWxsIHJ1biBhZ2FpbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXMgdmlhIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIGVsZW1lbnRJZCBpbiB0ZW1wbGF0ZSBkYXRhIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmaWVsZHMgYW5kIHNldCBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT25seSBjbGVhciBzY3JlZW5OYW1lSWQgaWYgaXQgd2Fzbid0IHNldCBieSB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gJ25vbmUnIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIFNjcmVlbiBuYW1lIHNob3VsZCBiZSAnbm9uZScgKFNlbGVjdCBvcHRpb24pXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKG51bGwpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcmUtY29tcHV0ZSBhbGwgY29uZmlncyB0byBhdm9pZCBjYWxsaW5nIG1ldGhvZHMgaW4gdGVtcGxhdGVcbiAgICAgIC8vIFRoaXMgd2lsbCByZWNvbXB1dGUgZWxlbWVudCBjb25maWdzIHdpdGggdGhlIG5ldyBlbGVtZW50T3B0aW9uc1xuICAgICAgLy8gT25seSBwcmVjb21wdXRlIGlmIHRlbXBsYXRlVmFyaWFibGVzIGV4aXN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByZWNvbXB1dGVDb25maWdzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gYWZ0ZXIgcmVjb21wdXRpbmcgY29uZmlncyAob25seSBvbmNlIGF0IHRoZSBlbmQpXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIFxuICAgICAgLy8gSWYgZW52aXJvbm1lbnQgb3B0aW9ucyBjaGFuZ2VkLCByZWZyZXNoIHBhcmFtZXRlciBjb25maWdzIGFuZCByZS1pbml0IGFueSB1bmluaXRpYWxpemVkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAvLyBDbGVhciBhbmQgcmVjb21wdXRlIGVudmlyb25tZW50IHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbiB0aGUgZmlyc3QgdGltZSBlbnZpcm9ubWVudE9wdGlvbnMgYXJyaXZlLCByZS1pbml0aWFsaXplIGFueSBlbnZpcm9ubWVudC10eXBlIHZhcmlhYmxlc1xuICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgYm91bmQgeWV0IChvcHRpb25zIHdlcmUgZW1wdHkgd2hlbiB0ZW1wbGF0ZVZhcmlhYmxlcyBmaXJzdCBsb2FkZWQpLlxuICAgICAgICAvLyBPbmx5IHJ1bnMgaW4gZGVidWcgbW9kZSB0byBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIG5vbi1kZWJ1ZyBzdGVwLWJ1aWxkZXIgcHJlLWZpbGwgZmxvd3MuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmlzRGVidWcgJiZcbiAgICAgICAgICBjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXS5maXJzdENoYW5nZSAmJlxuICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT5cbiAgICAgICAgICAgIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHYpICYmIHYuZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcgJiYgIXYuc2VsZWN0ZWRFbnZpcm9ubWVudFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZS1ydW4gaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzIHdoZW5ldmVyIHBhcmFtZXRlck9wdGlvbnMgY2hhbmdlcyBhbmQgdGhlcmUgYXJlIHN0aWxsXG4gICAgICAvLyB2YXJpYWJsZXMgdGhhdCBuZWVkIGluaXRpYWxpemF0aW9uIChoYXZlIHByb2ZpbGVJZCBidXQgbWlzc2luZyBwcm9maWxlIG5hbWUgb3IgZGF0YVNldCkuXG4gICAgICAvLyBXZSBkbyBOT1QgdXNlIGZpcnN0Q2hhbmdlIGhlcmUgYmVjYXVzZSB0aGUgc2F2ZWQgcHJvZmlsZSBtYXkgYXJyaXZlIGluIGEgc2Vjb25kIEFQSSBjYWxsXG4gICAgICAvLyAoaWRAPHByb2ZpbGVJZD4pIGFmdGVyIHRoZSBpbml0aWFsIHBhZ2luYXRlZCBsaXN0LCBzbyBmaXJzdENoYW5nZSB3b3VsZCBtaXNzIGl0LlxuICAgICAgLy8gVGhlIGlubmVyIHNvbWUoKSBndWFyZCBlbnN1cmVzIHdlIG9ubHkgcmUtcnVuIHdoZW4gdmFyaWFibGVzIGFyZSBzdGlsbCBpbmNvbXBsZXRlLFxuICAgICAgLy8gcHJldmVudGluZyB1bm5lY2Vzc2FyeSByZS1ydW5zIG9uIHVzZXIgc2VhcmNoIHVwZGF0ZXMuXG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSAmJlxuICAgICAgICB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAoXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IHZhcmlhYmxlIGhhcyBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIGJ1dCBpcyBtaXNzaW5nIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlIG9yIHNlbGVjdGVkRGF0YVNldFxuICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGxvYWRpbmcgYSBzYXZlZCBzdGVwIC0gc2V0VGVtcGxhdGVWYXJpYWJsZXMgc2V0cyB0aGUgSUQsIGJ1dCB3ZSBuZWVkIHBhcmFtZXRlck9wdGlvbnMgdG8gc2V0IHRoZSBuYW1lIGFuZCBkYXRhIHNldFxuICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/LnNvbWUodiA9PlxuICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiZcbiAgICAgICAgICAgIHYuZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInICYmXG4gICAgICAgICAgICB2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgKCF2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8ICF2LnNlbGVjdGVkRGF0YVNldClcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT5cbiAgICAgICAgICAgICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odikgJiYgdi5kYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiYgIXYuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHx8XG4gICAgICAgICAgLy8gVGhlIGV4dHJhIHVuaW5pdGlhbGl6ZWQtdmFyaWFibGUgY2hlY2sgYmVsb3cgaXMgZGVidWctb25seTogb25seSBydW4gaXQgaW4gZGVidWcgbW9kZVxuICAgICAgICAgIC8vIHRvIGF2b2lkIGRvdWJsZS1pbml0aWFsaXNpbmcgdmFyaWFibGVzIGluIG5vbi1kZWJ1ZyBzdGVwLWJ1aWxkZXIgZmxvd3MuXG4gICAgICAgICAgKHRoaXMuaXNEZWJ1ZyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzPy5zb21lKHYgPT5cbiAgICAgICAgICAgIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHYpICYmIHYuZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInICYmICF2LnNlbGVjdGVkVGVzdERhdGFQcm9maWxlXG4gICAgICAgICAgKSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGFyYW1ldGVyT3B0aW9ucyBJbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXNcIiwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKTtcbiAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgbm93IHRoYXQgcGFyYW1ldGVyT3B0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHBhcmFtZXRlciBvcHRpb25zIG9yIGxvYWRpbmcgc3RhdGUgY2hhbmdlZCwgcmVmcmVzaCB0ZXN0IGRhdGEgcHJvZmlsZSBjb25maWdzIChzbyBzZWFyY2gvbG9hZCBtb3JlIGFuZCBvcHRpb25zIHN0YXkgaW4gc3luYylcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10gfHxcbiAgICAgICAgICBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10pIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXJhbWV0ZXJPcHRpb25zIFJlZnJlc2hUZXN0RGF0YVZhcmlhYmxlc1wiLCBjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10pO1xuICAgICAgICAvLyBDbGVhciB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIGNhY2hlIHNpbmNlIHByb2ZpbGVzIGxpc3Qgb3IgbG9hZGluZyBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgLy8gUmVjb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgYSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHJlY29tcHV0ZSBkYXRhIHNldCBjb25maWdcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFuZCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIHNlbGVjdGVkIGRhdGEgc2V0XG4gICAgICAgICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlIGZvciBjYWNoZSBrZXlcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRlbnRpZmllciA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgOiB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0XyR7cHJvZmlsZUlkZW50aWZpZXJ9XyR7dmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBpbml0aWFsaXplVGVzdERhdGFWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgLy8gUHJlc2VydmUgZXhpc3RpbmcgZGF0YVR5cGUgaWYgYWxyZWFkeSBzZXQgKGUuZy4sIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMgd2hlbiBsb2FkaW5nIHNhdmVkIHN0ZXApXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZTtcbiAgICAgICAgY29uc3QgeyBkYXRhVHlwZSwgcmF3VmFsdWUgfSA9IHRoaXMucGFyc2VUZXN0RGF0YVZhbHVlKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgLy8gU2V0IHByb3BlcnRpZXMgZGlyZWN0bHkgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAvLyBVc2UgZXhpc3RpbmcgZGF0YVR5cGUgaWYgaXQgd2FzIGFscmVhZHkgc2V0LCBvdGhlcndpc2UgdXNlIHBhcnNlZCBkYXRhVHlwZVxuICAgICAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGV4aXN0aW5nRGF0YVR5cGUgfHwgZGF0YVR5cGU7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBkYXRhIHR5cGUgaW4gdGhlIEZvcm1BcnJheVxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGU7IC8vIFVzZSB0aGUgZmluYWwgZGF0YVR5cGUgKGV4aXN0aW5nIG9yIHBhcnNlZClcbiAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChmaW5hbERhdGFUeXBlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZmluYWxEYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgcGFyYW1ldGVyIHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGlmIChmaW5hbERhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMTogVXNlIHNhdmVkIHRlc3QgZGF0YSBwcm9maWxlIElEIGZyb20gdGVzdFN0ZXAudGVzdERhdGFMaXN0IChzZXQgYnkgc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGV0IHByb2ZpbGVUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgbGV0IGRhdGFTZXRUb1VzZTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgY29uc3QgaGFzRGVmYXVsdFByb2ZpbGUgPSB0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBoYXNTYXZlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVNaXNtYXRjaFdpdGhEZWZhdWx0ID1cbiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIGhhc1NhdmVkUHJvZmlsZSAmJlxuICAgICAgICAgICAgICAgIE51bWJlcih2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSAhPT0gTnVtYmVyKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcblxuICAgICAgICAgICAgICAvLyBXaGVuIGRlZmF1bHQgcHJvZmlsZSBpcyBkaWZmZXJlbnQgZnJvbSBzYXZlZCBwcm9maWxlLCBpZ25vcmUgc2F2ZWQgdGVtcGxhdGUtdmFyaWFibGUgc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBwcm9maWxlL3N0YXJ0LWVuZCBhbmQgY2xlYXIgcGFyYW1ldGVyIHZhbHVlIGJlY2F1c2UgcHJvZmlsZSBjb250ZXh0IGNoYW5nZWQuXG4gICAgICAgICAgICAgIGlmIChwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayBzYXZlZCBwcm9maWxlIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb2ZpbGUgb3ZlcnJpZGUuXG4gICAgICAgICAgICAgIGlmICghaGFzRGVmYXVsdFByb2ZpbGUgJiYgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFwcm9maWxlTWlzbWF0Y2hXaXRoRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4IGlzIHByb3ZpZGVkLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIHRocm91Z2ggYWxsIGRhdGEgc2V0cyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiBwcm9maWxlVG9Vc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQgJiYgZGF0YVNldC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGF0YSBzZXQgaGFzIHRoZSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTZXQuZGF0YS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgZm91bmQgYnkgcGFyYW1ldGVyIG5hbWUsIHVzZSBmaXJzdCBkYXRhIHNldCBhcyBmYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFTZXRUb1VzZSAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IFVzZSBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHdoZW5ldmVyIHByb3ZpZGVkIChvdmVycmlkZSB0ZW1wbGF0ZS12YXJpYWJsZSBwcm9maWxlKS5cbiAgICAgICAgICAgICAgaWYgKCFwcm9maWxlVG9Vc2UgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVUb1VzZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVG9Vc2UgJiYgcHJvZmlsZVRvVXNlLmRhdGEgJiYgcHJvZmlsZVRvVXNlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHByb2ZpbGVUb1VzZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0VG9Vc2UgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldFRvVXNlID0gcHJvZmlsZVRvVXNlLmRhdGFbMF07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHByb2ZpbGUgYW5kIGRhdGEgc2V0LCBzZXQgdGhlIHZhcmlhYmxlIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUb1VzZSAmJiBkYXRhU2V0VG9Vc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IHByb2ZpbGVUb1VzZS5uYW1lIHx8IHByb2ZpbGVUb1VzZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBkYXRhU2V0VG9Vc2UubmFtZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHByb2ZpbGVUb1VzZS5pZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luc2lkZUZvckxvb3BTdGVwKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhRW5kSW5kZXggIT0gbnVsbCAmJiBwcm9maWxlVG9Vc2UuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGFTZXQgPSBwcm9maWxlVG9Vc2UuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gZW5kRGF0YVNldD8ubmFtZSB8fCBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCAoc3RyaW5nKSBmb3Igc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgZm9ybSBjb250cm9sIHRvIG1hdGNoIG9wdGlvbi5pZCBmb3JtYXRcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlSWRTdHJpbmcgPSBTdHJpbmcocHJvZmlsZVRvVXNlLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKHByb2ZpbGVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXRTdGFydCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCB8fCBkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldEVuZCcsIG5ldyBGb3JtQ29udHJvbCh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kIHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNldCBwYXJhbWV0ZXIgdmFsdWUgaWYgd2UgZm91bmQgaXQgaW4gdGhlIGRhdGEgc2V0LCBvdGhlcndpc2UgY2xlYXIgaXQgZm9yIHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCB0aGUgcGFyYW1ldGVyIGluIGEgZGF0YSBzZXQsIHNldCBpdDsgb3RoZXJ3aXNlIGNsZWFyIGZvciB1c2VyIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHJhd1ZhbHVlICYmIGRhdGFTZXRUb1VzZSAmJiBkYXRhU2V0VG9Vc2UuZGF0YSAmJiBkYXRhU2V0VG9Vc2UuZGF0YS5oYXNPd25Qcm9wZXJ0eShyYXdWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YXJpYWJsZS52YWx1ZSAvLyBVc2UgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgQHx0NjY2NjY2fClcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShwYXJhbVZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlcyB0byBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIGNvbmZpZ3Mgd2l0aCBuZXcgdmFsdWVzXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgdmFyaWFibGUgdG8gZW5zdXJlIGZyZXNoIGNvbmZpZ3NcbiAgICAgICAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV90ZXN0RGF0YVByb2ZpbGVgKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBjYWNoZSAtIG5lZWQgdG8gY2xlYXIgYWxsIHBvc3NpYmxlIGtleXMgc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZXhhY3QgZm9ybWF0XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogSWYgbm8gZGVmYXVsdCBwcm9maWxlIG92ZXJyaWRlIGFuZCBubyBzYXZlZCBwcm9maWxlIGZvdW5kLCBzZWFyY2ggYnkgcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgPT0gbnVsbCAmJiAhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAvLyBObyBkZWZhdWx0IHZhbHVlcyAtIHVzZSBleGlzdGluZyBsb2dpYyB0byBmaW5kIGZyb20gcGFyYW1ldGVyIHZhbHVlXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJhd1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IHRoYXQgY29udGFpbnMgdGhpcyBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgdGVzdCBkYXRhIHByb2ZpbGVzIGFuZCB0aGVpciBkYXRhIHNldHNcbiAgICAgICAgICAgICAgICBsZXQgZm91bmRQcm9maWxlOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZERhdGFTZXQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0RGF0YVByb2ZpbGUgb2YgdGhpcy5wYXJhbWV0ZXJPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGVzdERhdGFQcm9maWxlLmRhdGEgJiYgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCBhbGwgZGF0YSBzZXRzIGluIHRoaXMgcHJvZmlsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFTZXQgb2YgdGVzdERhdGFQcm9maWxlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNldCAmJiBkYXRhU2V0LmRhdGEgJiYgZGF0YVNldC5kYXRhLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGF0YVNldCA9IGRhdGFTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFByb2ZpbGUgJiYgZm91bmREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGZvdW5kUHJvZmlsZS5uYW1lIHx8IGZvdW5kUHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGZvdW5kRGF0YVNldC5uYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGZvdW5kUHJvZmlsZS5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKGZvdW5kUHJvZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBwYXJhbSBuYW1lIChmb3IgZHJvcGRvd24gZGlzcGxheSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocGFyYW1OYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseSBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHBhcmFtTmFtZSwgJ3BhcmFtZXRlcicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgbm90IGZvdW5kLCBmb3JtYXQgdGhlIHJhdyB2YWx1ZSBpZiBpdCdzIGEgcGFyYW1ldGVyIHR5cGVcbiAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUocmF3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB2YXJpYWJsZS52YWx1ZSBpcyBmb3JtYXR0ZWQgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgcGFyc2UgdGhlIHZhbHVlIHRvIGV4dHJhY3QgZW52aXJvbm1lbnQgYW5kIHBhcmFtZXRlclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQgdmFsdWVzIGFyZSBpbiBmb3JtYXQgKnxwYXJhbWV0ZXJOYW1lfFxuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcmF3VmFsdWU7XG4gICAgICAgICAgICBpZiAocGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzYXZlZCBlbnZpcm9ubWVudElkLCB1c2UgaXQgZm9yIGFuIGV4YWN0IG1hdGNoIChlbnYte2lkfS17cGFyYW19KVxuICAgICAgICAgICAgICAvLyB0byBhdm9pZCBzZWxlY3RpbmcgdGhlIHdyb25nIGVudmlyb25tZW50IHdoZW4gbXVsdGlwbGUgZW52aXJvbm1lbnRzIHNoYXJlIHBhcmFtIG5hbWVzLlxuICAgICAgICAgICAgICBsZXQgZW52T3B0aW9uOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGFjdElkID0gYGVudi0ke3ZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZH0tJHtwYXJhbU5hbWV9YDtcbiAgICAgICAgICAgICAgICBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuaWQgPT09IGV4YWN0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBtYXRjaCBieSBwYXJhbSBuYW1lIG9ubHkgKGxlZ2FjeSAvIGZpcnN0LXRpbWUgc2F2ZSlcbiAgICAgICAgICAgICAgaWYgKCFlbnZPcHRpb24pIHtcbiAgICAgICAgICAgICAgICBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYubmFtZSA9PT0gcGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gZW52T3B0aW9uLmVudmlyb25tZW50O1xuXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbmQgc3RvcmUgZW52aXJvbm1lbnQgSUQgZnJvbSB0aGUgb3B0aW9uIGlkXG4gICAgICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChlbnZPcHRpb24uZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZW52T3B0aW9uLmVudmlyb25tZW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGAqfCR7cGFyYW1OYW1lfXxgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBlbGVtZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgLy8gSWYgbm8gZWxlbWVudElkLCBkb24ndCBzZWxlY3QgYW55dGhpbmcgLSB1c2UgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gdmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAzOiBGaW5kIGJ5IGxvY2F0b3JWYWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubG9jYXRvclZhbHVlID09PSBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgZWxlbWVudC5zY3JlZW5OYW1lT2JqKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayB0byBlbnN1cmUgVUkgdXBkYXRlcyBhZnRlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSBmcm9tIEZvcm1BcnJheSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiAoY29udHJvbCBhcyBGb3JtR3JvdXApLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGF0IGEgc3BlY2lmaWMgaW5kZXggZnJvbSBGb3JtQXJyYXkgKGZvciB0ZW1wbGF0ZSB1c2UpICovXG4gIGdldEZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIHByaXZhdGUgcHJlY29tcHV0ZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSByZXR1cm47XG4gICAgXG4gICAgLy8gUHJlLWNvbXB1dGUgYWxsIHNlbGVjdCBjb25maWdzXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIC8vIFByZS1jb21wdXRlIHJlZ3VsYXIgc2VsZWN0IGNvbmZpZ3NcbiAgICAgIGlmICh0aGlzLnNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgICAgdGhpcy5nZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZGF0YSB0eXBlIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgcGFyYW1ldGVyIGFuZCBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlncyBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgc2V0IGNvbmZpZyBpZiB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFTZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBjb25maWcgaWYgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgICB0aGlzLmdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGlmIGVudmlyb25tZW50IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcmUtY29tcHV0ZSBlbGVtZW50IHZhcmlhYmxlIGNvbmZpZ3MgKHNjcmVlbiBuYW1lICsgZWxlbWVudClcbiAgICAgIGlmICh0aGlzLmlzRWxlbWVudFR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbGVtZW50IGNvbmZpZyBpZiBzY3JlZW4gbmFtZSBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICB0aGlzLmdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIHBhcnNlVGVzdERhdGFWYWx1ZSh2YWx1ZTogc3RyaW5nKTogeyBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnLCByYXdWYWx1ZTogc3RyaW5nIH0ge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6ICcnIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBwYXJhbWV0ZXIgZm9ybWF0OiBAfHZhbHVlfFxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGFyYW1ldGVyJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgcnVudGltZSBmb3JtYXQ6ICR8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnJHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3J1bnRpbWUnLCByYXdWYWx1ZTogdmFsdWUuc2xpY2UoMiwgLTEpIH07XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBlbnZpcm9ubWVudCBmb3JtYXQ6ICp8dmFsdWV8XG4gICAgZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBQbGFpbiB0ZXh0IChubyBmb3JtYXR0aW5nKVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JywgcmF3VmFsdWU6IHZhbHVlIH07XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHN0cmluZyB7XG4gICAgaWYgKCFyYXdWYWx1ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdwYXJhbWV0ZXInOlxuICAgICAgICByZXR1cm4gYEB8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ3J1bnRpbWUnOlxuICAgICAgICByZXR1cm4gYCR8JHtyYXdWYWx1ZX18YDtcbiAgICAgIGNhc2UgJ2Vudmlyb25tZW50JzpcbiAgICAgICAgcmV0dXJuIGAqfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdwbGFpbi10ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByYXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIGdldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIEZvciBlbGVtZW50IHZhcmlhYmxlcywgaW5jbHVkZSBlbGVtZW50T3B0aW9ucywgaGFzTW9yZUVsZW1lbnRzLCBhbmQgaXNMb2FkaW5nRWxlbWVudHMgaW4gY2FjaGUga2V5XG4gICAgLy8gRm9yIHVwbG9hZCB2YXJpYWJsZXMsIGluY2x1ZGUgdXBsb2FkT3B0aW9ucywgaGFzTW9yZVVwbG9hZHMsIGFuZCBpc0xvYWRpbmdVcGxvYWRzIGluIGNhY2hlIGtleVxuICAgIC8vIE9wdGltaXplIGNhY2hlIGtleSBjb21wdXRhdGlvbiAtIHVzZSBsZW5ndGggaW5zdGVhZCBvZiBmdWxsIGFycmF5IGpvaW4gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGlzRWxlbWVudFZhcmlhYmxlID0gdmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCc7XG4gICAgY29uc3QgaXNVcGxvYWRWYXJpYWJsZSA9IHZhcmlhYmxlLm5hbWUgPT09ICd1cGxvYWQnICYmIHZhcmlhYmxlLnR5cGUgPT09ICdkcm9wZG93bic7XG4gICAgXG4gICAgY29uc3Qgb3B0aW9uc0tleSA9IGlzRWxlbWVudFZhcmlhYmxlXG4gICAgICA/IGAke3RoaXMuZWxlbWVudE9wdGlvbnMubGVuZ3RofV8ke3RoaXMuZWxlbWVudE9wdGlvbnMubWFwKGVsID0+IGVsLmlkIHx8ICcnKS5qb2luKCcsJyl9YFxuICAgICAgOiBpc1VwbG9hZFZhcmlhYmxlXG4gICAgICA/IGAke3RoaXMudXBsb2FkT3B0aW9ucy5sZW5ndGh9XyR7dGhpcy51cGxvYWRPcHRpb25zLm1hcCgodXA6IGFueSkgPT4gdXAuaWQgfHwgdXAubmFtZSB8fCAnJykuam9pbignLCcpfWBcbiAgICAgIDogYCR7dmFyaWFibGUub3B0aW9ucz8ubGVuZ3RoIHx8IDB9XyR7dmFyaWFibGUub3B0aW9ucz8uam9pbignLCcpIHx8ICcnfWA7XG4gICAgXG4gICAgLy8gSW5jbHVkZSBoYXNNb3JlIGFuZCBpc0xvYWRpbmcgaW4gY2FjaGUga2V5IGZvciBlbGVtZW50IGFuZCB1cGxvYWQgdmFyaWFibGVzXG4gICAgY29uc3QgY2FjaGVLZXkgPSBpc0VsZW1lbnRWYXJpYWJsZVxuICAgICAgPyBgJHt2YXJpYWJsZS5uYW1lfV8ke29wdGlvbnNLZXl9XyR7dGhpcy5oYXNNb3JlRWxlbWVudHN9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gXG4gICAgICA6IGlzVXBsb2FkVmFyaWFibGVcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZVVwbG9hZHN9XyR7dGhpcy5pc0xvYWRpbmdVcGxvYWRzfWBcbiAgICAgIDogYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fWA7XG4gICAgXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gVXNlIGVsZW1lbnRPcHRpb25zIGZvciBlbGVtZW50IHZhcmlhYmxlcywgdXBsb2FkT3B0aW9ucyBmb3IgdXBsb2FkIHZhcmlhYmxlcywgb3RoZXJ3aXNlIHVzZSB2YXJpYWJsZS5vcHRpb25zXG4gICAgbGV0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgICBpZiAoaXNFbGVtZW50VmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciBlbGVtZW50IG9wdGlvbnMsIHVzZSBsb2NhdG9yVmFsdWUgYXMgYm90aCBpZCBhbmQgdmFsdWUgc28gdGhlIGNvbXBvbmVudCByZXR1cm5zIGxvY2F0b3JWYWx1ZVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyB0aGUgbG9jYXRvclZhbHVlIChub3QgdGhlIGVsZW1lbnQgaWQpXG4gICAgICBvcHRpb25zQXJyYXkgPSB0aGlzLmVsZW1lbnRPcHRpb25zXG4gICAgICAgIC5tYXAoZWwgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGxvY2F0b3JWYWx1ZSwgLy8gVXNlIGxvY2F0b3JWYWx1ZSBhcyBpZCBzbyBpdCBnZXRzIHJldHVybmVkIGFzIHRoZSB2YWx1ZVxuICAgICAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbHVlOiBsb2NhdG9yVmFsdWUsIC8vIEFsc28gc2V0IHZhbHVlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgbmFtZTogYCR7ZWwubmFtZX0gKCR7ZWwuc2NyZWVuTmFtZU9iaj8ubmFtZSB8fCAnJ30pYCxcbiAgICAgICAgICAgIGxhYmVsOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICAgICAgb3RoZXJMb2NhdG9yOiBlbC5vdGhlckxvY2F0b3JcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVXBsb2FkVmFyaWFibGUpIHtcbiAgICAgIC8vIEZvciB1cGxvYWQgb3B0aW9ucywgbWFwIHVwbG9hZCBvYmplY3RzIHRvIFNlbGVjdE9wdGlvbiBmb3JtYXRcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMudXBsb2FkT3B0aW9ucy5tYXAoKHVwbG9hZDogYW55KSA9PiB7XG4gICAgICAgIC8vIEFzc3VtaW5nIHVwbG9hZCBoYXMgaWQsIG5hbWUsIG9yIHNpbWlsYXIgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB1cGxvYWRJZCA9IHVwbG9hZC5pZD8udG9TdHJpbmcoKSB8fCB1cGxvYWQubmFtZSB8fCAnJztcbiAgICAgICAgY29uc3QgdXBsb2FkTmFtZSA9IHVwbG9hZC5uYW1lIHx8IHVwbG9hZC5maWxlTmFtZSB8fCB1cGxvYWRJZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdXBsb2FkSWQsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkLFxuICAgICAgICAgIG5hbWU6IHVwbG9hZE5hbWUsXG4gICAgICAgICAgbGFiZWw6IHVwbG9hZE5hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQudmFsdWUsIHZhbHVlOiBvcHQudmFsdWUsIG5hbWU6IG9wdC5sYWJlbCwgbGFiZWw6IG9wdC5sYWJlbH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIGVsZW1lbnQgdmFyaWFibGVzXG4gICAgaWYgKGlzRWxlbWVudFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIGRyb3Bkb3duXG4gICAgICBjb25maWcuc2VydmVyU2VhcmNoID0gdHJ1ZTsgLy8gRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaFxuICAgICAgY29uZmlnLmhhc01vcmUgPSB0aGlzLmhhc01vcmVFbGVtZW50cztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ0VsZW1lbnRzO1xuICAgICAgY29uZmlnLm9uTG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVFbGVtZW50cy5lbWl0KCk7XG4gICAgICB9O1xuICAgICAgY29uZmlnLm9uU2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gRW1pdCBzZWFyY2ggZXZlbnQgd2hlbiB1c2VyIHR5cGVzIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbG9hZCBtb3JlIGFuZCBzZWFyY2ggc3VwcG9ydCBmb3IgdXBsb2FkIHZhcmlhYmxlc1xuICAgIGlmIChpc1VwbG9hZFZhcmlhYmxlKSB7XG4gICAgICBjb25maWcuc2VhcmNoYWJsZSA9IHRydWU7IC8vIEVuYWJsZSBzZWFyY2ggZm9yIHVwbG9hZCBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlVXBsb2FkcztcbiAgICAgIGNvbmZpZy5pc0xvYWRpbmcgPSB0aGlzLmlzTG9hZGluZ1VwbG9hZHM7XG4gICAgICBjb25maWcub25Mb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVVwbG9hZHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaFVwbG9hZHMuZW1pdChxdWVyeSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRlc3QtZGF0YSB2YXJpYWJsZSwgcGFyc2UgYW5kIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGRhdGEgdHlwZVxuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSkpIHtcbiAgICAgIGNvbnN0IHsgZGF0YVR5cGU6IHBhcnNlZERhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgY29uc3QgY3VycmVudERhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcgPVxuICAgICAgICAodmFyaWFibGUuZGF0YVR5cGUgYXMgYW55KSB8fCAncGxhaW4tdGV4dCc7XG5cbiAgICAgIC8vIENSSVRJQ0FMOiBXaGVuIHVzZXIgaXMgaW4gJ3BhcmFtZXRlcicgbW9kZSBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkgKGUuZy4sIHdoZW5cbiAgICAgIC8vIHNlbGVjdGluZy9jaGFuZ2luZyB0ZXN0LWRhdGEgcHJvZmlsZSwgd2hpY2ggY2xlYXJzIHRoZSB2YWx1ZSB0ZW1wb3JhcmlseSksIHdlIG11c3RcbiAgICAgIC8vIE5PVCBjaGFuZ2UgdGhlIGRhdGFUeXBlIGJhY2sgdG8gJ3BsYWluLXRleHQnLiBLZWVwIGl0IGFzICdwYXJhbWV0ZXInLlxuICAgICAgLy8gT25seSBjaGFuZ2UgZGF0YVR5cGUgaWY6XG4gICAgICAvLyAxLiBUaGUgcGFyc2VkIHR5cGUgbWF0Y2hlcyBjdXJyZW50IHR5cGUgKG5vIGNoYW5nZSBuZWVkZWQpLCBPUlxuICAgICAgLy8gMi4gVGhlIHZhbHVlIGlzIG5vdCBlbXB0eSAodXNlciBpcyBhY3R1YWxseSB0eXBpbmcvc2VsZWN0aW5nIGEgdmFsdWUpLCBPUlxuICAgICAgLy8gMy4gV2UncmUgc3dpdGNoaW5nIEZST00gcGxhaW4tdGV4dCBUTyBwYXJhbWV0ZXIgKGFsbG93IHRoaXMgdHJhbnNpdGlvbilcbiAgICAgIGxldCBmaW5hbERhdGFUeXBlID0gcGFyc2VkRGF0YVR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnREYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicgJiZcbiAgICAgICAgcGFyc2VkRGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JyAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSlcbiAgICAgICkge1xuICAgICAgICAvLyBLZWVwIGFzIHBhcmFtZXRlciAtIGRvbid0IGNoYW5nZSB0byBwbGFpbi10ZXh0XG4gICAgICAgIGZpbmFsRGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgIH1cblxuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlO1xuICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGRhdGEgdHlwZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJyk/LnNldFZhbHVlKGZpbmFsRGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgfVxuICBcbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gTm90ZTogSWYgdmFyaWFibGUgZG9lc24ndCBleGlzdCBpbiBGb3JtQXJyYXksIGl0IHNob3VsZCBiZSBhZGRlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZUJvb2xlYW5DaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBzaG91bGRTaG93RHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMgKGRhdGFLZXkgPT09ICdlbGVtZW50JyksIHdlIHVzZSBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgLy8gU28gcmV0dXJuIGZhbHNlIHRvIHVzZSB0aGUgY2FzY2FkaW5nIGRyb3Bkb3duIHBhdHRlcm5cbiAgICBjb25zdCByZXN1bHQgPSB2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnbGFiZWwnO1xuICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuc2V0KHZhcmlhYmxlLm5hbWUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBcbiAgbmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGN1bGF0aW9uc1xuICAgIGlmICh0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmhhcyh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuZ2V0KHZhcmlhYmxlLm5hbWUpITtcbiAgICB9XG4gICAgY29uc3QgZGF0YUtleSA9IHZhcmlhYmxlLmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZSc7XG4gICAgdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBnZXREYXRhVHlwZU9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RhdGljIGFycmF5XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVPcHRpb25zO1xuICB9XG4gIFxuICBnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZGF0YVR5cGVgO1xuICAgIGlmICh0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgaW4gRm9ybUFycmF5XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnREYXRhVHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFUeXBlJywgLy8gVXNlICdkYXRhVHlwZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVHlwZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YVR5cGVPcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLmRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIGdldEN1cnJlbnREYXRhVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgfVxuICBcbiAgZ2V0UmF3VmFsdWUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YXJpYWJsZS5yYXdWYWx1ZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGFyYW1ldGVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggZW52aXJvbm1lbnQgdHlwZSlcbiAgICovXG4gIGdldCBlbnZpcm9ubWVudFZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdi5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBcbiAgb25EYXRhVHlwZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50Jyk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHZhcmlhYmxlXG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZWQgZGF0YSB0eXBlIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICB2YXJpYWJsZS5kYXRhVHlwZSA9IGRhdGFUeXBlO1xuICAgIFxuICAgIC8vIENsZWFyIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZyBjYWNoZXMgc2luY2UgZGF0YSB0eXBlIGNoYW5nZWRcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2RhdGFTZXRgKTtcbiAgICB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fcGFyYW1Gb3JEYXRhU2V0YCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2Vudmlyb25tZW50YCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X2VudlBhcmFtYCk7XG4gICAgXG4gICAgLy8gR2V0IHRoZSB2YXJpYWJsZSBncm91cFxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGlmIHN3aXRjaGluZyBhd2F5IGZyb20gcGFyYW1ldGVyIHR5cGVcbiAgICBpZiAoZGF0YVR5cGUgIT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBwYXJhbWV0ZXItcmVsYXRlZCBmb3JtIGNvbnRyb2xzIHdoZW4gc3dpdGNoaW5nIGF3YXkgZnJvbSBwYXJhbWV0ZXIgdHlwZVxuICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKSkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZERhdGFTZXRFbmQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXaGVuIHN3aXRjaGluZyBUTyBwYXJhbWV0ZXIgdHlwZSwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9ucyB0byBzdGFydCBmcmVzaFxuICAgICAgLy8gKHVubGVzcyBkZWZhdWx0IHZhbHVlcyBhcmUgcHJvdmlkZWQsIHdoaWNoIHdpbGwgYmUgc2V0IGJlbG93KVxuICAgICAgaWYgKCF0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCB8fCB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggPT0gbnVsbCkge1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZm9ybSBjb250cm9scyBpZiB0aGV5IGV4aXN0XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0RW5kJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIGVudmlyb25tZW50IGlmIHN3aXRjaGluZyBhd2F5IGZyb20gZW52aXJvbm1lbnQgdHlwZVxuICAgIGlmIChkYXRhVHlwZSAhPT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGVudmlyb25tZW50LXJlbGF0ZWQgZm9ybSBjb250cm9sc1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLnJlbW92ZUNvbnRyb2woJ3NlbGVjdGVkRW52aXJvbm1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgdmFsdWUgd2hlbiBzd2l0Y2hpbmcgZGF0YSB0eXBlcyAoc3RhcnQgZnJlc2gpXG4gICAgdmFyaWFibGUudmFsdWUgPSAnJztcbiAgICBcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIGJhc2VkIG9uIG5ldyBkYXRhIHR5cGUgKHdpbGwgYmUgZW1wdHkgc3RyaW5nKVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKCcnLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChhbHdheXMgc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGluIHZhcmlhYmxlKVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgIC8vIEZvciBhbGwgdHlwZXMsIHN0YXJ0IHdpdGggZW1wdHkgdmFsdWUgd2hlbiBzd2l0Y2hpbmdcbiAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgYWxzbyBjbGVhciBzZWxlY3RlZEVudmlyb25tZW50XG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50JyAmJiB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8gcGFyYW1ldGVyIHR5cGUsIGNoZWNrIGZvciBkZWZhdWx0IHZhbHVlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmluZGV4T2YodmFyaWFibGUpO1xuICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBpcyBwcm92aWRlZCBmcm9tIHRlc3QgY2FzZS9GT1IgY29udGV4dC5cbiAgICAgIC8vIEV2ZW4gd2hlbiBkZWZhdWx0IHN0YXJ0IGluZGV4IGlzIG1pc3NpbmcsIHByb2ZpbGUgc2hvdWxkIHN0aWxsIGJlIHByZXNlbGVjdGVkLlxuICAgICAgaWYgKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgKG51bWVyaWMtc2FmZSBtYXRjaCBmb3Igc3RyaW5nL251bWJlciBJRHMpXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+XG4gICAgICAgICAgTnVtYmVyKHRlc3REYXRhLmlkKSA9PT0gTnVtYmVyKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVmYXVsdFByb2ZpbGUpIHtcbiAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGVEYXRhOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFByb2ZpbGUuZGF0YSkgPyBkZWZhdWx0UHJvZmlsZS5kYXRhIDogW107XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFN0YXJ0SW5kZXggPSB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCA/IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCA6IDA7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRTdGFydEluZGV4ID0gcHJvZmlsZURhdGEubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBNYXRoLm1pbihNYXRoLm1heChkZWZhdWx0U3RhcnRJbmRleCwgMCksIHByb2ZpbGVEYXRhLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IC0xO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHREYXRhU2V0ID0gcmVzb2x2ZWRTdGFydEluZGV4ID49IDAgPyBwcm9maWxlRGF0YVtyZXNvbHZlZFN0YXJ0SW5kZXhdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBkYXRhU2V0TmFtZSA9IGRlZmF1bHREYXRhU2V0Py5uYW1lIHx8ICcnO1xuXG4gICAgICAgICAgLy8gQWx3YXlzIHNldCBzZWxlY3RlZCBwcm9maWxlIHdoZW4gZGVmYXVsdCBwcm9maWxlIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSA9IHByb2ZpbGVOYW1lO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgPSBkZWZhdWx0UHJvZmlsZS5pZDtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSBkYXRhU2V0TmFtZSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbnNpZGVGb3JMb29wU3RlcCAmJiBkYXRhU2V0TmFtZSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YUVuZEluZGV4ICE9IG51bGwgJiYgcHJvZmlsZURhdGEubGVuZ3RoID4gdGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleCkge1xuICAgICAgICAgICAgICBjb25zdCBlbmREYXRhU2V0ID0gcHJvZmlsZURhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleF07XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCA9IGVuZERhdGFTZXQ/Lm5hbWUgfHwgZGF0YVNldE5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRFbmQgPSBkYXRhU2V0TmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9scyB3aXRoIHRoZSBhY3R1YWwgdmFsdWVzIHNvIGRyb3Bkb3ducyBkaXNwbGF5IHNlbGVjdGVkIG9wdGlvbnMuXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhU2V0TmFtZSkge1xuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0JywgbmV3IEZvcm1Db250cm9sKGRhdGFTZXROYW1lKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXAgJiYgZGF0YVNldE5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnLCBuZXcgRm9ybUNvbnRyb2wodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0U3RhcnQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWREYXRhU2V0RW5kJywgbmV3IEZvcm1Db250cm9sKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCB8fCBkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRFbmQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kIHx8IGRhdGFTZXROYW1lLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlcy5cbiAgICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3Rlc3REYXRhUHJvZmlsZWApO1xuICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICAgIHRoaXMuZGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICBjb25zdCBwYXJhbUtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGVOYW1lfV9wYXJhbUZvckRhdGFTZXRgKSkge1xuICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIHRoZSBuZXcgc2VsZWN0IGNvbmZpZyBpZiBuZWVkZWRcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5pbmRleE9mKHZhcmlhYmxlKTtcbiAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcicpIHtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgIHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIElmIGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkLCBwcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWdcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCBwcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBjb25zb2xlLmxvZygnb25EYXRhVHlwZUNoYW5nZScsIHZhcmlhYmxlTmFtZSwgZGF0YVR5cGUsIGZvcm1hdHRlZFZhbHVlKTtcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnQgd2l0aCBmb3JtYXR0ZWQgdmFsdWVcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICB9XG4gIFxuICBvbkVsZW1lbnRTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIHNlYXJjaCBmb3Igc2VsZWN0b3IgdmFyaWFibGVzXG4gICAgLy8gVGhlIGtleSB3aWxsIGJlICd2YWx1ZScgc2luY2UgdGhhdCdzIHdoYXQgd2Ugc2V0IGluIHRoZSBjb25maWdcbiAgICAvLyBFbWl0IHRoZSBzZWFyY2ggcXVlcnkgdG8gcGFyZW50IGNvbXBvbmVudFxuICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHJhd1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSB2YXJpYWJsZVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICghdmFyaWFibGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RvcmVkIHJhdyB2YWx1ZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgdmFyaWFibGUucmF3VmFsdWUgPSByYXdWYWx1ZTtcbiAgICBcbiAgICAvLyBHZXQgY3VycmVudCBkYXRhIHR5cGVcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICBcbiAgICAvLyBGb3JtYXQgdGhlIHZhbHVlIGJhc2VkIG9uIGRhdGEgdHlwZVxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlLCBkYXRhVHlwZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlXG4gICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgdGVzdCBkYXRhIHByb2ZpbGVzIGZyb20gcGFyYW1ldGVyIG9wdGlvbnMgKHJhdyBUZXN0RGF0YSBvYmplY3RzKVxuICAgKi9cbiAgZ2V0VW5pcXVlVGVzdERhdGFQcm9maWxlcygpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHByb2ZpbGVNYXAgPSBuZXcgTWFwPHN0cmluZywgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZm9yRWFjaCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gdGVzdERhdGEubmFtZSBpcyB0aGUgdGVzdERhdGFOYW1lIChwcm9maWxlIG5hbWUpXG4gICAgICBjb25zdCBwcm9maWxlTmFtZSA9IHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lO1xuICAgICAgaWYgKHByb2ZpbGVOYW1lICYmICFwcm9maWxlTWFwLmhhcyhwcm9maWxlTmFtZSkpIHtcbiAgICAgICAgcHJvZmlsZU1hcC5zZXQocHJvZmlsZU5hbWUsIHtcbiAgICAgICAgICBpZDogU3RyaW5nKHRlc3REYXRhLmlkKSxcbiAgICAgICAgICBuYW1lOiBwcm9maWxlTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9maWxlcyA9IEFycmF5LmZyb20ocHJvZmlsZU1hcC52YWx1ZXMoKSk7XG4gICAgcmV0dXJuIHByb2ZpbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkYXRhIHNldHMgZm9yIGEgc3BlY2lmaWMgdGVzdCBkYXRhIHByb2ZpbGVcbiAgICogUmV0dXJucyBhbGwgZGF0YSBzZXRzIGZyb20gdGhlIHByb2ZpbGUncyBkYXRhIGFycmF5XG4gICAqL1xuICBnZXREYXRhU2V0c0ZvclRlc3REYXRhUHJvZmlsZShwcm9maWxlSWQ6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgaWRcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRlc3REYXRhLmlkID09PSBOdW1iZXIocHJvZmlsZUlkKTtcbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXRlc3REYXRhUHJvZmlsZSB8fCAhdGVzdERhdGFQcm9maWxlLmRhdGEgfHwgdGVzdERhdGFQcm9maWxlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFJldHVybiBhbGwgZGF0YSBzZXRzIGZyb20gdGhlIHByb2ZpbGVcbiAgICByZXR1cm4gdGVzdERhdGFQcm9maWxlLmRhdGEubWFwKChkYXRhU2V0OiBhbnkpID0+ICh7XG4gICAgICBpZDogZGF0YVNldC5uYW1lLFxuICAgICAgbmFtZTogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGRhdGEgc2V0IGluIGEgdGVzdCBkYXRhIHByb2ZpbGVcbiAgICogRXh0cmFjdHMgcGFyYW1ldGVyIG5hbWVzIGZyb20gdGhlIHNlbGVjdGVkIGRhdGEgc2V0J3MgZGF0YSBvYmplY3RcbiAgICovXG4gIGdldFBhcmFtZXRlcnNGb3JEYXRhU2V0KHByb2ZpbGVJZE9yTmFtZTogc3RyaW5nLCBkYXRhU2V0TmFtZTogc3RyaW5nKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBpZCBvciBuYW1lXG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vIFRyeSB0byBtYXRjaCBieSBJRCBmaXJzdCAoaWYgcHJvZmlsZUlkT3JOYW1lIGlzIGEgbnVtYmVyKVxuICAgICAgY29uc3QgaWRNYXRjaCA9ICFpc05hTihOdW1iZXIocHJvZmlsZUlkT3JOYW1lKSkgJiYgdGVzdERhdGEuaWQgPT09IE51bWJlcihwcm9maWxlSWRPck5hbWUpO1xuICAgICAgLy8gT3RoZXJ3aXNlIHRyeSB0byBtYXRjaCBieSBuYW1lXG4gICAgICBjb25zdCBuYW1lTWF0Y2ggPSAodGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWUpID09PSBwcm9maWxlSWRPck5hbWU7XG4gICAgICByZXR1cm4gaWRNYXRjaCB8fCBuYW1lTWF0Y2g7XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUgfHwgIXRlc3REYXRhUHJvZmlsZS5kYXRhIHx8IHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzcGVjaWZpYyBkYXRhIHNldCBieSBuYW1lXG4gICAgY29uc3QgZGF0YVNldCA9IHRlc3REYXRhUHJvZmlsZS5kYXRhLmZpbmQoKGRzOiBhbnkpID0+IGRzLm5hbWUgPT09IGRhdGFTZXROYW1lKTtcbiAgICBpZiAoIWRhdGFTZXQgfHwgIWRhdGFTZXQuZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgYWxsIHBhcmFtZXRlciBrZXlzIGZyb20gdGhlIGRhdGEgc2V0J3MgZGF0YSBvYmplY3RcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGRhdGFTZXQuZGF0YSk7XG4gICAgcmV0dXJuIHBhcmFtZXRlck5hbWVzLm1hcChwYXJhbU5hbWUgPT4gKHtcbiAgICAgIGlkOiBwYXJhbU5hbWUsXG4gICAgICBuYW1lOiBwYXJhbU5hbWUsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciB0ZXN0IGRhdGEgcHJvZmlsZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMpXG4gICAqL1xuICBnZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fdGVzdERhdGFQcm9maWxlYDtcbiAgICBcbiAgICAvLyBHZXQgdW5pcXVlIHRlc3QgZGF0YSBwcm9maWxlc1xuICAgIGNvbnN0IHByb2ZpbGVzID0gdGhpcy5nZXRVbmlxdWVUZXN0RGF0YVByb2ZpbGVzKCk7XG4gICAgLy8gQ3JlYXRlIG9wdGlvbnMgd2l0aCBwcm9maWxlIG5hbWUgYW5kIElEIChkaXNwbGF5IG5hbWUgd2l0aCBJRClcbiAgICBsZXQgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHByb2ZpbGVzLm1hcChwcm9maWxlID0+IHtcbiAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIHRvIGdldCB0aGUgSURcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHByb2ZpbGUubmFtZTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZCB8fCBwcm9maWxlLmlkO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogU3RyaW5nKHByb2ZpbGVJZCksXG4gICAgICAgIHZhbHVlOiBwcm9maWxlLm5hbWUsXG4gICAgICAgIG5hbWU6IGAke3Byb2ZpbGUubmFtZX1gLCAvLyBEaXNwbGF5IG5hbWUgd2l0aCBJRFxuICAgICAgICBsYWJlbDogYCR7cHJvZmlsZS5uYW1lfWBcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgaXRcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgXG4gICAgICAgICAgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgXG4gICAgICAgICAgOiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgJycpO1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgdXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiB2YXJpYWJsZSBoYXMgYSBzZWxlY3RlZCBwcm9maWxlXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHZhbHVlIGlzIHNldCBldmVuIGlmIGNvbmZpZyB3YXMgY2FjaGVkXG4gICAgICAvLyBVc2UgcHJvZmlsZSBJRCAod2hpY2ggbWF0Y2hlcyBvcHQuaWQpIGluc3RlYWQgb2YgcHJvZmlsZSBuYW1lICh3aGljaCBtYXRjaGVzIG9wdC52YWx1ZSlcbiAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIHByb2ZpbGUgSUQgZXhpc3RzIGluIG9wdGlvbnMgYmVmb3JlIHNldHRpbmdcbiAgICAgICAgY29uc3QgcHJvZmlsZUV4aXN0cyA9IG9wdGlvbnNBcnJheS5zb21lKG9wdCA9PiBvcHQuaWQgPT09IHByb2ZpbGVJZFN0cmluZyk7XG4gICAgICAgIGlmIChwcm9maWxlRXhpc3RzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gcHJvZmlsZUlkU3RyaW5nKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBpZiB3ZSBvbmx5IGhhdmUgdGhlIHByb2ZpbGUgbmFtZSwgZmluZCB0aGUgbWF0Y2hpbmcgb3B0aW9uIGFuZCB1c2UgaXRzIElEXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gb3B0aW9uc0FycmF5LmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpO1xuICAgICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udHJvbFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udHJvbFZhbHVlICE9PSBtYXRjaGluZ09wdGlvbi5pZCkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKG1hdGNoaW5nT3B0aW9uLmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgdmFyaWFibGUncyBwcm9maWxlIElEIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcihtYXRjaGluZ09wdGlvbi5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJvZmlsZSBpcyBhbHdheXMgaW4gdGhlIG9wdGlvbnMgbGlzdCBzbyB3aGVuIHRoZSB1c2VyXG4gICAgLy8gcmVvcGVucyB0aGUgc2VsZWN0IGFmdGVyIHNlYXJjaGluZy9zZWxlY3RpbmcsIHRoZSBzZWxlY3RlZCBvcHRpb24gc3RpbGwgc2hvd3MuXG4gICAgY29uc3QgY3VycmVudEZvcm1WYWx1ZSA9IHZhcmlhYmxlR3JvdXA/LmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IChjdXJyZW50Rm9ybVZhbHVlICE9IG51bGwgJiYgY3VycmVudEZvcm1WYWx1ZSAhPT0gJycgPyBTdHJpbmcoY3VycmVudEZvcm1WYWx1ZSkgOiBudWxsKTtcbiAgICBpZiAoc2VsZWN0ZWRJZCAmJiAhb3B0aW9uc0FycmF5LnNvbWUob3B0ID0+IFN0cmluZyhvcHQuaWQpID09PSBzZWxlY3RlZElkKSkge1xuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSB8fCBzZWxlY3RlZElkO1xuICAgICAgb3B0aW9uc0FycmF5ID0gW1xuICAgICAgICB7IGlkOiBzZWxlY3RlZElkLCB2YWx1ZTogZGlzcGxheU5hbWUsIG5hbWU6IGRpc3BsYXlOYW1lLCBsYWJlbDogZGlzcGxheU5hbWUgfSxcbiAgICAgICAgLi4ub3B0aW9uc0FycmF5XG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdXNlIGNhY2hlIGlmIHRoZSBjYWNoZWQgY29uZmlnJ3Mgb3B0aW9ucyBpbmNsdWRlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoc28gcmVvcGVuaW5nIHNob3dzIHNlbGVjdGVkKVxuICAgIGlmICh0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgICBjb25zdCBjb250cm9sVmFsID0gdmFyaWFibGVHcm91cD8uZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5DYWNoZWQgPSBjb250cm9sVmFsID09IG51bGwgfHwgY29udHJvbFZhbCA9PT0gJycgfHwgKGNhY2hlZC5vcHRpb25zIHx8IFtdKS5zb21lKChvOiBTZWxlY3RPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKGNvbnRyb2xWYWwpIHx8IG8udmFsdWUgPT09IGNvbnRyb2xWYWwpO1xuICAgICAgaWYgKHNlbGVjdGVkSW5DYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgIH1cbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlUGFyYW1ldGVycyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdQYXJhbWV0ZXJzLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hQYXJhbWV0ZXJzLmVtaXQocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIHRoZSBwcm9maWxlIElEIChzdHJpbmcpIGZyb20gdGhlIG1hdC1vcHRpb25cbiAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSUQgdG8gZ2V0IHRoZSBuYW1lXG4gICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlc3REYXRhLmlkID09PSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3JlIGJvdGggSUQgYW5kIG5hbWVcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRlc3REYXRhUHJvZmlsZT8uaWQ7XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlPy5uYW1lIHx8IHRlc3REYXRhUHJvZmlsZT8udGVzdERhdGFOYW1lIHx8ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9ICcnO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbHNcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXRTdGFydCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldFN0YXJ0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldEVuZCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgc2VsZWN0IGNvbmZpZ3Mgc2luY2UgcHJvZmlsZSBjaGFuZ2VkXG4gICAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIGNvbmZpZ3MgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZGF0YVNldGApKSB7XG4gICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZGF0YSBzZXQgd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGRhdGEgc2V0IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICAgKi9cbiAgZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmaW5kIElEIGZyb20gcHJvZmlsZSBuYW1lXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIHByb2ZpbGUgSUQgZnJvbSB0aGUgcHJvZmlsZSBuYW1lXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgZm9yIGNhY2hlIGtleSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0XyR7cHJvZmlsZUlkVG9Vc2UgfHwgc2VsZWN0ZWRQcm9maWxlIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGF0YSBzZXRzIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgdXNpbmcgSURcbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgc2V0IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCB8fCAnJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFTZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZERhdGFTZXQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGF0YSBTZXQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBkYXRhIHNldCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnIHNpbmNlIGRhdGEgc2V0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqIERhdGEgU2V0IFN0YXJ0L0VuZCBzZWxlY3QgY29uZmlnIGZvciBGT1ItbG9vcCBjb250ZXh0LiAqL1xuICBnZXREYXRhU2V0UmFuZ2VTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIsIHJhbmdlOiAnc3RhcnQnIHwgJ2VuZCcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogcmFuZ2UgPT09ICdzdGFydCcgPyAnc2VsZWN0ZWREYXRhU2V0U3RhcnQnIDogJ3NlbGVjdGVkRGF0YVNldEVuZCcsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHNlbGVjdGVkUHJvZmlsZTtcbiAgICAgIH0pO1xuICAgICAgcHJvZmlsZUlkVG9Vc2UgPSB0ZXN0RGF0YVByb2ZpbGU/LmlkID8gU3RyaW5nKHRlc3REYXRhUHJvZmlsZS5pZCkgOiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRSYW5nZV8ke3JhbmdlfV8ke3Byb2ZpbGVJZFRvVXNlIHx8IHNlbGVjdGVkUHJvZmlsZSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRSYW5nZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTZXRzID0gdGhpcy5nZXREYXRhU2V0c0ZvclRlc3REYXRhUHJvZmlsZShwcm9maWxlSWRUb1VzZSk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGRhdGFTZXRzLm1hcChkYXRhU2V0ID0+ICh7XG4gICAgICBpZDogZGF0YVNldC5uYW1lLFxuICAgICAgdmFsdWU6IGRhdGFTZXQubmFtZSxcbiAgICAgIG5hbWU6IGRhdGFTZXQubmFtZSxcbiAgICAgIGxhYmVsOiBkYXRhU2V0Lm5hbWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBrZXkgPSByYW5nZSA9PT0gJ3N0YXJ0JyA/ICdzZWxlY3RlZERhdGFTZXRTdGFydCcgOiAnc2VsZWN0ZWREYXRhU2V0RW5kJztcbiAgICBjb25zdCBjdXJyZW50VmFsID0gcmFuZ2UgPT09ICdzdGFydCcgPyAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0U3RhcnQgfHwgJycpIDogKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldEVuZCB8fCAnJyk7XG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoa2V5KSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woa2V5LCBuZXcgRm9ybUNvbnRyb2woY3VycmVudFZhbCkpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsICYmIHZhcmlhYmxlR3JvdXAuZ2V0KGtleSk/LnZhbHVlICE9PSBjdXJyZW50VmFsKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KGtleSk/LnNldFZhbHVlKGN1cnJlbnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleSxcbiAgICAgIHBsYWNlaG9sZGVyOiByYW5nZSA9PT0gJ3N0YXJ0JyA/ICdTZWxlY3QgRGF0YSBTZXQgU3RhcnQnIDogJ1NlbGVjdCBEYXRhIFNldCBFbmQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmFuZ2UgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXRTdGFydCA9IHZhbHVlO1xuICAgICAgICAgIC8vIFBhcmFtZXRlciBvcHRpb25zIGFyZSByZXNvbHZlZCBmcm9tIHNlbGVjdGVkRGF0YVNldDsga2VlcCB0aGlzIGFsaWFzIGluIHN5bmMuXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0RW5kID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIHZhckdyb3VwLmdldChrZXkpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmIChyYW5nZSA9PT0gJ3N0YXJ0JyAmJiB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrKSA9PiB7XG4gICAgICAgICAgaWYgKGsuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfYCkpIHtcbiAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrKSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5kYXRhU2V0UmFuZ2VTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgcGFyYW1ldGVyIGRyb3Bkb3duICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycyAtIHNob3dzIHBhcmFtZXRlcnMgZnJvbSBzZWxlY3RlZCBkYXRhIHNldClcbiAgICovXG4gIGdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKSBhbmQgZGF0YSBzZXRcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGVJZCA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gICAgY29uc3Qgc2VsZWN0ZWREYXRhU2V0ID0gdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0O1xuICAgIFxuICAgIGlmICgoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHx8ICFzZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgcHJvZmlsZSBvciBkYXRhIHNldCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IChzZWxlY3RlZFByb2ZpbGVJZCB8fCBzZWxlY3RlZFByb2ZpbGUpID8gJ1NlbGVjdCBEYXRhIFNldCBmaXJzdCcgOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb2ZpbGUgbmFtZVxuICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gc2VsZWN0ZWRQcm9maWxlSWQgPyBTdHJpbmcoc2VsZWN0ZWRQcm9maWxlSWQpIDogKHNlbGVjdGVkUHJvZmlsZSB8fCAnJyk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHtzZWxlY3RlZERhdGFTZXR9YDtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXQgdXNpbmcgcHJvZmlsZSBJRCBvciBuYW1lXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckRhdGFTZXQocHJvZmlsZUlkZW50aWZpZXIsIHNlbGVjdGVkRGF0YVNldCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBVc2UgcGFyYW0ubmFtZSBhcyBpZCAobWF0LW9wdGlvbiB3aWxsIHVzZSB0aGlzKVxuICAgICAgdmFsdWU6IGBAfCR7cGFyYW0ubmFtZX18YCwgLy8gRm9ybWF0dGVkIHZhbHVlIGZvciBkaXNwbGF5XG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBhbmQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUsIGVuc3VyZSBmb3JtIGNvbnRyb2wgbWF0Y2hlcyB0aGUgb3B0aW9uIGlkIChmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIC8vIENoZWNrIGlmIHZhbHVlIGlzIGFscmVhZHkgZm9ybWF0dGVkIChlLmcuLCBcIkB8ZW1haWx8XCIpXG4gICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGN1cnJlbnRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgID8gY3VycmVudFZhbHVlXG4gICAgICAgIDogKGN1cnJlbnRWYWx1ZSA/IGBAfCR7Y3VycmVudFZhbHVlfXxgIDogJycpO1xuICAgICAgLy8gU2V0IGZvcm0gY29udHJvbCB0byBmb3JtYXR0ZWQgdmFsdWUgKG1hdGNoZXMgb3B0LmlkKSBzbyBzZWxlY3QgZGlzcGxheXMgY29ycmVjdGx5XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgJiYgcGFyYW1ldGVycy5zb21lKHAgPT4gYEB8JHtwLm5hbWV9fGAgPT09IGZvcm1hdHRlZFZhbHVlKSkge1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogZmFsc2UsIC8vIENsaWVudC1zaWRlIHNlYXJjaCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYWxsIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLCAvLyBObyBwYWdpbmF0aW9uIGZvciBwYXJhbWV0ZXJzIHdpdGhpbiBhIGRhdGEgc2V0XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIHJlY2VpdmVkIGlzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgKGUuZy4sIFwiQHxlbWFpbHxcIikgYmVjYXVzZSBtYXQtb3B0aW9uIHVzZXMgb3B0LmlkXG4gICAgICAgIC8vIEV4dHJhY3QgcGFyYW1ldGVyIG5hbWUgZnJvbSBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZTsgLy8gVGhpcyBpcyBhbHJlYWR5IGZvcm1hdHRlZCBhcyBAfHBhcmFtTmFtZXxcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiBmb3JtYXR0ZWRWYWx1ZS5lbmRzV2l0aCgnfCcpXG4gICAgICAgICAgPyBmb3JtYXR0ZWRWYWx1ZS5zbGljZSgyLCAtMSlcbiAgICAgICAgICA6IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHJhdyB2YWx1ZSAoc3RvcmUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBmb3JtYXR0aW5nKVxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHBhcmFtTmFtZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZSAoc3RvcmUgZm9ybWF0dGVkIHZhbHVlIGZvciB0ZW1wbGF0ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0gdXNlIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyR3JvdXAgJiYgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIGZvcm1hdHRlZCB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayBhbmQgZW1pdFxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50ICh0aGlzIGlzIHdoYXQgZ2V0cyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSlcbiAgICAgICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZS5uYW1lLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmlxdWUgZW52aXJvbm1lbnRzIGZyb20gZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKi9cbiAgZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgY29uc3QgZW52TWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZm9yRWFjaChlbnYgPT4ge1xuICAgICAgaWYgKCFlbnZNYXAuaGFzKGVudi5lbnZpcm9ubWVudCkpIHtcbiAgICAgICAgZW52TWFwLnNldChlbnYuZW52aXJvbm1lbnQsIHtcbiAgICAgICAgICBpZDogZW52LmVudmlyb25tZW50LFxuICAgICAgICAgIG5hbWU6IGVudi5lbnZpcm9ubWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbnZNYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXJhbWV0ZXJzIGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoZW52aXJvbm1lbnROYW1lOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50T3B0aW9uc1xuICAgICAgLmZpbHRlcihlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudE5hbWUpXG4gICAgICAubWFwKGVudiA9PiAoe1xuICAgICAgICBpZDogZW52Lm5hbWUsXG4gICAgICAgIG5hbWU6IGVudi5uYW1lXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IGRyb3Bkb3duIChmaXJzdCBkcm9wZG93biAtIHNlbGVjdCBlbnZpcm9ubWVudClcbiAgICovXG4gIGdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X2Vudmlyb25tZW50YDtcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHNcbiAgICBjb25zdCB1bmlxdWVFbnZpcm9ubWVudHMgPSB0aGlzLmdldFVuaXF1ZUVudmlyb25tZW50cygpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSB1bmlxdWVFbnZpcm9ubWVudHMubWFwKGVudiA9PiAoe1xuICAgICAgaWQ6IGVudi5pZCxcbiAgICAgIHZhbHVlOiBlbnYubmFtZSxcbiAgICAgIG5hbWU6IGVudi5uYW1lLFxuICAgICAgbGFiZWw6IGVudi5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVudmlyb25tZW50IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICBjb25zdCBjdXJyZW50RW52ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChjdXJyZW50RW52KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZEVudmlyb25tZW50JywgLy8gVXNlICdzZWxlY3RlZEVudmlyb25tZW50JyBhcyBrZXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0IEVudmlyb25tZW50YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbnZpcm9ubWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRW52aXJvbm1lbnRzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIGVudmlyb25tZW50IG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50ID0gdmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBlbnZpcm9ubWVudCBJRCBmcm9tIGVudmlyb25tZW50T3B0aW9uc1xuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBvcHRpb24gd2l0aCBtYXRjaGluZyBlbnZpcm9ubWVudCBuYW1lIHRvIGdldCB0aGUgSURcbiAgICAgICAgY29uc3QgZW52T3B0aW9uID0gdGhpcy5lbnZpcm9ubWVudE9wdGlvbnMuZmluZChlbnYgPT4gZW52LmVudmlyb25tZW50ID09PSB2YWx1ZSk7XG4gICAgICAgIGlmIChlbnZPcHRpb24pIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IG51bWVyaWMgSUQgZnJvbSBlbnZPcHRpb24uaWQgKGZvcm1hdDogXCJlbnYtNzQtdGVzdFwiIC0+IDc0KVxuICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBlbnZPcHRpb24uaWQubWF0Y2goL2Vudi0oXFxkKyktLyk7XG4gICAgICAgICAgaWYgKGlkTWF0Y2ggJiYgaWRNYXRjaFsxXSkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gcGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBlbnZpcm9ubWVudCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkRW52aXJvbm1lbnQgY29udHJvbFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBmb3IgdGhlIG5ldyBlbnZpcm9ubWVudFxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gdXBkYXRlIFVJXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoRW52aXJvbm1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBkcm9wZG93biAoc2Vjb25kIGRyb3Bkb3duIC0gc2VsZWN0IHBhcmFtZXRlciBmcm9tIGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBzZWxlY3RlZEVudmlyb25tZW50ID0gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudDtcbiAgICBpZiAoIXNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRW52aXJvbm1lbnQgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgcGFyYW1ldGVycyBmb3IgdGhlIHNlbGVjdGVkIGVudmlyb25tZW50XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyc0ZvckVudmlyb25tZW50KHNlbGVjdGVkRW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiAoe1xuICAgICAgaWQ6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIHZhbHVlOiBgKnwke3BhcmFtLm5hbWV9fGAsXG4gICAgICBuYW1lOiBwYXJhbS5uYW1lLFxuICAgICAgbGFiZWw6IHBhcmFtLm5hbWVcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgUGFyYW1ldGVyYCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFdoZW4gcGFyYW1ldGVyIGlzIHNlbGVjdGVkLCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBmb3JtYXQgaXRcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUpXG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnZpcm9ubWVudCBJRCBpcyBhbHJlYWR5IHN0b3JlZCBvbiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWRcbiAgICAgICAgLy8gKGl0IHdhcyBzZXQgd2hlbiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQpXG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheSAtIGtlZXAgcmF3IHZhbHVlIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgLy8gU2V0IHRvIHJhdyB2YWx1ZSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBhbmQgZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAvLyBFbWl0IGZvcm1hdHRlZCB2YWx1ZSBmb3IgcGFyZW50IGNvbXBvbmVudFxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZW52aXJvbm1lbnQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRW52aXJvbm1lbnQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudCBJRCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRFbnZpcm9ubWVudElkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW52aXJvbm1lbnQgSURzIGZvciB2YXJpYWJsZXMgdGhhdCB1c2UgZW52aXJvbm1lbnQgdHlwZVxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIHZhcmlhYmxlIG5hbWUgdG8gZW52aXJvbm1lbnQgSURcbiAgICovXG4gIGdldEVudmlyb25tZW50SWRzRm9yVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IGVudklkcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpIHtcbiAgICAgICAgZW52SWRzLnNldCh2YXJpYWJsZS5uYW1lLCB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlbnZJZHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGxhaW4tdGV4dFxuICAgKi9cbiAgaXNQbGFpblRleHRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncGxhaW4tdGV4dCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcGFyYW1ldGVyXG4gICAqL1xuICBpc1BhcmFtZXRlclR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSB8fCB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGRhdGEgc2V0IGlzIHNlbGVjdGVkIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0luc2lkZUZvckxvb3BTdGVwXG4gICAgICA/ICEhKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldFN0YXJ0IHx8IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldClcbiAgICAgIDogISF2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHNldCAoZnJvbSB0ZXN0IGNhc2UpXG4gICAqIElmIHRydWUsIHByb2ZpbGUgYW5kIGRhdGEgc2V0IGRyb3Bkb3ducyBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIGhhc0RlZmF1bHRUZXN0RGF0YVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0luc2lkZUZvckxvb3BTdGVwKSB7XG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiZcbiAgICAgICAgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiZcbiAgICAgICAgdGhpcy5kZWZhdWx0VGVzdERhdGFFbmRJbmRleCAhPSBudWxsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gISEodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgZW52aXJvbm1lbnRcbiAgICovXG4gIGlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhcmlhYmxlIGlzIGVsZW1lbnQgdHlwZSAoZGF0YUtleSA9PT0gJ2VsZW1lbnQnKVxuICAgKi9cbiAgaXNFbGVtZW50VHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgZm9yIGFuIGVsZW1lbnQgdmFyaWFibGVcbiAgICogUmV0dXJucyB0cnVlIGlmIGVpdGhlciBzZWxlY3RlZFNjcmVlbk5hbWUgb3Igc2NyZWVuTmFtZUlkIGlzIHNldCAoYW5kIG5vdCBcIk5vbmVcIilcbiAgICovXG4gIGhhc1NlbGVjdGVkU2NyZWVuTmFtZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHNjcmVlbk5hbWVJZCBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbnVtYmVyIChub3QgbnVsbC91bmRlZmluZWQpXG4gICAgaWYgKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCAhPSBudWxsICYmIHR5cGVvZiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPT09ICdudW1iZXInICYmICFpc05hTih2YXJpYWJsZS5zY3JlZW5OYW1lSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2s6IGNoZWNrIHNlbGVjdGVkU2NyZWVuTmFtZVxuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3Igc2NyZWVuIG5hbWUgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIGZvciBlbGVtZW50IHZhcmlhYmxlcylcbiAgICovXG4gIGdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEluY2x1ZGUgbG9hZGluZyBzdGF0ZSBpbiBjYWNoZSBrZXkgdG8gaW52YWxpZGF0ZSB3aGVuIGxvYWRpbmcgY29tcGxldGVzXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9zY3JlZW5OYW1lXyR7dGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdTY3JlZW5OYW1lc31gO1xuICAgIGlmICh0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgb3B0aW9uczogaW5jbHVkZSBhIFwiTm9uZVwiIG9wdGlvbiAoZGlzcGxheWVkIGFzIFwiU2VsZWN0XCIpIHBsdXMgc2NyZWVuTmFtZU9wdGlvbnMgZnJvbSBBUElcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ25vbmUnLFxuICAgICAgICB2YWx1ZTogJ1NlbGVjdCcsXG4gICAgICAgIG5hbWU6ICdOb25lJyxcbiAgICAgICAgbGFiZWw6ICdOb25lJ1xuICAgICAgfSxcbiAgICAgIC4uLnRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubWFwKHNjcmVlbk5hbWUgPT4gKHtcbiAgICAgICAgaWQ6IHNjcmVlbk5hbWUuaWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHZhbHVlOiBzY3JlZW5OYW1lLm5hbWUsXG4gICAgICAgIG5hbWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbGFiZWw6IHNjcmVlbk5hbWUubmFtZVxuICAgICAgfSkpXG4gICAgXTtcbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3Igc2NyZWVuIG5hbWUgc2VsZWN0aW9uXG4gICAgLy8gVGhlIGZvcm0gY29udHJvbCB2YWx1ZSBzaG91bGQgbWF0Y2ggdGhlIG9wdGlvbiBpZCAoc3RyaW5nIGZvciBcIm5vbmVcIiwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciBmb3IgcmVhbCBzY3JlZW4gbmFtZXMpXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBzY3JlZW5OYW1lSWQgYXMgc3RyaW5nICh0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0KSwgb3IgJ25vbmUnIGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKGluaXRpYWxWYWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiB2YXJpYWJsZSBoYXMgc2NyZWVuTmFtZUlkIGJ1dCBmb3JtIGNvbnRyb2wgZG9lc24ndCBtYXRjaFxuICAgICAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgLy8gQ29tcGFyZSBhcyBzdHJpbmdzIHRvIGhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoZXhwZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBubyBzY3JlZW5OYW1lSWQsIGVuc3VyZSBmb3JtIGNvbnRyb2wgaXMgJ25vbmUnIChmb3IgXCJOb25lXCIgc2VsZWN0aW9uIGJ5IGRlZmF1bHQpXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSAnbm9uZScgJiYgY3VycmVudFZhbHVlICE9PSBudWxsICYmIGN1cnJlbnRWYWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZFNjcmVlbk5hbWUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZVNjcmVlbk5hbWVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIElmIFwiTm9uZVwiIGlzIHNlbGVjdGVkICh2YWx1ZSBpcyAnbm9uZScgc3RyaW5nIG9yIG51bGwpLCBjbGVhciBzY3JlZW4gbmFtZSBhbmQgZWxlbWVudCBpbmZvXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnbm9uZScgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSAnJztcblxuICAgICAgICAgIC8vIENsZWFyIGVsZW1lbnQgY29uZmlnIGNhY2hlIGZvciB0aGlzIHZhcmlhYmxlXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9scyAtIGNsZWFyIGFsbCBlbGVtZW50LXJlbGF0ZWQgZm9ybSBjb250cm9sc1xuICAgICAgICAgIC8vIFNldCBzZWxlY3RlZFNjcmVlbk5hbWUgdG8gJ25vbmUnIHRvIHNob3cgXCJOb25lXCIgaXMgc2VsZWN0ZWRcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKCdub25lJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBJRCBmb3JtIGNvbnRyb2wgdG8gZW5zdXJlIGVsZW1lbnRJZCBpcyBjbGVhcmVkXG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNYXJrIGZvciBjaGVjayBhbmQgc3RvcCAobm8gZWxlbWVudCBmZXRjaCB3aGVuIE5vbmUpXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIG9wdGlvbiBpZCAoc3RyaW5nIGZvciBcIm5vbmVcIiwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciBmb3IgcmVhbCBzY3JlZW4gbmFtZXMpXG4gICAgICAgIC8vIENvbnZlcnQgdG8gbnVtYmVyIGZvciBzY3JlZW5OYW1lSWQgaWYgaXQncyBhIHZhbGlkIG51bWJlclxuICAgICAgICBjb25zdCBzY3JlZW5OYW1lSWROdW0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnbm9uZScgPyBwYXJzZUludCh2YWx1ZSwgMTApIDogKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IG51bGwpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNjcmVlbk5hbWVJZE51bSAmJiAhaXNOYU4oc2NyZWVuTmFtZUlkTnVtKSkge1xuICAgICAgICAgIC8vIFN0b3JlIHNlbGVjdGVkIHNjcmVlbiBuYW1lIG9uIHRoZSB2YXJpYWJsZSBvYmplY3RcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSBzY3JlZW5OYW1lSWROdW07XG5cbiAgICAgICAgICAvLyBGaW5kIGFuZCBzdG9yZSBzY3JlZW4gbmFtZSBuYW1lIGZyb20gc2NyZWVuTmFtZU9wdGlvbnNcbiAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzY3JlZW5OYW1lSWROdW0pO1xuICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBzY3JlZW5OYW1lT3B0aW9uLm5hbWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBub3QgZm91bmQsIHN0aWxsIHNldCB0aGUgSUQgYnV0IGNsZWFyIHRoZSBuYW1lXG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGVsZW1lbnQgc2VsZWN0aW9uIHdoZW4gc2NyZWVuIG5hbWUgY2hhbmdlc1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgdG8gZm9yY2UgcmVmcmVzaFxuICAgICAgICAgIC8vIENsZWFyIGFsbCBlbGVtZW50IGNvbmZpZ3MgZm9yIHRoaXMgdmFyaWFibGUgc2luY2Ugc2NyZWVuIG5hbWUgY2hhbmdlZFxuICAgICAgICAgIGNvbnN0IGtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9lbGVtZW50YCkpIHtcbiAgICAgICAgICAgICAga2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGhhcyB0aGUgY29ycmVjdCB2YWx1ZSAoYXMgc3RyaW5nIHRvIG1hdGNoIG9wdGlvbiBpZClcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShTdHJpbmcoc2NyZWVuTmFtZUlkTnVtKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAgICAgICB0aGlzLnNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoe1xuICAgICAgICAgICAgc2NyZWVuTmFtZUlkOiB2YXJpYWJsZS5zY3JlZW5OYW1lSWQsXG4gICAgICAgICAgICBzZWFyY2hUZXJtOiAnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEludmFsaWQgdmFsdWUgLSBjbGVhciBldmVyeXRoaW5nXG4gICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgdG8gdXBkYXRlIFVJIGZpcnN0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIC8vIFRoZSBlbGVtZW50IGNvbmZpZyB3aWxsIGJlIHJlY29tcHV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGVsZW1lbnRPcHRpb25zIGlucHV0IGNoYW5nZXNcbiAgICAgICAgLy8gdmlhIG5nT25DaGFuZ2VzLCB3aGljaCB3aWxsIGNsZWFyIHRoZSBjYWNoZSBhbmQgdHJpZ2dlciByZS1jb21wdXRhdGlvblxuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJycpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFNjcmVlbk5hbWUuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBlbGVtZW50IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBmaWx0ZXJlZCBieSBzY3JlZW4gbmFtZSlcbiAgICogT3B0aW1pemVkIHRvIHJldHVybiBpbW1lZGlhdGVseSBmcm9tIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGxzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAqL1xuICBnZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgSURcbiAgICBjb25zdCBzZWxlY3RlZFNjcmVlbk5hbWVJZCA9IHZhcmlhYmxlLnNjcmVlbk5hbWVJZDtcbiAgICAvLyBJbmNsdWRlIGVsZW1lbnRPcHRpb25zIGxlbmd0aCBhbmQgbG9hZGluZyBzdGF0ZSBpbiBjYWNoZSBrZXkgdG8gaW52YWxpZGF0ZSB3aGVuIGVsZW1lbnRzIGNoYW5nZVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudF8ke3NlbGVjdGVkU2NyZWVuTmFtZUlkIHx8ICcnfV8ke3RoaXMuZWxlbWVudE9wdGlvbnMubGVuZ3RofV8ke3RoaXMuaXNMb2FkaW5nRWxlbWVudHN9YDtcbiAgICBcbiAgICAvLyBFYXJseSByZXR1cm4gZnJvbSBjYWNoZSAtIHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHBhdGggYW5kIHNob3VsZCBiZSB2ZXJ5IGZhc3RcbiAgICBpZiAodGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBubyBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCwgcmV0dXJuIGVtcHR5IGNvbmZpZyBhbmQgY2FjaGUgaXRcbiAgICBpZiAoIXNlbGVjdGVkU2NyZWVuTmFtZUlkKSB7XG4gICAgICBjb25zdCBlbXB0eUNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFNjcmVlbiBOYW1lIGZpcnN0JyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW11cbiAgICAgIH07XG4gICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGVtcHR5Q29uZmlnKTtcbiAgICAgIHJldHVybiBlbXB0eUNvbmZpZztcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgZWxlbWVudHMgYXJlIHN0aWxsIGxvYWRpbmcsIHJldHVybiBhIGxvYWRpbmcgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICh0aGlzLmlzTG9hZGluZ0VsZW1lbnRzKSB7XG4gICAgICBjb25zdCBsb2FkaW5nQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdMb2FkaW5nIGVsZW1lbnRzLi4uJyxcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgbG9hZGluZ0NvbmZpZyk7XG4gICAgICByZXR1cm4gbG9hZGluZ0NvbmZpZztcbiAgICB9XG4gICAgXG4gICAgLy8gRmlsdGVyIGVsZW1lbnRzIGJ5IHNlbGVjdGVkIHNjcmVlbiBuYW1lXG4gICAgLy8gQ29tcGFyZSBib3RoIGFzIG51bWJlcnMgdG8gZW5zdXJlIHR5cGUgbWF0Y2hpbmdcbiAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maWx0ZXIoZWwgPT4ge1xuICAgICAgY29uc3QgZWxTY3JlZW5OYW1lSWQgPSBlbC5zY3JlZW5OYW1lSWQ7XG4gICAgICAvLyBIYW5kbGUgYm90aCBudW1iZXIgYW5kIHN0cmluZyBjb21wYXJpc29uc1xuICAgICAgcmV0dXJuIGVsU2NyZWVuTmFtZUlkICE9IG51bGwgJiYgTnVtYmVyKGVsU2NyZWVuTmFtZUlkKSA9PT0gTnVtYmVyKHNlbGVjdGVkU2NyZWVuTmFtZUlkKTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgdG8gU2VsZWN0T3B0aW9uIGZvcm1hdFxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBmaWx0ZXJlZEVsZW1lbnRzLm1hcChlbCA9PiB7XG4gICAgICBjb25zdCBsb2NhdG9yVmFsdWUgPSBlbC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogZWwuaWQsXG4gICAgICAgIGVsZW1lbnRJZDogZWwuaWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHZhbHVlOiBlbC5uYW1lLFxuICAgICAgICBsb2NhdG9yVmFsdWU6IGxvY2F0b3JWYWx1ZSxcbiAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgbGFiZWw6IGVsLm5hbWUsXG4gICAgICAgIHNjcmVlbk5hbWVJZDogZWwuc2NyZWVuTmFtZUlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICBzY3JlZW5OYW1lT2JqOiBlbC5zY3JlZW5OYW1lT2JqLFxuICAgICAgICBvdGhlckxvY2F0b3I6IGVsLm90aGVyTG9jYXRvclxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBlbGVtZW50IElEIHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmICF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBleGlzdGluZyBlbGVtZW50IHZhbHVlLCB0cnkgdG8gZmluZCB0aGUgZWxlbWVudCBhbmQgc2V0IHRoZSBJRFxuICAgICAgbGV0IGluaXRpYWxFbGVtZW50SWQ6IGFueSA9IG51bGw7XG4gICAgICBpZiAodmFyaWFibGUuZWxlbWVudElkKSB7XG4gICAgICAgIGluaXRpYWxFbGVtZW50SWQgPSB2YXJpYWJsZS5lbGVtZW50SWQ7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnZhbHVlKSB7XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGVsZW1lbnQgYnkgbG9jYXRvclZhbHVlIG9yIG5hbWVcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBcbiAgICAgICAgICBlbC5sb2NhdG9yVmFsdWUgPT09IHZhcmlhYmxlLnZhbHVlIHx8IGVsLm5hbWUgPT09IHZhcmlhYmxlLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbEVsZW1lbnRJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnaWQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRWxlbWVudCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRWxlbWVudHMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRWxlbWVudHMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIGVsZW1lbnRPcHRpb25zXG4gICAgICAgIC8vIHZhbHVlIGlzIHRoZSBlbGVtZW50IElEIChzaW5jZSBjb25maWcga2V5IGlzICdpZCcpXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFsdWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU3RvcmUgZWxlbWVudCBkZXRhaWxzIG9uIHRoZSB2YXJpYWJsZVxuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHNlbGVjdGVkRWxlbWVudC5pZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBzZWxlY3RlZEVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZnJvbSB0aGUgc2VsZWN0ZWQgZWxlbWVudFxuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgc2NyZWVuIG5hbWUgZHJvcGRvd24gc2hvd3MgdGhlIGNvcnJlY3Qgc2VsZWN0aW9uXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZU9wdGlvbiA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCk7XG4gICAgICAgICAgICBpZiAoc2NyZWVuTmFtZU9wdGlvbikge1xuICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBzY3JlZW5OYW1lT3B0aW9uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZpbmQgYW5kIHBhdGNoIHRoZSBzZWxlY3RvciB2YXJpYWJsZSB3aXRoIGRhdGFLZXkgJ25vdF9mb3VuZCdcbiAgICAgICAgICBjb25zdCBzZWxlY3RvclZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKFxuICAgICAgICAgICAgdiA9PiB2Lm5hbWUgPT09ICdzZWxlY3RvcicgJiYgdi5kYXRhS2V5ID09PSAnbm90X2ZvdW5kJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGUgJiYgc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBmb3JtIGdyb3VwIGZvciB0aGUgc2VsZWN0b3IgdmFyaWFibGVcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAoc2VsZWN0b3JWYXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RvclZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RvciB2YXJpYWJsZSdzIHZhbHVlIHdpdGggdGhlIGVsZW1lbnQgbG9jYXRvclxuICAgICAgICAgICAgICBzZWxlY3RvclZhcmlhYmxlLnZhbHVlID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFBhdGNoIHRoZSBmb3JtIGNvbnRyb2wgdmFsdWVcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvclZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGVsZW1lbnQgbm90IGZvdW5kLCBqdXN0IHNldCB0aGUgdmFsdWVcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YXJpYWJsZS52YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTZXQgZWxlbWVudCBJRCBmb3JtIGNvbnRyb2wgZm9yIHRoZSBkcm9wZG93biAoa2V5IGlzICdpZCcgaW4gY29uZmlnKVxuICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShzZWxlY3RlZEVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVXBkYXRlIHNjcmVlbiBuYW1lIGZvcm0gY29udHJvbCBpZiBlbGVtZW50IGhhcyBhIHNjcmVlbiBuYW1lXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSBzY3JlZW4gbmFtZSBJRCBhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdFxuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShTdHJpbmcoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiB2YXJpYWJsZS52YWx1ZSB9KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVFbGVtZW50cy5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENhY2hlIHRoZSBjb25maWcgYmVmb3JlIHJldHVybmluZ1xuICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBkYXRhIHR5cGUgaXMgcnVudGltZVxuICAgKi9cbiAgaXNSdW50aW1lVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3J1bnRpbWUnO1xuICB9XG59XG5cbiIsIjxzdHlsZT5cbiAgLmNhcGl0YWxpemUtZmlyc3Q6OmZpcnN0LWxldHRlciB7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgfVxuPC9zdHlsZT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLXgtNiBjcWEtZ2FwLXktNCBjcWEtZmxleC13cmFwIHRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXCIgW25nQ2xhc3NdPVwieydjcWEtZmxleC1jb2wnOiBpc0VkaXRJbkRlcHRofVwiICpuZ0lmPVwiIWNyZWF0ZUVsZW1lbnRWaXNpYmxlXCI+XG4gIFxuICA8IS0tIE1ldGFkYXRhIC0gT25seSBzaG93IGlmIGVsZW1lbnQgaXMgYXZhaWxhYmxlIGluIGZvcm0gLS0+XG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgTWV0YWRhdGFcbiAgICA8L2xhYmVsPlxuICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwibWV0YWRhdGFcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm1ldGFkYXRhQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBEZXNjcmlwdGlvblxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJkZXNjcmlwdGlvblwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cbiAgXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIHRlbXBsYXRlVmFyaWFibGVzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmFyaWFibGVcIj5cbiAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtjaGVja2VkXT1cInZhcmlhYmxlc0Zvcm0uYXQoaSk/LmdldCgndmFsdWUnKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50LmNoZWNrZWQpXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdkcm9wZG93bidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE51bWJlciB2YXJpYWJsZXMgd2l0aCBudW1iZXIgaW5wdXQgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdudW1iZXInICYmIHZhcmlhYmxlLmRhdGFLZXkgIT09ICdlbGVtZW50J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3R5cGVdPVwiJ251bWJlcidcIiBbcGxhY2Vob2xkZXJdPVwiJ051bWJlciBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTm9uLWJvb2xlYW4sIG5vbi1jdXN0b21fY29kZSB2YXJpYWJsZXMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICdjdXN0b21fY29kZScgJiYgdmFyaWFibGUudHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhcmlhYmxlLnR5cGUgIT09ICdkcm9wZG93bicgJiYgISh2YXJpYWJsZS50eXBlID09PSAnbnVtYmVyJyAmJiB2YXJpYWJsZS5kYXRhS2V5ICE9PSAnZWxlbWVudCcpXCI+XG4gICAgICA8IS0tIEVsZW1lbnQgdmFyaWFibGVzIHdpdGggY2FzY2FkaW5nIGRyb3Bkb3ducyAoc2NyZWVuIG5hbWUgKyBlbGVtZW50KSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX0gU2NyZWVuIE5hbWU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlKTsgZWxzZSBlbGVtZW50TWFudWFsSW5wdXRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbGVtZW50TWFudWFsSW5wdXQ+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFt0eXBlXT1cIidudW1iZXInXCIgW3BsYWNlaG9sZGVyXT1cIidOdW1iZXIgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiY3FhLXRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgPCEtLSBPdGhlciBkcm9wZG93biB2YXJpYWJsZXMgKHR5cGUsIHNjcm9sbFRvLCBsYWJlbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkU2hvd0Ryb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSBkZWZhdWx0SW5wdXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXQ+XG4gICAgICAgIDwhLS0gVGVzdC1kYXRhLCBzb3VyY2UtdmFsdWUsIG9yIHRhcmdldC12YWx1ZSB3aXRoIGRhdGEgdHlwZSBkcm9wZG93biAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgcmVndWxhcklucHV0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBUeXBlPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVR5cGVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBOYW1lPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnQgVmFsdWU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BhcmFtZXRlclR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgVGVzdCBEYXRhIFByb2ZpbGU8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlKSAmJiAhaXNJbnNpZGVGb3JMb29wU3RlcFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSkgJiYgaXNJbnNpZGVGb3JMb29wU3RlcFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgRGF0YSBTZXQgU3RhcnQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpLCAnc3RhcnQnKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlKSAmJiBpc0luc2lkZUZvckxvb3BTdGVwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBEYXRhIFNldCBFbmQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFJhbmdlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpLCAnZW5kJylcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzUGxhaW5UZXh0VHlwZSh2YXJpYWJsZSkgfHwgaXNSdW50aW1lVHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX08c3BhbiBjbGFzcz1cImNxYS10ZXh0LXJlZC01MDBcIj4qPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gU2hvdyBjdXN0b20gaW5wdXQgZm9yIHBsYWluLXRleHQgdHlwZSAtLT5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwiZ2V0UmF3VmFsdWUodmFyaWFibGUpXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJJbnB1dD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNyZWF0ZUVsZW1lbnRWaXNpYmxlXCI+XG4gIDxjcWEtZWxlbWVudC1mb3JtXG4gICAgW2lzQ3JlYXRlTW9kZV09XCJ0cnVlXCJcbiAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICBbaXNMb2FkaW5nU2NyZWVuTmFtZXNdPVwiaXNMb2FkaW5nU2NyZWVuTmFtZXNcIlxuICAgIFtpc0VkaXRJbkRlcHRoQXZhaWxhYmxlXT1cImZhbHNlXCJcbiAgICAoY3JlYXRlRWxlbWVudCk9XCJvbkNyZWF0ZUVsZW1lbnQoJGV2ZW50KVwiXG4gICAgKGNhbmNlbCk9XCJvbkNhbmNlbEVsZW1lbnRGb3JtKClcIlxuICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiPlxuICA8L2NxYS1lbGVtZW50LWZvcm0+XG48L2Rpdj4iXX0=
|