@cqa-lib/cqa-ui 1.1.486 → 1.1.488
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/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +1 -1
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +307 -0
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +7 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +6 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +54 -6
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +45 -13
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +8 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +28 -5
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +8 -3
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +11 -3
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +490 -54
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +465 -30
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/mixed-variable-input/mixed-variable-input.component.d.ts +41 -0
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +3 -1
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +2 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +8 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +3 -1
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +3 -1
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +9 -1
- package/lib/test-case-details/step-group/step-group.component.d.ts +3 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +5 -1
- package/lib/ui-kit.module.d.ts +96 -95
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -62,6 +62,7 @@ export class StepBuilderLoopComponent {
|
|
|
62
62
|
this.hasMoreEnvironments = false;
|
|
63
63
|
this.isLoadingEnvironments = false;
|
|
64
64
|
this.isInsideForLoopStep = false;
|
|
65
|
+
this.hasTestDataProfile = false;
|
|
65
66
|
/** When true, header and button show edit/update wording (same as action step builder in debug). */
|
|
66
67
|
this.isDebug = false;
|
|
67
68
|
this.loadMoreElements = new EventEmitter();
|
|
@@ -171,6 +172,9 @@ export class StepBuilderLoopComponent {
|
|
|
171
172
|
this.patchFormFromTestStep();
|
|
172
173
|
setTimeout(() => this.patchFormFromTestStep(), 0);
|
|
173
174
|
}
|
|
175
|
+
else {
|
|
176
|
+
this.applyDefaultDataProfile();
|
|
177
|
+
}
|
|
174
178
|
}
|
|
175
179
|
ngOnChanges(changes) {
|
|
176
180
|
if (changes['selectOptions']) {
|
|
@@ -184,6 +188,12 @@ export class StepBuilderLoopComponent {
|
|
|
184
188
|
if (currentProfileId) {
|
|
185
189
|
this.onDataProfileChange(currentProfileId);
|
|
186
190
|
}
|
|
191
|
+
if (!this.isEditMode) {
|
|
192
|
+
this.applyDefaultDataProfile();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if ((changes['defaultTestDataProfileId'] || changes['isInsideForLoopStep']) && !this.isEditMode) {
|
|
196
|
+
this.applyDefaultDataProfile();
|
|
187
197
|
}
|
|
188
198
|
if (changes['hasMoreDataProfiles'] || changes['isLoadingDataProfiles']) {
|
|
189
199
|
this.updateDataProfileConfig();
|
|
@@ -353,6 +363,41 @@ export class StepBuilderLoopComponent {
|
|
|
353
363
|
label: option.name
|
|
354
364
|
}));
|
|
355
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* When a default test data profile is provided (e.g., testCase.testDataId) and the user is
|
|
368
|
+
* creating a FOR loop at the root level, auto-select it and disable the dropdown.
|
|
369
|
+
*/
|
|
370
|
+
applyDefaultDataProfile() {
|
|
371
|
+
if (this.isEditMode)
|
|
372
|
+
return;
|
|
373
|
+
// Only auto-select + disable when the new FOR loop is NOT nested inside another FOR loop.
|
|
374
|
+
// When nested, the user should be free to pick a different data profile.
|
|
375
|
+
if (this.isInsideForLoopStep) {
|
|
376
|
+
this.setDataProfileDisabled(false);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
if (this.defaultTestDataProfileId == null) {
|
|
380
|
+
this.setDataProfileDisabled(false);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const profileExists = this.dataProfileOptions.some(p => String(p.id) === String(this.defaultTestDataProfileId));
|
|
384
|
+
if (!profileExists)
|
|
385
|
+
return;
|
|
386
|
+
const control = this.loopForm.get('dataProfile');
|
|
387
|
+
const currentValue = control?.value;
|
|
388
|
+
if (String(currentValue ?? '') !== String(this.defaultTestDataProfileId)) {
|
|
389
|
+
control?.setValue(this.defaultTestDataProfileId, { emitEvent: false });
|
|
390
|
+
this.onDataProfileChange(this.defaultTestDataProfileId);
|
|
391
|
+
}
|
|
392
|
+
this.setDataProfileDisabled(true);
|
|
393
|
+
}
|
|
394
|
+
setDataProfileDisabled(disabled) {
|
|
395
|
+
if (!this.dataProfileConfig || this.dataProfileConfig.disabled === disabled)
|
|
396
|
+
return;
|
|
397
|
+
// Only toggle the config-level disabled flag; keep the FormControl enabled so
|
|
398
|
+
// its value is included in form.value when the step is created.
|
|
399
|
+
this.dataProfileConfig = { ...this.dataProfileConfig, disabled };
|
|
400
|
+
}
|
|
356
401
|
/**
|
|
357
402
|
* Handle data profile selection and update loop start/end options
|
|
358
403
|
*/
|
|
@@ -526,8 +571,9 @@ export class StepBuilderLoopComponent {
|
|
|
526
571
|
return !!this.selectedWhileTemplate;
|
|
527
572
|
}
|
|
528
573
|
else {
|
|
529
|
-
// For 'for' loop type
|
|
530
|
-
|
|
574
|
+
// For 'for' loop type — use getRawValue so disabled controls (e.g., auto-selected
|
|
575
|
+
// default data profile) are still included.
|
|
576
|
+
const formValue = this.loopForm.getRawValue();
|
|
531
577
|
const selectOption = formValue.selectOption;
|
|
532
578
|
if (!selectOption) {
|
|
533
579
|
return false;
|
|
@@ -562,7 +608,7 @@ export class StepBuilderLoopComponent {
|
|
|
562
608
|
}
|
|
563
609
|
}
|
|
564
610
|
});
|
|
565
|
-
const formValue = this.loopForm.
|
|
611
|
+
const formValue = this.loopForm.getRawValue();
|
|
566
612
|
if (this.selectedLoopType === 'while') {
|
|
567
613
|
if (!this.selectedWhileTemplate) {
|
|
568
614
|
return;
|
|
@@ -649,10 +695,10 @@ export class StepBuilderLoopComponent {
|
|
|
649
695
|
}
|
|
650
696
|
}
|
|
651
697
|
StepBuilderLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
652
|
-
StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", isCreatingStep: "isCreatingStep", setWhileTemplateVariables: "setWhileTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", isDebug: "isDebug", testStep: "testStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", cancelElementForm: "cancelElementForm", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "changeTemplateSignal", "cancelChangeTemplateSignal", "templates", "initialTemplate", "initialDescription", "initialMetadata", "isDebug", "editMode", "searchPlaceholder", "setTemplateVariables", "setAdvancedSettingsVariables", "computeHtmlGrammarFn", "preventSelectTemplate", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "isCreatingStep", "elementScreenPrefill"], outputs: ["templateChanged", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "createStep", "cancelled", "redirectToParameter", "redirectToEnvironment"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
698
|
+
StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", isCreatingStep: "isCreatingStep", setWhileTemplateVariables: "setWhileTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", defaultTestDataEndIndex: "defaultTestDataEndIndex", isInsideForLoopStep: "isInsideForLoopStep", hasTestDataProfile: "hasTestDataProfile", isDebug: "isDebug", testStep: "testStep" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", cancelElementForm: "cancelElementForm", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"dataProfileConfig?.disabled && loopForm.get('selectOption')?.value === 'dataProfile'\"\n class=\"cqa-text-[12px] cqa-text-red-500 cqa-mb-2\">\n Data Profile is disabled because it is set at the test case level configuration.\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "changeTemplateSignal", "cancelChangeTemplateSignal", "templates", "initialTemplate", "initialDescription", "initialMetadata", "isDebug", "editMode", "searchPlaceholder", "setTemplateVariables", "setAdvancedSettingsVariables", "computeHtmlGrammarFn", "preventSelectTemplate", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "defaultTestDataEndIndex", "isInsideForLoopStep", "hasTestDataProfile", "isCreatingStep", "elementScreenPrefill"], outputs: ["templateChanged", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "createStep", "cancelled", "redirectToParameter", "redirectToEnvironment"] }, { type: i8.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
653
699
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, decorators: [{
|
|
654
700
|
type: Component,
|
|
655
|
-
args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
701
|
+
args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2 for-loop-builder\">\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-4\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit loop step' : 'Create Loop Test Step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && !whileIsChangingTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onWhileChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && selectedLoopType === 'while' && whileIsChangingTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onWhileCancelChangeTemplate()\">\n </cqa-button>\n </div>\n\n <!-- Loop Type Selection: in edit mode show only the current type (For or While); in create mode show both -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div *ngIf=\"isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-px-3 cqa-text-[#111827]\">{{ selectedLoopType === 'while' ? 'While' : 'For' }}</span>\n </div>\n <div *ngIf=\"!isEditMode\" class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"dataProfileConfig?.disabled && loopForm.get('selectOption')?.value === 'dataProfile'\"\n class=\"cqa-text-[12px] cqa-text-red-500 cqa-mb-2\">\n Data Profile is disabled because it is set at the test case level configuration.\n </div>\n\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action\n [showHeader]=\"false\"\n [computeHtmlGrammarFn]=\"computeHtmlGrammarFn\"\n [changeTemplateSignal]=\"whileChangeTemplateSignal\"\n [cancelChangeTemplateSignal]=\"whileCancelChangeTemplateSignal\"\n [templates]=\"whileTemplates\"\n [setTemplateVariables]=\"setWhileTemplateVariables\"\n [setAdvancedSettingsVariables]=\"setAdvancedSettingsVariables\"\n [editMode]=\"isEditMode\"\n [isDebug]=\"isDebug\"\n [initialTemplate]=\"selectedWhileTemplate\"\n [initialDescription]=\"selectedWhileDescription\"\n [initialMetadata]=\"selectedWhileMetadata\"\n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [defaultTestDataEndIndex]=\"defaultTestDataEndIndex\"\n [isInsideForLoopStep]=\"isInsideForLoopStep\"\n [hasTestDataProfile]=\"hasTestDataProfile\"\n (templateChanged)=\"selectWhileTemplate($event)\"\n (cancelled)=\"onCancel()\"\n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (redirectToParameter)=\"redirectToParameter.emit()\"\n (redirectToEnvironment)=\"redirectToEnvironment.emit()\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons: Apply only when isDebug + existing step (isEditMode), else Create Step -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\"\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n [text]=\"isEditMode ? 'Update Step' : 'Create Step'\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge label=\"Creating\u2026\" icon=\"autorenew\" [isLoading]=\"true\" [fullWidth]=\"true\" [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\" size=\"medium\"></cqa-badge>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
656
702
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { loopType: [{
|
|
657
703
|
type: Input
|
|
658
704
|
}], selectOptions: [{
|
|
@@ -719,6 +765,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
719
765
|
type: Input
|
|
720
766
|
}], isInsideForLoopStep: [{
|
|
721
767
|
type: Input
|
|
768
|
+
}], hasTestDataProfile: [{
|
|
769
|
+
type: Input
|
|
722
770
|
}], isDebug: [{
|
|
723
771
|
type: Input
|
|
724
772
|
}], testStep: [{
|
|
@@ -752,4 +800,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
752
800
|
}], redirectToEnvironment: [{
|
|
753
801
|
type: Output
|
|
754
802
|
}] } });
|
|
755
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBZ0RoRixNQUFNLE9BQU8sd0JBQXdCO0lBc0luQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQXJJbkMsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrR0FBa0c7UUFDekYsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDekMsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUs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QjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgYSBzaGFyZWQgaW50ZXJmYWNlIG9yIGltcG9ydCBmcm9tIGEgc2hhcmVkIHBhY2thZ2VcbmludGVyZmFjZSBFbGVtZW50IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9jYXRvclZhbHVlPzogc3RyaW5nO1xuICBvdGhlckxvY2F0b3I/OiBzdHJpbmdbXTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBMb29wVHlwZSA9ICdmb3InIHwgJ3doaWxlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGRhdGEgcHJvZmlsZSBvcHRpb25cbiAqIEJhc2VkIG9uIFRlc3REYXRhIG1vZGVsIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQcm9maWxlT3B0aW9uIHtcbiAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogQXJyYXkgb2YgZGF0YSBzZXRzIC0gbGVuZ3RoIGRldGVybWluZXMgYXZhaWxhYmxlIGxvb3AgaW5kaWNlcyAqL1xuICBkYXRhPzogYW55W107XG4gIC8qKiBPcHRpb25hbDogZGlyZWN0IGRhdGEgbGVuZ3RoIGlmIGRhdGEgYXJyYXkgaXMgbm90IHByb3ZpZGVkICovXG4gIGRhdGFMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9vcEZvcm1EYXRhIHtcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGU7XG4gIGxvb3BUeXBlOiBMb29wVHlwZTtcbiAgc2VsZWN0T3B0aW9uPzogc3RyaW5nO1xuICBkYXRhUHJvZmlsZT86IHN0cmluZyB8IG51bWJlcjtcbiAgbG9vcFN0YXJ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICBsb29wRW5kPzogbnVtYmVyIHwgc3RyaW5nO1xuICBydW5UaW1lPzogc3RyaW5nO1xuICB3aGlsZVRlbXBsYXRlPzogYW55O1xuICBldmVudD86IGFueTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcz86IGFueVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1idWlsZGVyLWxvb3AnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJMb29wQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGxvb3AgdHlwZSAqL1xuICBASW5wdXQoKSBsb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHNlbGVjdCBvcHRpb24gZHJvcGRvd24gKi9cbiAgQElucHV0KCkgc2VsZWN0T3B0aW9uczogYW55W10gPSBbXG4gICAge3ZhbHVlOiAnZGF0YVByb2ZpbGUnLCBsYWJlbDogJ0RhdGEgUHJvZmlsZSd9LFxuICAgIHt2YWx1ZTogJ3J1blRpbWUnLCBsYWJlbDogJ1J1biBUaW1lJ31cbiAgXTtcblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcblxuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGNyZWF0aW5nIHRoZSBzdGVwIChBUEkgaW4gcHJvZ3Jlc3MpOyBzaG93IGxvYWRlciBvbiBDcmVhdGUgU3RlcCBidXR0b24gKi9cbiAgQElucHV0KCkgaXNDcmVhdGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSwgdGVzdFN0ZXA/OiBhbnkpID0+IGFueVtdID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIC8qKiBDZW50cmFsaXNlZCBIVE1MIGdyYW1tYXIgY29tcHV0YXRpb24gZnVuY3Rpb24uIFBhc3MgU3RlcEJ1aWxkZXJTZXJ2aWNlLmNvbXB1dGVIdG1sR3JhbW1hciBmcm9tIHRoZSBob3N0IGFwcC4gKi9cbiAgQElucHV0KCkgY29tcHV0ZUh0bWxHcmFtbWFyRm4/OiAodGVtcGxhdGU6IGFueSwgdmFyaWFibGVzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBFbWl0IHdoZW4gc3RlcCBpcyBjcmVhdGVkICovXG4gIEBPdXRwdXQoKSBjcmVhdGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxMb29wRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdCB3aGVuIGxvb3AgdHlwZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBsb29wVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFR5cGU+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSB3aGlsZVRlbXBsYXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgd2hpbGVTZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBXaGlsZSc7XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBcbiAgLy8gRWxlbWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIFNjcmVlbiBuYW1lIGZldGNoaW5nIHByb3BlcnRpZXNcbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IHsgaWQ/OiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBQYXJhbWV0ZXIgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBEZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIHByb3BlcnRpZXNcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFFbmRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNJbnNpZGVGb3JMb29wU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBhbmQgYnV0dG9uIHNob3cgZWRpdC91cGRhdGUgd29yZGluZyAoc2FtZSBhcyBhY3Rpb24gc3RlcCBidWlsZGVyIGluIGRlYnVnKS4gKi9cbiAgQElucHV0KCkgaXNEZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRXhpc3Rpbmcgc3RlcCB3aGVuIGVkaXRpbmc7IHVzZWQgd2l0aCBpc0RlYnVnIHRvIGRldGVybWluZSBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIHRlc3RTdGVwPzogYW55O1xuXG4gIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXNEZWJ1ZyAmJiAhISh0aGlzLnRlc3RTdGVwPy5pZCA/PyB0aGlzLnRlc3RTdGVwPy5zdGVwX2lkKTtcbiAgfVxuICBcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hTY3JlZW5OYW1lID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRWxlbWVudEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb1BhcmFtZXRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9FbnZpcm9ubWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHNlbGVjdGVkV2hpbGVUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRXaGlsZU1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRMb29wVHlwZTogTG9vcFR5cGUgPSAnZm9yJztcbiAgd2hpbGVDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgd2hpbGVJc0NoYW5naW5nVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvbldoaWxlQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IHRydWU7XG4gICAgdGhpcy53aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsKys7XG4gIH1cblxuICBvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMud2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbCsrO1xuICB9XG4gIFxuICAvLyBTaW5nbGUgRm9ybUdyb3VwIGNvbnRhaW5pbmcgYWxsIGZvdXIgZmllbGRzXG4gIGxvb3BGb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gQWR2YW5jZWQgc2V0dGluZ3Mgc3RhdGUgKHNhbWUgcGF0dGVybiBhcyBhY3Rpb24gc3RlcCBidWlsZGVyKVxuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG5cbiAgLy8gQ29uZmlncyBmb3IgZHluYW1pYy1zZWxlY3QgY29tcG9uZW50c1xuICBzZWxlY3RPcHRpb25Db25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZGF0YVByb2ZpbGVDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcFN0YXJ0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BFbmRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBtYW5hZ2luZyBsb29wIGluZGljZXNcbiAgcHJpdmF0ZSBzZWxlY3RlZERhdGFQcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0QXJyYXk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZW5kQXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICAvLyBJbml0aWFsaXplIHNpbmdsZSBGb3JtR3JvdXAgd2l0aCBhbGwgZmllbGRzXG4gICAgdGhpcy5sb29wRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBkYXRhUHJvZmlsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgbG9vcFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wRW5kOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBydW5UaW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbClcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgdmFyaWFibGVzIGZvcm1cbiAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWdzXG4gICAgdGhpcy5zZWxlY3RPcHRpb25Db25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RPcHRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdzZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICdkYXRhUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuc2VsZWN0T3B0aW9uc1xuICAgIH07XG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnZGF0YSBwcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BTdGFydCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3Agc3RhcnQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BFbmQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIGVuZCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTsgIFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzIChzYW1lIHR5cGUgYXMgb3RoZXIgc3RlcHMpXG4gICAgdGhpcy5pbml0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcygpO1xuXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdE9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25maWdzKCk7XG4gICAgICAvLyBJZiBhIGRhdGEgcHJvZmlsZSBpcyBhbHJlYWR5IHNlbGVjdGVkIGluIHRoZSBmb3JtLCB1cGRhdGUgbG9vcCBpbmRpY2VzIChkbyBub3QgcmUtcGF0Y2ggZnJvbSB0ZXN0U3RlcCBoZXJlLFxuICAgICAgLy8gYXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgdXNlcidzIGluLXByb2dyZXNzIGNoYW5nZSBmcm9tIFJ1biBUaW1lIHRvIERhdGEgUHJvZmlsZSB3aGVuIHRoZSBkcm9wZG93biBvcGVucylcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlSWQgPSB0aGlzLmxvb3BGb3JtLmdldCgnZGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBpZiAoY3VycmVudFByb2ZpbGVJZCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UoY3VycmVudFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2xvb3BUeXBlJ10pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZXN0U3RlcCddIHx8IGNoYW5nZXNbJ2lzRGVidWcnXSkge1xuICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwKSB7XG4gICAgICAgIHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd3aGlsZVRlbXBsYXRlcyddICYmIHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLnRlc3RTdGVwICYmICF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTtcbiAgICB9XG4gICAgLy8gTm90ZTogbG9vcFN0YXJ0T3B0aW9ucyBhbmQgbG9vcEVuZE9wdGlvbnMgYXJlIG5vdyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gc28gdGhleSBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQgZnJvbSBpbnB1dHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGxvb3Agc3RlcCB2YWx1ZXMgZnJvbSBzdGVwIChzYW1lIGZhbGxiYWNrcyBhcyB0ZXN0LWNhc2UtZGV0YWlsczogZGF0YU1hcEpzb24sIGRhdGFNYXBCZWFuLmZvcl9sb29wKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwOiBhbnksIGtleTogJ2Zvckxvb3BUZXN0RGF0YUlkJyB8ICdmb3JMb29wU3RhcnRJbmRleCcgfCAnZm9yTG9vcEVuZEluZGV4Jyk6IGFueSB7XG4gICAgY29uc3QgZGF0YU1hcCA9IHN0ZXA/LmRhdGFNYXBKc29uID8/IHN0ZXA/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcDtcbiAgICBjb25zdCBtYXBLZXkgPSBrZXkgPT09ICdmb3JMb29wVGVzdERhdGFJZCcgPyAndGVzdERhdGFJZCcgOiBrZXkgPT09ICdmb3JMb29wU3RhcnRJbmRleCcgPyAnc3RhcnRJbmRleCcgOiAnZW5kSW5kZXgnO1xuICAgIHJldHVybiBzdGVwPy5ba2V5XSA/PyBzdGVwPy5kYXRhTWFwSnNvbj8uW2tleV0gPz8gZGF0YU1hcD8uW21hcEtleV0gPz8gZGF0YU1hcD8uW2tleV07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWZpbGwgdGhlIGZvcm0gZnJvbSBhbiBleGlzdGluZyBzdGVwIChlZGl0IG1vZGUpLiBEZWJ1ZyBvbmx5IOKAlCBvbmx5IHJ1bnMgd2hlbiBpc0RlYnVnIGlzIHRydWUuXG4gICAqIFVzZXMgc2FtZSBmYWxsYmFja3MgYXMgdGVzdC1jYXNlLWRldGFpbHMgKGRhdGFNYXBKc29uLCBkYXRhTWFwQmVhbi5mb3JfbG9vcCkgYW5kIGV4cGxpY2l0bHlcbiAgICogc2V0VmFsdWUgb24gY29udHJvbHMgc28gZHJvcGRvd25zIGJpbmQgKHBhdGNoVmFsdWUgY2FuIGJlIGlnbm9yZWQgYnkgZHluYW1pYy1zZWxlY3QgaW4gc29tZSB0aW1pbmcgY2FzZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaEZvcm1Gcm9tVGVzdFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRGVidWcgfHwgIXRoaXMudGVzdFN0ZXApIHJldHVybjtcbiAgICBjb25zdCBzdGVwID0gdGhpcy50ZXN0U3RlcCBhcyBhbnk7XG4gICAgY29uc3QgaXNXaGlsZSA9IHN0ZXAudGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgc3RlcC50eXBlID09PSAnV0hJTEVfTE9PUCc7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gaXNXaGlsZSA/ICd3aGlsZScgOiAnZm9yJztcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICBjb25zdCBpc1J1blRpbWUgPSAhIXN0ZXAuaXNSdW5UaW1lO1xuICAgICAgY29uc3Qgc2VsZWN0T3B0aW9uID0gaXNSdW5UaW1lID8gJ3J1blRpbWUnIDogJ2RhdGFQcm9maWxlJztcbiAgICAgIGNvbnN0IHByb2ZpbGVJZCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wVGVzdERhdGFJZCcpID8/IG51bGwpO1xuICAgICAgY29uc3Qgc3RhcnRWYWwgPSBpc1J1blRpbWUgPyBudWxsIDogKHRoaXMuZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwLCAnZm9yTG9vcFN0YXJ0SW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IGVuZFZhbCA9IGlzUnVuVGltZSA/IG51bGwgOiAodGhpcy5nZXRMb29wU3RlcFZhbHVlKHN0ZXAsICdmb3JMb29wRW5kSW5kZXgnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IHJ1blRpbWVWYWwgPSBpc1J1blRpbWUgPyAoc3RlcC50ZXN0RGF0YVZhbCA/PyBzdGVwLnRlc3REYXRhID8/ICcnKSA6IG51bGw7XG5cbiAgICAgIHRoaXMubG9vcEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHNlbGVjdE9wdGlvbixcbiAgICAgICAgZGF0YVByb2ZpbGU6IHByb2ZpbGVJZCxcbiAgICAgICAgbG9vcFN0YXJ0OiBzdGFydFZhbCxcbiAgICAgICAgbG9vcEVuZDogZW5kVmFsLFxuICAgICAgICBydW5UaW1lOiBydW5UaW1lVmFsXG4gICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGlmICghaXNSdW5UaW1lICYmIHByb2ZpbGVJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0VmFsID8/IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZFZhbCA/PyB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5wYXRjaFZhbHVlKHsgbG9vcFN0YXJ0OiBzdGFydCwgbG9vcEVuZDogZW5kIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy5zZXRWYWx1ZShzZWxlY3RPcHRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChwcm9maWxlSWQgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2RhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwpIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUoc3RhcnRWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBpZiAocnVuVGltZVZhbCAhPSBudWxsICYmIHJ1blRpbWVWYWwgIT09ICcnKSB0aGlzLmxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZShydW5UaW1lVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIC8vIFByZS1maWxsIHRoZSB3aGlsZSBjb25kaXRpb24gdGVtcGxhdGUgZnJvbSB0aGUgY29uZGl0aW9uIGNoaWxkXG4gICAgICBjb25zdCBjb25kQ2hpbGQgPSBzdGVwLmNoaWxkcmVuPy5maW5kKChjOiBhbnkpID0+IGMuY29uZGl0aW9uVHlwZSA9PT0gJ0xPT1BfV0hJTEUnKTtcbiAgICAgIGlmIChjb25kQ2hpbGQpIHtcbiAgICAgICAgaWYgKGNvbmRDaGlsZC50ZW1wbGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gY29uZENoaWxkLnRlbXBsYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmRDaGlsZC5uYXR1cmFsVGV4dEFjdGlvbklkICYmIHRoaXMud2hpbGVUZW1wbGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IG5sSWQgPSBOdW1iZXIoY29uZENoaWxkLm5hdHVyYWxUZXh0QWN0aW9uSWQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSB0aGlzLndoaWxlVGVtcGxhdGVzLmZpbmQoKHQ6IGFueSkgPT4gTnVtYmVyKHQuaWQpID09PSBubElkKTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkgdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgPSBtYXRjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kQ2hpbGQuZGVzY3JpcHRpb24pIHRoaXMuc2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uID0gY29uZENoaWxkLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoY29uZENoaWxkLm1ldGFkYXRhKSB0aGlzLnNlbGVjdGVkV2hpbGVNZXRhZGF0YSA9IGNvbmRDaGlsZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRTa2lwID0gISEoc3RlcC5zaG91bGRTa2lwID8/IHN0ZXAuZXZlbnQ/LnNob3VsZFNraXApO1xuICAgIGNvbnN0IHNraXBWYXIgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gJ3Nob3VsZFNraXAnKTtcbiAgICBpZiAoc2tpcFZhcikge1xuICAgICAgc2tpcFZhci52YWx1ZSA9IHNob3VsZFNraXA7XG4gICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIGZvciBsb29wIHN0ZXBzLlxuICAgKiBGb3IgbG9vcHMsIHdlIGN1cnJlbnRseSBzdXBwb3J0IHRoZSBzYW1lIGdlbmVyaWMgYWR2YW5jZWQgZmxhZzogc2hvdWxkU2tpcC5cbiAgICovXG4gIHByaXZhdGUgaW5pdEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnc2hvdWxkU2tpcCcsXG4gICAgICAgIGxhYmVsOiAnU2tpcCB0aGlzIHN0ZXAgZHVyaW5nIGV4ZWN1dGlvbi4nLFxuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgICAgfVxuICAgIF07XG5cbiAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgcmVhY3RpdmUgZm9ybSBmb3IgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzIChtaXJyb3JzIGFjdGlvbiBzdGVwIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoXG4gICAgICAgICAgdmFsdWVBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHZhbHVlQXJyYXkubWFwKChpdGVtOiBzdHJpbmcpID0+IHRoaXMuZmIuY29udHJvbChpdGVtKSlcbiAgICAgICAgICAgIDogW3RoaXMuZmIuY29udHJvbCgnJyldXG4gICAgICAgICk7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZvcm1BcnJheTtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWdzKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgRGF0YVByb2ZpbGVPcHRpb25bXSB0byBTZWxlY3RPcHRpb25bXVxuICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmRhdGFQcm9maWxlQ29uZmlnLFxuICAgICAgb3B0aW9uczogdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyBMb29wIHN0YXJ0IGFuZCBlbmQgb3B0aW9ucyBhcmUgdXBkYXRlZCB3aGVuIGRhdGEgcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSBsb29wIHN0YXJ0L2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKHByb2ZpbGUgPT4gXG4gICAgICBwcm9maWxlLmlkID09PSBwcm9maWxlSWQgfHwgU3RyaW5nKHByb2ZpbGUuaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUoc2VsZWN0ZWRQcm9maWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBsb29wIGluZGljZXMgYmFzZWQgb24gc2VsZWN0ZWQgZGF0YSBwcm9maWxlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BJbmRpY2VzRnJvbVByb2ZpbGUocHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgZGF0YSBsZW5ndGggZnJvbSBkYXRhIGFycmF5IG9yIHVzZSBwcm92aWRlZCBkYXRhTGVuZ3RoXG4gICAgbGV0IGRhdGFTZXRMZW5ndGggPSAxO1xuICAgIGlmIChwcm9maWxlLmRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHByb2ZpbGUuZGF0YUxlbmd0aCAmJiBwcm9maWxlLmRhdGFMZW5ndGggPiAwKSB7XG4gICAgICBkYXRhU2V0TGVuZ3RoID0gcHJvZmlsZS5kYXRhTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdGFydCBhcnJheSBmcm9tIDEgdG8gZGF0YVNldExlbmd0aFxuICAgIHRoaXMuc3RhcnRBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGRhdGFTZXRMZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICAvLyBJbml0aWFsaXplIGVuZCBhcnJheSBzYW1lIGFzIHN0YXJ0IGFycmF5XG4gICAgLy8gRW5kIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHN0YXJ0IGluZGV4IGlzIHNlbGVjdGVkXG4gICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGZvcm0gaXMgZW1wdHlcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRTdGFydCAmJiB0aGlzLnN0YXJ0QXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy5zZXRWYWx1ZSh0aGlzLnN0YXJ0QXJyYXlbMF0pO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRFbmQgJiYgdGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb29wIHN0YXJ0IGNoYW5nZSBhbmQgdXBkYXRlIGVuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uTG9vcFN0YXJ0Q2hhbmdlKHN0YXJ0SW5kZXg6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlIHx8ICFzdGFydEluZGV4KSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHR5cGVvZiBzdGFydEluZGV4ID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHN0YXJ0SW5kZXgpIDogc3RhcnRJbmRleDtcbiAgICBcbiAgICBpZiAoaXNOYU4oc3RhcnRJZHgpIHx8IHN0YXJ0SWR4IDwgMSkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmQgYXJyYXkgc2hvdWxkIGJlIGZyb20gc3RhcnRJbmRleCB0byBlbmQgb2YgZGF0YVxuICAgICAgLy8gQmFzZWQgb24gcmVmZXJlbmNlOiBlbmRBcnJheSA9IHN0YXJ0QXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXggLSAxLCBzdGFydEFycmF5Lmxlbmd0aClcbiAgICAgIGNvbnN0IHN0YXJ0QXJyYXlDb3B5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgICB0aGlzLmVuZEFycmF5ID0gc3RhcnRBcnJheUNvcHkuc2xpY2Uoc3RhcnRJZHggLSAxKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLXVwZGF0ZSBlbmQgaW5kZXggaWYgY3VycmVudCBlbmQgaXMgaW52YWxpZFxuICAgIGNvbnN0IGN1cnJlbnRFbmQgPSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy52YWx1ZTtcbiAgICBjb25zdCBlbmRJZHggPSB0eXBlb2YgY3VycmVudEVuZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjdXJyZW50RW5kKSA6IGN1cnJlbnRFbmQ7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50RW5kIHx8IGlzTmFOKGVuZElkeCkgfHwgZW5kSWR4IDwgc3RhcnRJZHgpIHtcbiAgICAgIGlmICh0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gTWF0Y2hlcyBsb29wLXN0ZXAgZWRpdCBtb2RlIGJlaGF2aW9yLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZTtcbiAgICBpZiAoIXByb2ZpbGU/LmRhdGEgfHwgIUFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWR4ID0gb25lQmFzZWRJbmRleCAtIDE7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHByb2ZpbGUuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHByb2ZpbGUuZGF0YVtpZHhdO1xuICAgIHJldHVybiByb3cgJiYgKHJvdy5uYW1lICE9IG51bGwgPyBTdHJpbmcocm93Lm5hbWUpIDogbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgbGFiZWwgZm9yIGEgbG9vcCBpbmRleCBvcHRpb246IFwic2V0TmFtZSAobilcIiB3aGVuIHJvdyBoYXMgbmFtZSwgZWxzZSBcIlN0ZXAgKG4pXCIuXG4gICAqIE1hdGNoZXMgbG9vcC1zdGVwIGVkaXQgbW9kZSBkcm9wZG93biBkaXNwbGF5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wSW5kZXhPcHRpb25MYWJlbChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgcm93TmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGlkeCk7XG4gICAgcmV0dXJuIHJvd05hbWUgPyBgJHtyb3dOYW1lfSAoJHtpZHh9KWAgOiBgU3RlcCAoJHtpZHh9KWA7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGxvb3Agc3RhcnQgYW5kIGVuZCBjb25maWcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kZXhPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgc3RhcnRBcnJheSB0byBTZWxlY3RPcHRpb25zIHdpdGggXCJTdGVwIChuKVwiIG9yIFwic2V0TmFtZSAobilcIiBsYWJlbHNcbiAgICBjb25zdCBzdGFydE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5zdGFydEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgZW5kQXJyYXkgdG8gU2VsZWN0T3B0aW9ucyB3aXRoIHNhbWUgbGFiZWwgZm9ybWF0XG4gICAgY29uc3QgZW5kT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmVuZEFycmF5Lm1hcChpZHggPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExvb3BJbmRleE9wdGlvbkxhYmVsKGlkeCk7XG4gICAgICByZXR1cm4geyBpZDogaWR4LCB2YWx1ZTogaWR4LCBuYW1lOiBsYWJlbCwgbGFiZWwgfTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wU3RhcnRDb25maWcsXG4gICAgICBvcHRpb25zOiBbe2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnU3RhcnQnLCBsYWJlbDogJ1N0YXJ0J30sIC4uLnN0YXJ0T3B0aW9uc10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvb3BTdGFydENoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcEVuZENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFsuLi5lbmRPcHRpb25zLHtpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ0VuZCcsIGxhYmVsOiAnRW5kJ31dLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG9uTG9vcFR5cGVDaGFuZ2UodHlwZTogc3RyaW5nIHwgTG9vcFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBsb29wVHlwZSA9IHR5cGUgYXMgTG9vcFR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gbG9vcFR5cGU7XG4gICAgdGhpcy5sb29wVHlwZUNoYW5nZS5lbWl0KGxvb3BUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiB0aGUgQWR2YW5jZWQgc2V0dGluZ3Mgc2VjdGlvbi5cbiAgICovXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIGJvb2xlYW4gdmFyaWFibGUgY2hhbmdlIChlLmcuIHNob3VsZFNraXApLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkdmFuY2VkIG5vbi1ib29sZWFuIHZhbHVlIGNoYW5nZXMgKGtlcHQgZ2VuZXJpYyBmb3IgZnV0dXJlIHVzZSwgZS5nLiBzdHJfbGlzdCkuXG4gICAqL1xuICBvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yICdmb3InIGxvb3AgdHlwZVxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSAoc2FtZSBwYXR0ZXJuIGFzIGFjdGlvbiBzdGVwKVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9sc1xuICAgICAgICAgICAgLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICBpZih0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGlmKCF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlLFxuICAgICAgc2VsZWN0T3B0aW9uOiBmb3JtVmFsdWUuc2VsZWN0T3B0aW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFQcm9maWxlOiBmb3JtVmFsdWUuZGF0YVByb2ZpbGUgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcFN0YXJ0OiBmb3JtVmFsdWUubG9vcFN0YXJ0IHx8IHVuZGVmaW5lZCxcbiAgICAgIGxvb3BFbmQ6IGZvcm1WYWx1ZS5sb29wRW5kIHx8IHVuZGVmaW5lZCxcbiAgICAgIHJ1blRpbWU6IGZvcm1WYWx1ZS5ydW5UaW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIHdoaWxlVGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1xuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIGNyZWF0ZVdoaWxlU3RlcChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ2NyZWF0ZVdoaWxlU3RlcCcsIGV2ZW50KTtcbiAgICBjb25zdCBzdGVwRGF0YTogTG9vcEZvcm1EYXRhID0ge1xuICAgICAgc2VsZWN0ZWRMb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgbG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ3N0ZXBEYXRhJywgc3RlcERhdGEpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvYWRNb3JlIGV2ZW50IGZvciBkYXRhIHByb2ZpbGVzXG4gICAqL1xuICBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkYXRhIHByb2ZpbGUgY29uZmlnIHdoZW4gbG9hZGluZyBzdGF0ZSBvciBoYXNNb3JlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVByb2ZpbGVDb25maWcpIHtcbiAgICAgIHRoaXMuZGF0YVByb2ZpbGVDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlc1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSAnZm9yJztcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgIHRoaXMuc3RhcnRBcnJheSA9IFtdO1xuICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICB0aGlzLmxvb3BGb3JtLnJlc2V0KHtcbiAgICAgIHNlbGVjdE9wdGlvbjogbnVsbCxcbiAgICAgIGRhdGFQcm9maWxlOiBudWxsLFxuICAgICAgbG9vcFN0YXJ0OiBudWxsLFxuICAgICAgbG9vcEVuZDogbnVsbFxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gZXZlbnQ7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcyhldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoU3VibWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uV2hpbGVTZWFyY2hDaGFuZ2UoZXZlbnQpO1xuICB9XG5cbiAgb25XaGlsZVNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJXaGlsZVRlbXBsYXRlcygnJyk7XG4gIH1cblxuICBmaWx0ZXJXaGlsZVRlbXBsYXRlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53aGlsZVRlbXBsYXRlcyA9IHRoaXMud2hpbGVUZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHRlbXBsYXRlLmh0bWxHcmFtbWFyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIH1cblxuICBzZWxlY3RXaGlsZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMud2hpbGVJc0NoYW5naW5nVGVtcGxhdGUgPSBmYWxzZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yIGZvci1sb29wLWJ1aWxkZXJcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTRcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tLTBcIj5cbiAgICAgIHt7IGlzRWRpdE1vZGUgPyAnRWRpdCBsb29wIHN0ZXAnIDogJ0NyZWF0ZSBMb29wIFRlc3QgU3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiAhd2hpbGVJc0NoYW5naW5nVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICBpY29uPVwic3dhcF9ob3JpelwiXG4gICAgICB0ZXh0PVwiQ2hhbmdlIFRlbXBsYXRlXCJcbiAgICAgIChjbGlja2VkKT1cIm9uV2hpbGVDaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB3aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICBidG5TaXplPVwic21cIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAoY2xpY2tlZCk9XCJvbldoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGUoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIFR5cGUgU2VsZWN0aW9uOiBpbiBlZGl0IG1vZGUgc2hvdyBvbmx5IHRoZSBjdXJyZW50IHR5cGUgKEZvciBvciBXaGlsZSk7IGluIGNyZWF0ZSBtb2RlIHNob3cgYm90aCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtcHgtMyBjcWEtdGV4dC1bIzExMTgyN11cIj57eyBzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnID8gJ1doaWxlJyA6ICdGb3InIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNFZGl0TW9kZVwiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyMzRjQzRUUnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnZm9yJylcIj5cbiAgICAgICAgRm9yXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnIzNGNDNFRScgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnI0ZGRkZGRicgOiAnIzZCNzI4MCdcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1c109XCInOHB4J1wiXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzIycHgnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uTG9vcFR5cGVDaGFuZ2UoJ3doaWxlJylcIj5cbiAgICAgICAgV2hpbGVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvcm0gRmllbGRzIC0tPlxuICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgIDwhLS0gRHJvcGRvd24gRmllbGRzIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC00IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDwhLS0gU2VsZWN0IE9wdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIFNlbGVjdCBPcHRpb25cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cInNlbGVjdE9wdGlvbkNvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdkYXRhUHJvZmlsZSdcIj5cbiAgICAgIDwhLS0gRGF0YSBQcm9maWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgRGF0YSBQcm9maWxlXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJsb29wRm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhUHJvZmlsZUNvbmZpZ1wiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlYXJjaERhdGFQcm9maWxlcygkZXZlbnQucXVlcnkpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25Mb2FkTW9yZURhdGFQcm9maWxlcygkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBTdGFydCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMVwiIHN0eWxlPVwibWluLXdpZHRoOiBjYWxjKDI1JSAtIDEycHgpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgIExvb3AgU3RhcnRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BTdGFydENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExvb3AgRW5kIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBFbmRcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImxvb3BFbmRDb25maWdcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAncnVuVGltZSdcIj5cbiAgICAgICAgPCEtLSBSdW4gVGltZSBJbnB1dCBGaWVsZCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICAgIFJ1biBUaW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBSdW4gVGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImxvb3BGb3JtLmdldCgncnVuVGltZScpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuICBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW1iLTEuNVwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVBZHZhbmNlZCgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWJhc2VcIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgIGV4cGFuZF9tb3JlXG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICA8Y3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIFxuICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlc109XCJhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZUZvcm1dPVwiYWR2YW5jZWRWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAodmFyaWFibGVCb29sZWFuQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgIDwvY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IFxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgIDxjcWEtc3RlcC1idWlsZGVyLWFjdGlvblxuICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgW2NvbXB1dGVIdG1sR3JhbW1hckZuXT1cImNvbXB1dGVIdG1sR3JhbW1hckZuXCJcbiAgICAgIFtjaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFtjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbF09XCJ3aGlsZUNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXCJcbiAgICAgIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIlxuICAgICAgW3NldFRlbXBsYXRlVmFyaWFibGVzXT1cInNldFdoaWxlVGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgW3NldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNdPVwic2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICBbZWRpdE1vZGVdPVwiaXNFZGl0TW9kZVwiXG4gICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgIFtpbml0aWFsVGVtcGxhdGVdPVwic2VsZWN0ZWRXaGlsZVRlbXBsYXRlXCJcbiAgICAgIFtpbml0aWFsRGVzY3JpcHRpb25dPVwic2VsZWN0ZWRXaGlsZURlc2NyaXB0aW9uXCJcbiAgICAgIFtpbml0aWFsTWV0YWRhdGFdPVwic2VsZWN0ZWRXaGlsZU1ldGFkYXRhXCJcbiAgICAgIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJ3aGlsZVNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlUGFyYW1ldGVyc109XCJoYXNNb3JlUGFyYW1ldGVyc1wiXG4gICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlRW52aXJvbm1lbnRzXT1cImhhc01vcmVFbnZpcm9ubWVudHNcIlxuICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICBbZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhRW5kSW5kZXhcIlxuICAgICAgW2lzSW5zaWRlRm9yTG9vcFN0ZXBdPVwiaXNJbnNpZGVGb3JMb29wU3RlcFwiXG4gICAgICAodGVtcGxhdGVDaGFuZ2VkKT1cInNlbGVjdFdoaWxlVGVtcGxhdGUoJGV2ZW50KVwiXG4gICAgICAoY2FuY2VsbGVkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgKGNyZWF0ZVN0ZXApPVwiY3JlYXRlV2hpbGVTdGVwKCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlRWxlbWVudHMpPVwibG9hZE1vcmVFbGVtZW50cy5lbWl0KClcIlxuICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUpPVwic2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVFbGVtZW50KT1cImNyZWF0ZUVsZW1lbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCk9XCJjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdC5lbWl0KCRldmVudClcIlxuICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlUGFyYW1ldGVycyk9XCJsb2FkTW9yZVBhcmFtZXRlcnMuZW1pdCgpXCJcbiAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvUGFyYW1ldGVyKT1cInJlZGlyZWN0VG9QYXJhbWV0ZXIuZW1pdCgpXCJcbiAgICAgIChyZWRpcmVjdFRvRW52aXJvbm1lbnQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiXG4gICAgICAoY2FuY2VsRWxlbWVudEZvcm0pPVwiY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpXCI+XG4gICAgPC9jcWEtc3RlcC1idWlsZGVyLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9uczogQXBwbHkgb25seSB3aGVuIGlzRGVidWcgKyBleGlzdGluZyBzdGVwIChpc0VkaXRNb2RlKSwgZWxzZSBDcmVhdGUgU3RlcCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtNiBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgIFt0ZXh0XT1cImlzRWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0NyZWF0ZSBTdGVwJ1wiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkNyZWF0aW5n4oCmXCIgaWNvbj1cImF1dG9yZW5ld1wiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbaW5saW5lU3R5bGVzXT1cIidtaW4taGVpZ2h0OiAzOHB4OyBoZWlnaHQ6IDM4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOydcIlxuICAgICAgICB2YXJpYW50PVwiaW5mb1wiIHNpemU9XCJtZWRpdW1cIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|
|
803
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBZ0RoRixNQUFNLE9BQU8sd0JBQXdCO0lBdUluQyxZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQXRJbkMsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxrR0FBa0c7UUFDekYsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDekMsbUdBQW1HO1FBQzFGLDhCQUF5QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUs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Q0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50JztcblxuLy8gSW1wb3J0IEVsZW1lbnQgdHlwZSAtIHVzaW5nIGFueSBmb3Igbm93IHNpbmNlIEVsZW1lbnQgaXMgZnJvbSB0cy1wb3J0YWwtdWlcbi8vIEluIGEgcmVhbCBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc2hhcmVkIGludGVyZmFjZSBvciBpbXBvcnQgZnJvbSBhIHNoYXJlZCBwYWNrYWdlXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgTG9vcFR5cGUgPSAnZm9yJyB8ICd3aGlsZSc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBkYXRhIHByb2ZpbGUgb3B0aW9uXG4gKiBCYXNlZCBvbiBUZXN0RGF0YSBtb2RlbCBzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUHJvZmlsZU9wdGlvbiB7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEFycmF5IG9mIGRhdGEgc2V0cyAtIGxlbmd0aCBkZXRlcm1pbmVzIGF2YWlsYWJsZSBsb29wIGluZGljZXMgKi9cbiAgZGF0YT86IGFueVtdO1xuICAvKiogT3B0aW9uYWw6IGRpcmVjdCBkYXRhIGxlbmd0aCBpZiBkYXRhIGFycmF5IGlzIG5vdCBwcm92aWRlZCAqL1xuICBkYXRhTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvb3BGb3JtRGF0YSB7XG4gIHNlbGVjdGVkTG9vcFR5cGU6IExvb3BUeXBlO1xuICBsb29wVHlwZTogTG9vcFR5cGU7XG4gIHNlbGVjdE9wdGlvbj86IHN0cmluZztcbiAgZGF0YVByb2ZpbGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxvb3BTdGFydD86IG51bWJlciB8IHN0cmluZztcbiAgbG9vcEVuZD86IG51bWJlciB8IHN0cmluZztcbiAgcnVuVGltZT86IHN0cmluZztcbiAgd2hpbGVUZW1wbGF0ZT86IGFueTtcbiAgZXZlbnQ/OiBhbnk7XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1sb29wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyTG9vcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBsb29wIHR5cGUgKi9cbiAgQElucHV0KCkgbG9vcFR5cGU6IExvb3BUeXBlID0gJ2Zvcic7XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBzZWxlY3Qgb3B0aW9uIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIHNlbGVjdE9wdGlvbnM6IGFueVtdID0gW1xuICAgIHt2YWx1ZTogJ2RhdGFQcm9maWxlJywgbGFiZWw6ICdEYXRhIFByb2ZpbGUnfSxcbiAgICB7dmFsdWU6ICdydW5UaW1lJywgbGFiZWw6ICdSdW4gVGltZSd9XG4gIF07XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkYXRhIHByb2ZpbGUgZHJvcGRvd24gLSBhY2NlcHRzIERhdGFQcm9maWxlT3B0aW9uIG9iamVjdHMgKi9cbiAgQElucHV0KCkgZGF0YVByb2ZpbGVPcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdID0gW107XG5cbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBjcmVhdGluZyB0aGUgc3RlcCAoQVBJIGluIHByb2dyZXNzKTsgc2hvdyBsb2FkZXIgb24gQ3JlYXRlIFN0ZXAgYnV0dG9uICovXG4gIEBJbnB1dCgpIGlzQ3JlYXRpbmdTdGVwOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRXaGlsZVRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUsIHRlc3RTdGVwPzogYW55KSA9PiBhbnlbXSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICAvKiogQ2VudHJhbGlzZWQgSFRNTCBncmFtbWFyIGNvbXB1dGF0aW9uIGZ1bmN0aW9uLiBQYXNzIFN0ZXBCdWlsZGVyU2VydmljZS5jb21wdXRlSHRtbEdyYW1tYXIgZnJvbSB0aGUgaG9zdCBhcHAuICovXG4gIEBJbnB1dCgpIGNvbXB1dGVIdG1sR3JhbW1hckZuPzogKHRlbXBsYXRlOiBhbnksIHZhcmlhYmxlczogYW55W10pID0+IHN0cmluZztcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcEZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBsb29wIHR5cGUgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgbG9vcFR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BUeXBlPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQElucHV0KCkgd2hpbGVUZW1wbGF0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggV2hpbGUnO1xuICBASW5wdXQoKSB3aGlsZVNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgXG4gIC8vIEVsZW1lbnQgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZUVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ0VsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBTY3JlZW4gbmFtZSBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gUGFyYW1ldGVyIGZldGNoaW5nIHByb3BlcnRpZXNcbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHJhdyB0ZXN0IGRhdGEgcHJvZmlsZXNcbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gRW52aXJvbm1lbnQgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhRW5kSW5kZXg/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGlzSW5zaWRlRm9yTG9vcFN0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaGFzVGVzdERhdGFQcm9maWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGVhZGVyIGFuZCBidXR0b24gc2hvdyBlZGl0L3VwZGF0ZSB3b3JkaW5nIChzYW1lIGFzIGFjdGlvbiBzdGVwIGJ1aWxkZXIgaW4gZGVidWcpLiAqL1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBFeGlzdGluZyBzdGVwIHdoZW4gZWRpdGluZzsgdXNlZCB3aXRoIGlzRGVidWcgdG8gZGV0ZXJtaW5lIGVkaXQgbW9kZS4gKi9cbiAgQElucHV0KCkgdGVzdFN0ZXA/OiBhbnk7XG5cbiAgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pc0RlYnVnICYmICEhKHRoaXMudGVzdFN0ZXA/LmlkID8/IHRoaXMudGVzdFN0ZXA/LnN0ZXBfaWQpO1xuICB9XG4gIFxuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxFbGVtZW50Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaEVudmlyb25tZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvUGFyYW1ldGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb0Vudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgc2VsZWN0ZWRXaGlsZVRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICBzZWxlY3RlZFdoaWxlRGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFdoaWxlTWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZExvb3BUeXBlOiBMb29wVHlwZSA9ICdmb3InO1xuICB3aGlsZUNoYW5nZVRlbXBsYXRlU2lnbmFsOiBudW1iZXIgPSAwO1xuICB3aGlsZUNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsOiBudW1iZXIgPSAwO1xuICB3aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG9uV2hpbGVDaGFuZ2VUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlSXNDaGFuZ2luZ1RlbXBsYXRlID0gdHJ1ZTtcbiAgICB0aGlzLndoaWxlQ2hhbmdlVGVtcGxhdGVTaWduYWwrKztcbiAgfVxuXG4gIG9uV2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlSXNDaGFuZ2luZ1RlbXBsYXRlID0gZmFsc2U7XG4gICAgdGhpcy53aGlsZUNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsKys7XG4gIH1cbiAgXG4gIC8vIFNpbmdsZSBGb3JtR3JvdXAgY29udGFpbmluZyBhbGwgZm91ciBmaWVsZHNcbiAgbG9vcEZvcm06IEZvcm1Hcm91cDtcblxuICAvLyBBZHZhbmNlZCBzZXR0aW5ncyBzdGF0ZSAoc2FtZSBwYXR0ZXJuIGFzIGFjdGlvbiBzdGVwIGJ1aWxkZXIpXG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZFZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheTtcblxuICAvLyBDb25maWdzIGZvciBkeW5hbWljLXNlbGVjdCBjb21wb25lbnRzXG4gIHNlbGVjdE9wdGlvbkNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBkYXRhUHJvZmlsZUNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBsb29wU3RhcnRDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgbG9vcEVuZENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIG1hbmFnaW5nIGxvb3AgaW5kaWNlc1xuICBwcml2YXRlIHNlbGVjdGVkRGF0YVByb2ZpbGU6IERhdGFQcm9maWxlT3B0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBlbmRBcnJheTogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIC8vIEluaXRpYWxpemUgc2luZ2xlIEZvcm1Hcm91cCB3aXRoIGFsbCBmaWVsZHNcbiAgICB0aGlzLmxvb3BGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBzZWxlY3RPcHRpb246IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGRhdGFQcm9maWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wU3RhcnQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGxvb3BFbmQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIHJ1blRpbWU6IG5ldyBGb3JtQ29udHJvbChudWxsKVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhZHZhbmNlZCB2YXJpYWJsZXMgZm9ybVxuICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZ3NcbiAgICB0aGlzLnNlbGVjdE9wdGlvbkNvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdE9wdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ3NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VsZWN0ZWRWYWx1ZTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5zZWxlY3RPcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdkYXRhIHByb2ZpbGUnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcFN0YXJ0Q29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcFN0YXJ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnbG9vcCBzdGFydCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb29wRW5kQ29uZmlnID0ge1xuICAgICAga2V5OiAnbG9vcEVuZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3AgZW5kJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9OyAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSB0aGlzLmxvb3BUeXBlO1xuICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZm9yIGxvb3Agc3RlcHMgKHNhbWUgdHlwZSBhcyBvdGhlciBzdGVwcylcbiAgICB0aGlzLmluaXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMudGVzdFN0ZXApIHtcbiAgICAgIHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCksIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5RGVmYXVsdERhdGFQcm9maWxlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGF0YVByb2ZpbGVPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlncygpO1xuICAgICAgLy8gSWYgYSBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCBpbiB0aGUgZm9ybSwgdXBkYXRlIGxvb3AgaW5kaWNlcyAoZG8gbm90IHJlLXBhdGNoIGZyb20gdGVzdFN0ZXAgaGVyZSxcbiAgICAgIC8vIGFzIHRoYXQgd291bGQgb3ZlcndyaXRlIHVzZXIncyBpbi1wcm9ncmVzcyBjaGFuZ2UgZnJvbSBSdW4gVGltZSB0byBEYXRhIFByb2ZpbGUgd2hlbiB0aGUgZHJvcGRvd24gb3BlbnMpXG4gICAgICBjb25zdCBjdXJyZW50UHJvZmlsZUlkID0gdGhpcy5sb29wRm9ybS5nZXQoJ2RhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRQcm9maWxlSWQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKGN1cnJlbnRQcm9maWxlSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBseURlZmF1bHREYXRhUHJvZmlsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKGNoYW5nZXNbJ2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCddIHx8IGNoYW5nZXNbJ2lzSW5zaWRlRm9yTG9vcFN0ZXAnXSkgJiYgIXRoaXMuaXNFZGl0TW9kZSkge1xuICAgICAgdGhpcy5hcHBseURlZmF1bHREYXRhUHJvZmlsZSgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGFzTW9yZURhdGFQcm9maWxlcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0RhdGFQcm9maWxlcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGFQcm9maWxlQ29uZmlnKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsb29wVHlwZSddKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSB0aGlzLmxvb3BUeXBlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndGVzdFN0ZXAnXSB8fCBjaGFuZ2VzWydpc0RlYnVnJ10pIHtcbiAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy50ZXN0U3RlcCkge1xuICAgICAgICB0aGlzLnBhdGNoRm9ybUZyb21UZXN0U3RlcCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snd2hpbGVUZW1wbGF0ZXMnXSAmJiB0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy50ZXN0U3RlcCAmJiAhdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk7XG4gICAgfVxuICAgIC8vIE5vdGU6IGxvb3BTdGFydE9wdGlvbnMgYW5kIGxvb3BFbmRPcHRpb25zIGFyZSBub3cgY2FsY3VsYXRlZCBkeW5hbWljYWxseVxuICAgIC8vIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB1cGRhdGVkIGZyb20gaW5wdXRzXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBsb29wIHN0ZXAgdmFsdWVzIGZyb20gc3RlcCAoc2FtZSBmYWxsYmFja3MgYXMgdGVzdC1jYXNlLWRldGFpbHM6IGRhdGFNYXBKc29uLCBkYXRhTWFwQmVhbi5mb3JfbG9vcCkuXG4gICAqL1xuICBwcml2YXRlIGdldExvb3BTdGVwVmFsdWUoc3RlcDogYW55LCBrZXk6ICdmb3JMb29wVGVzdERhdGFJZCcgfCAnZm9yTG9vcFN0YXJ0SW5kZXgnIHwgJ2Zvckxvb3BFbmRJbmRleCcpOiBhbnkge1xuICAgIGNvbnN0IGRhdGFNYXAgPSBzdGVwPy5kYXRhTWFwSnNvbiA/PyBzdGVwPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A7XG4gICAgY29uc3QgbWFwS2V5ID0ga2V5ID09PSAnZm9yTG9vcFRlc3REYXRhSWQnID8gJ3Rlc3REYXRhSWQnIDoga2V5ID09PSAnZm9yTG9vcFN0YXJ0SW5kZXgnID8gJ3N0YXJ0SW5kZXgnIDogJ2VuZEluZGV4JztcbiAgICByZXR1cm4gc3RlcD8uW2tleV0gPz8gc3RlcD8uZGF0YU1hcEpzb24/LltrZXldID8/IGRhdGFNYXA/LlttYXBLZXldID8/IGRhdGFNYXA/LltrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1maWxsIHRoZSBmb3JtIGZyb20gYW4gZXhpc3Rpbmcgc3RlcCAoZWRpdCBtb2RlKS4gRGVidWcgb25seSDigJQgb25seSBydW5zIHdoZW4gaXNEZWJ1ZyBpcyB0cnVlLlxuICAgKiBVc2VzIHNhbWUgZmFsbGJhY2tzIGFzIHRlc3QtY2FzZS1kZXRhaWxzIChkYXRhTWFwSnNvbiwgZGF0YU1hcEJlYW4uZm9yX2xvb3ApIGFuZCBleHBsaWNpdGx5XG4gICAqIHNldFZhbHVlIG9uIGNvbnRyb2xzIHNvIGRyb3Bkb3ducyBiaW5kIChwYXRjaFZhbHVlIGNhbiBiZSBpZ25vcmVkIGJ5IGR5bmFtaWMtc2VsZWN0IGluIHNvbWUgdGltaW5nIGNhc2VzKS5cbiAgICovXG4gIHByaXZhdGUgcGF0Y2hGb3JtRnJvbVRlc3RTdGVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0RlYnVnIHx8ICF0aGlzLnRlc3RTdGVwKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMudGVzdFN0ZXAgYXMgYW55O1xuICAgIGNvbnN0IGlzV2hpbGUgPSBzdGVwLnRlc3RTdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnIHx8IHN0ZXAudHlwZSA9PT0gJ1dISUxFX0xPT1AnO1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IGlzV2hpbGUgPyAnd2hpbGUnIDogJ2Zvcic7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgY29uc3QgaXNSdW5UaW1lID0gISFzdGVwLmlzUnVuVGltZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGlzUnVuVGltZSA/ICdydW5UaW1lJyA6ICdkYXRhUHJvZmlsZSc7XG4gICAgICBjb25zdCBwcm9maWxlSWQgPSBpc1J1blRpbWUgPyBudWxsIDogKHRoaXMuZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwLCAnZm9yTG9vcFRlc3REYXRhSWQnKSA/PyBudWxsKTtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsID0gaXNSdW5UaW1lID8gbnVsbCA6ICh0aGlzLmdldExvb3BTdGVwVmFsdWUoc3RlcCwgJ2Zvckxvb3BTdGFydEluZGV4JykgPz8gbnVsbCk7XG4gICAgICBjb25zdCBlbmRWYWwgPSBpc1J1blRpbWUgPyBudWxsIDogKHRoaXMuZ2V0TG9vcFN0ZXBWYWx1ZShzdGVwLCAnZm9yTG9vcEVuZEluZGV4JykgPz8gbnVsbCk7XG4gICAgICBjb25zdCBydW5UaW1lVmFsID0gaXNSdW5UaW1lID8gKHN0ZXAudGVzdERhdGFWYWwgPz8gc3RlcC50ZXN0RGF0YSA/PyAnJykgOiBudWxsO1xuXG4gICAgICB0aGlzLmxvb3BGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBzZWxlY3RPcHRpb24sXG4gICAgICAgIGRhdGFQcm9maWxlOiBwcm9maWxlSWQsXG4gICAgICAgIGxvb3BTdGFydDogc3RhcnRWYWwsXG4gICAgICAgIGxvb3BFbmQ6IGVuZFZhbCxcbiAgICAgICAgcnVuVGltZTogcnVuVGltZVZhbFxuICAgICAgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICBpZiAoIWlzUnVuVGltZSAmJiBwcm9maWxlSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFZhbCA/PyB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBlbmQgPSBlbmRWYWwgPz8gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgICAgIHRoaXMubG9vcEZvcm0ucGF0Y2hWYWx1ZSh7IGxvb3BTdGFydDogc3RhcnQsIGxvb3BFbmQ6IGVuZCB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8uc2V0VmFsdWUoc2VsZWN0T3B0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBpZiAocHJvZmlsZUlkICE9IG51bGwpIHRoaXMubG9vcEZvcm0uZ2V0KCdkYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlSWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsKSB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnNldFZhbHVlKHN0YXJ0VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBpZiAoZW5kVmFsICE9IG51bGwpIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKGVuZFZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKHJ1blRpbWVWYWwgIT0gbnVsbCAmJiBydW5UaW1lVmFsICE9PSAnJykgdGhpcy5sb29wRm9ybS5nZXQoJ3J1blRpbWUnKT8uc2V0VmFsdWUocnVuVGltZVZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICAvLyBQcmUtZmlsbCB0aGUgd2hpbGUgY29uZGl0aW9uIHRlbXBsYXRlIGZyb20gdGhlIGNvbmRpdGlvbiBjaGlsZFxuICAgICAgY29uc3QgY29uZENoaWxkID0gc3RlcC5jaGlsZHJlbj8uZmluZCgoYzogYW55KSA9PiBjLmNvbmRpdGlvblR5cGUgPT09ICdMT09QX1dISUxFJyk7XG4gICAgICBpZiAoY29uZENoaWxkKSB7XG4gICAgICAgIGlmIChjb25kQ2hpbGQudGVtcGxhdGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZSA9IGNvbmRDaGlsZC50ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25kQ2hpbGQubmF0dXJhbFRleHRBY3Rpb25JZCAmJiB0aGlzLndoaWxlVGVtcGxhdGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBubElkID0gTnVtYmVyKGNvbmRDaGlsZC5uYXR1cmFsVGV4dEFjdGlvbklkKTtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maW5kKCh0OiBhbnkpID0+IE51bWJlcih0LmlkKSA9PT0gbmxJZCk7XG4gICAgICAgICAgaWYgKG1hdGNoZWQpIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gbWF0Y2hlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZENoaWxkLmRlc2NyaXB0aW9uKSB0aGlzLnNlbGVjdGVkV2hpbGVEZXNjcmlwdGlvbiA9IGNvbmRDaGlsZC5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGNvbmRDaGlsZC5tZXRhZGF0YSkgdGhpcy5zZWxlY3RlZFdoaWxlTWV0YWRhdGEgPSBjb25kQ2hpbGQubWV0YWRhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkU2tpcCA9ICEhKHN0ZXAuc2hvdWxkU2tpcCA/PyBzdGVwLmV2ZW50Py5zaG91bGRTa2lwKTtcbiAgICBjb25zdCBza2lwVmFyID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09ICdzaG91bGRTa2lwJyk7XG4gICAgaWYgKHNraXBWYXIpIHtcbiAgICAgIHNraXBWYXIudmFsdWUgPSBzaG91bGRTa2lwO1xuICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBmb3IgbG9vcCBzdGVwcy5cbiAgICogRm9yIGxvb3BzLCB3ZSBjdXJyZW50bHkgc3VwcG9ydCB0aGUgc2FtZSBnZW5lcmljIGFkdmFuY2VkIGZsYWc6IHNob3VsZFNraXAuXG4gICAqL1xuICBwcml2YXRlIGluaXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Nob3VsZFNraXAnLFxuICAgICAgICBsYWJlbDogJ1NraXAgdGhpcyBzdGVwIGR1cmluZyBleGVjdXRpb24uJyxcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlYWN0aXZlIGZvcm0gZm9yIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyAobWlycm9ycyBhY3Rpb24gc3RlcCBiZWhhdmlvcikuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggYWR2YW5jZWQgdmFyaWFibGVcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0Jykge1xuICAgICAgICBjb25zdCB2YWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZS52YWx1ZSkgPyB2YXJpYWJsZS52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHZhbHVlQXJyYXkubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB2YWx1ZUFycmF5Lm1hcCgoaXRlbTogc3RyaW5nKSA9PiB0aGlzLmZiLmNvbnRyb2woaXRlbSkpXG4gICAgICAgICAgICA6IFt0aGlzLmZiLmNvbnRyb2woJycpXVxuICAgICAgICApO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBmb3JtQXJyYXk7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlLm5hbWVdLFxuICAgICAgICB2YWx1ZTogdmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyA/IGRlZmF1bHRWYWx1ZSA6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlncygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW11cbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyh0aGlzLmRhdGFQcm9maWxlT3B0aW9ucyksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkgfHwgJycpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gTG9vcCBzdGFydCBhbmQgZW5kIG9wdGlvbnMgYXJlIHVwZGF0ZWQgd2hlbiBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWRcbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIFdoZW4gYSBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGlzIHByb3ZpZGVkIChlLmcuLCB0ZXN0Q2FzZS50ZXN0RGF0YUlkKSBhbmQgdGhlIHVzZXIgaXNcbiAgICogY3JlYXRpbmcgYSBGT1IgbG9vcCBhdCB0aGUgcm9vdCBsZXZlbCwgYXV0by1zZWxlY3QgaXQgYW5kIGRpc2FibGUgdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHREYXRhUHJvZmlsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XG4gICAgLy8gT25seSBhdXRvLXNlbGVjdCArIGRpc2FibGUgd2hlbiB0aGUgbmV3IEZPUiBsb29wIGlzIE5PVCBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgRk9SIGxvb3AuXG4gICAgLy8gV2hlbiBuZXN0ZWQsIHRoZSB1c2VyIHNob3VsZCBiZSBmcmVlIHRvIHBpY2sgYSBkaWZmZXJlbnQgZGF0YSBwcm9maWxlLlxuICAgIGlmICh0aGlzLmlzSW5zaWRlRm9yTG9vcFN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0YVByb2ZpbGVEaXNhYmxlZChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLnNldERhdGFQcm9maWxlRGlzYWJsZWQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlRXhpc3RzID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuc29tZShwID0+XG4gICAgICBTdHJpbmcocC5pZCkgPT09IFN0cmluZyh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZClcbiAgICApO1xuICAgIGlmICghcHJvZmlsZUV4aXN0cykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdkYXRhUHJvZmlsZScpO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRyb2w/LnZhbHVlO1xuICAgIGlmIChTdHJpbmcoY3VycmVudFZhbHVlID8/ICcnKSAhPT0gU3RyaW5nKHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKSkge1xuICAgICAgY29udHJvbD8uc2V0VmFsdWUodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCk7XG4gICAgfVxuICAgIHRoaXMuc2V0RGF0YVByb2ZpbGVEaXNhYmxlZCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YVByb2ZpbGVEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyB8fCB0aGlzLmRhdGFQcm9maWxlQ29uZmlnLmRpc2FibGVkID09PSBkaXNhYmxlZCkgcmV0dXJuO1xuICAgIC8vIE9ubHkgdG9nZ2xlIHRoZSBjb25maWctbGV2ZWwgZGlzYWJsZWQgZmxhZzsga2VlcCB0aGUgRm9ybUNvbnRyb2wgZW5hYmxlZCBzb1xuICAgIC8vIGl0cyB2YWx1ZSBpcyBpbmNsdWRlZCBpbiBmb3JtLnZhbHVlIHdoZW4gdGhlIHN0ZXAgaXMgY3JlYXRlZC5cbiAgICB0aGlzLmRhdGFQcm9maWxlQ29uZmlnID0geyAuLi50aGlzLmRhdGFQcm9maWxlQ29uZmlnLCBkaXNhYmxlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgbG9vcCBzdGFydC9lbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChwcm9maWxlID0+IFxuICAgICAgcHJvZmlsZS5pZCA9PT0gcHJvZmlsZUlkIHx8IFN0cmluZyhwcm9maWxlLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZClcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFQcm9maWxlID0gc2VsZWN0ZWRQcm9maWxlO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHNlbGVjdGVkUHJvZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0QXJyYXkgPSBbXTtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbXTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbG9vcCBpbmRpY2VzIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wSW5kaWNlc0Zyb21Qcm9maWxlKHByb2ZpbGU6IERhdGFQcm9maWxlT3B0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2FsY3VsYXRlIGRhdGEgbGVuZ3RoIGZyb20gZGF0YSBhcnJheSBvciB1c2UgcHJvdmlkZWQgZGF0YUxlbmd0aFxuICAgIGxldCBkYXRhU2V0TGVuZ3RoID0gMTtcbiAgICBpZiAocHJvZmlsZS5kYXRhICYmIEFycmF5LmlzQXJyYXkocHJvZmlsZS5kYXRhKSkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmIChwcm9maWxlLmRhdGFMZW5ndGggJiYgcHJvZmlsZS5kYXRhTGVuZ3RoID4gMCkge1xuICAgICAgZGF0YVNldExlbmd0aCA9IHByb2ZpbGUuZGF0YUxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RhcnQgYXJyYXkgZnJvbSAxIHRvIGRhdGFTZXRMZW5ndGhcbiAgICB0aGlzLnN0YXJ0QXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBkYXRhU2V0TGVuZ3RoIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBlbmQgYXJyYXkgc2FtZSBhcyBzdGFydCBhcnJheVxuICAgIC8vIEVuZCBhcnJheSB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBzdGFydCBpbmRleCBpcyBzZWxlY3RlZFxuICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBmb3JtIGlzIGVtcHR5XG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BTdGFydCcpPy52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgXG4gICAgaWYgKCFjdXJyZW50U3RhcnQgJiYgdGhpcy5zdGFydEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8uc2V0VmFsdWUodGhpcy5zdGFydEFycmF5WzBdKTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50RW5kICYmIHRoaXMuZW5kQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8uc2V0VmFsdWUodGhpcy5lbmRBcnJheVt0aGlzLmVuZEFycmF5Lmxlbmd0aCAtIDFdKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9vcCBzdGFydCBjaGFuZ2UgYW5kIHVwZGF0ZSBlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkxvb3BTdGFydENoYW5nZShzdGFydEluZGV4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSB8fCAhc3RhcnRJbmRleCkge1xuICAgICAgdGhpcy5lbmRBcnJheSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGFydEluZGV4KSA6IHN0YXJ0SW5kZXg7XG4gICAgXG4gICAgaWYgKGlzTmFOKHN0YXJ0SWR4KSB8fCBzdGFydElkeCA8IDEpIHtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kIGFycmF5IHNob3VsZCBiZSBmcm9tIHN0YXJ0SW5kZXggdG8gZW5kIG9mIGRhdGFcbiAgICAgIC8vIEJhc2VkIG9uIHJlZmVyZW5jZTogZW5kQXJyYXkgPSBzdGFydEFycmF5LnNwbGljZShzdGFydEluZGV4IC0gMSwgc3RhcnRBcnJheS5sZW5ndGgpXG4gICAgICBjb25zdCBzdGFydEFycmF5Q29weSA9IFsuLi50aGlzLnN0YXJ0QXJyYXldO1xuICAgICAgdGhpcy5lbmRBcnJheSA9IHN0YXJ0QXJyYXlDb3B5LnNsaWNlKHN0YXJ0SWR4IC0gMSk7XG4gICAgfVxuXG4gICAgLy8gQXV0by11cGRhdGUgZW5kIGluZGV4IGlmIGN1cnJlbnQgZW5kIGlzIGludmFsaWRcbiAgICBjb25zdCBjdXJyZW50RW5kID0gdGhpcy5sb29wRm9ybS5nZXQoJ2xvb3BFbmQnKT8udmFsdWU7XG4gICAgY29uc3QgZW5kSWR4ID0gdHlwZW9mIGN1cnJlbnRFbmQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY3VycmVudEVuZCkgOiBjdXJyZW50RW5kO1xuICAgIFxuICAgIGlmICghY3VycmVudEVuZCB8fCBpc05hTihlbmRJZHgpIHx8IGVuZElkeCA8IHN0YXJ0SWR4KSB7XG4gICAgICBpZiAodGhpcy5lbmRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKHRoaXMuZW5kQXJyYXlbdGhpcy5lbmRBcnJheS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpc3BsYXkgbmFtZSBmb3IgYSAxLWJhc2VkIHJvdyBpbmRleCBmcm9tIHRoZSBzZWxlY3RlZCBwcm9maWxlJ3MgZGF0YSBhcnJheSAoZGF0YVtpbmRleC0xXS5uYW1lKS5cbiAgICogUmV0dXJucyBudWxsIGlmIG5vIG5hbWUuIE1hdGNoZXMgbG9vcC1zdGVwIGVkaXQgbW9kZSBiZWhhdmlvci5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KG9uZUJhc2VkSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGU7XG4gICAgaWYgKCFwcm9maWxlPy5kYXRhIHx8ICFBcnJheS5pc0FycmF5KHByb2ZpbGUuZGF0YSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkeCA9IG9uZUJhc2VkSW5kZXggLSAxO1xuICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBwcm9maWxlLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByb3cgPSBwcm9maWxlLmRhdGFbaWR4XTtcbiAgICByZXR1cm4gcm93ICYmIChyb3cubmFtZSAhPSBudWxsID8gU3RyaW5nKHJvdy5uYW1lKSA6IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGxhYmVsIGZvciBhIGxvb3AgaW5kZXggb3B0aW9uOiBcInNldE5hbWUgKG4pXCIgd2hlbiByb3cgaGFzIG5hbWUsIGVsc2UgXCJTdGVwIChuKVwiLlxuICAgKiBNYXRjaGVzIGxvb3Atc3RlcCBlZGl0IG1vZGUgZHJvcGRvd24gZGlzcGxheS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9vcEluZGV4T3B0aW9uTGFiZWwoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJvd05hbWUgPSB0aGlzLmdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChpZHgpO1xuICAgIHJldHVybiByb3dOYW1lID8gYCR7cm93TmFtZX0gKCR7aWR4fSlgIDogYFN0ZXAgKCR7aWR4fSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBsb29wIHN0YXJ0IGFuZCBlbmQgY29uZmlnIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9vcEluZGV4T3B0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IHN0YXJ0QXJyYXkgdG8gU2VsZWN0T3B0aW9ucyB3aXRoIFwiU3RlcCAobilcIiBvciBcInNldE5hbWUgKG4pXCIgbGFiZWxzXG4gICAgY29uc3Qgc3RhcnRPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuc3RhcnRBcnJheS5tYXAoaWR4ID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMb29wSW5kZXhPcHRpb25MYWJlbChpZHgpO1xuICAgICAgcmV0dXJuIHsgaWQ6IGlkeCwgdmFsdWU6IGlkeCwgbmFtZTogbGFiZWwsIGxhYmVsIH07XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IGVuZEFycmF5IHRvIFNlbGVjdE9wdGlvbnMgd2l0aCBzYW1lIGxhYmVsIGZvcm1hdFxuICAgIGNvbnN0IGVuZE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5lbmRBcnJheS5tYXAoaWR4ID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMb29wSW5kZXhPcHRpb25MYWJlbChpZHgpO1xuICAgICAgcmV0dXJuIHsgaWQ6IGlkeCwgdmFsdWU6IGlkeCwgbmFtZTogbGFiZWwsIGxhYmVsIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMubG9vcFN0YXJ0Q29uZmlnLFxuICAgICAgb3B0aW9uczogW3tpZDogLTEsIHZhbHVlOiAtMSwgbmFtZTogJ1N0YXJ0JywgbGFiZWw6ICdTdGFydCd9LCAuLi5zdGFydE9wdGlvbnNdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Mb29wU3RhcnRDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmxvb3BFbmRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmxvb3BFbmRDb25maWcsXG4gICAgICBvcHRpb25zOiBbLi4uZW5kT3B0aW9ucyx7aWQ6IC0xLCB2YWx1ZTogLTEsIG5hbWU6ICdFbmQnLCBsYWJlbDogJ0VuZCd9XSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlIGlmIG5lZWRlZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvbkxvb3BUeXBlQ2hhbmdlKHR5cGU6IHN0cmluZyB8IExvb3BUeXBlKTogdm9pZCB7XG4gICAgY29uc3QgbG9vcFR5cGUgPSB0eXBlIGFzIExvb3BUeXBlO1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IGxvb3BUeXBlO1xuICAgIHRoaXMubG9vcFR5cGVDaGFuZ2UuZW1pdChsb29wVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHZpc2liaWxpdHkgb2YgdGhlIEFkdmFuY2VkIHNldHRpbmdzIHNlY3Rpb24uXG4gICAqL1xuICB0b2dnbGVBZHZhbmNlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSAhdGhpcy5hZHZhbmNlZEV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhZHZhbmNlZCBib29sZWFuIHZhcmlhYmxlIGNoYW5nZSAoZS5nLiBzaG91bGRTa2lwKS5cbiAgICovXG4gIG9uQWR2YW5jZWRWYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhZHZhbmNlZCBub24tYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIChrZXB0IGdlbmVyaWMgZm9yIGZ1dHVyZSB1c2UsIGUuZy4gc3RyX2xpc3QpLlxuICAgKi9cbiAgb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmICh2YXJpYWJsZT8udHlwZSAhPT0gJ3N0cl9saXN0Jykge1xuICAgICAgICBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgaXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciAnZm9yJyBsb29wIHR5cGUg4oCUIHVzZSBnZXRSYXdWYWx1ZSBzbyBkaXNhYmxlZCBjb250cm9scyAoZS5nLiwgYXV0by1zZWxlY3RlZFxuICAgICAgLy8gZGVmYXVsdCBkYXRhIHByb2ZpbGUpIGFyZSBzdGlsbCBpbmNsdWRlZC5cbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubG9vcEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN5bmMgYWR2YW5jZWQgdmFyaWFibGVzIGZyb20gZm9ybSB0byBhcnJheSAoc2FtZSBwYXR0ZXJuIGFzIGFjdGlvbiBzdGVwKVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JyAmJiBmb3JtVmFsdWUgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9sc1xuICAgICAgICAgICAgLm1hcChjb250cm9sID0+IGNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICYmIHZhbC50cmltKCkgIT09ICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGlmKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGE6IExvb3BGb3JtRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkTG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUsXG4gICAgICBzZWxlY3RPcHRpb246IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgZGF0YVByb2ZpbGU6IGZvcm1WYWx1ZS5kYXRhUHJvZmlsZSB8fCB1bmRlZmluZWQsXG4gICAgICBsb29wU3RhcnQ6IGZvcm1WYWx1ZS5sb29wU3RhcnQgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcEVuZDogZm9ybVZhbHVlLmxvb3BFbmQgfHwgdW5kZWZpbmVkLFxuICAgICAgcnVuVGltZTogZm9ybVZhbHVlLnJ1blRpbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgd2hpbGVUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgY3JlYXRlV2hpbGVTdGVwKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlV2hpbGVTdGVwJywgZXZlbnQpO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZE1vcmUgZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgcHJvZmlsZSBjb25maWcgd2hlbiBsb2FkaW5nIHN0YXRlIG9yIGhhc01vcmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhUHJvZmlsZUNvbmZpZykge1xuICAgICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9ICdmb3InO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgIHRoaXMubG9vcEZvcm0ucmVzZXQoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBudWxsLFxuICAgICAgZGF0YVByb2ZpbGU6IG51bGwsXG4gICAgICBsb29wU3RhcnQ6IG51bGwsXG4gICAgICBsb29wRW5kOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSBldmVudDtcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKGV2ZW50KTtcbiAgfVxuXG4gIG9uV2hpbGVTZWFyY2hTdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25XaGlsZVNlYXJjaENoYW5nZShldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKCcnKTtcbiAgfVxuXG4gIGZpbHRlcldoaWxlVGVtcGxhdGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlVGVtcGxhdGVzID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuaHRtbEdyYW1tYXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIHNlbGVjdFdoaWxlVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgdGhpcy53aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZSA9IGZhbHNlO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTIgZm9yLWxvb3AtYnVpbGRlclwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtbWItNFwiPlxuICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW0tMFwiPlxuICAgICAge3sgaXNFZGl0TW9kZSA/ICdFZGl0IGxvb3Agc3RlcCcgOiAnQ3JlYXRlIExvb3AgVGVzdCBTdGVwJyB9fVxuICAgIDwvaDI+XG4gICAgPGNxYS1idXR0b25cbiAgICAgICpuZ0lmPVwiaXNFZGl0TW9kZSAmJiBzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnICYmICF3aGlsZUlzQ2hhbmdpbmdUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIGljb249XCJzd2FwX2hvcml6XCJcbiAgICAgIHRleHQ9XCJDaGFuZ2UgVGVtcGxhdGVcIlxuICAgICAgKGNsaWNrZWQpPVwib25XaGlsZUNoYW5nZVRlbXBsYXRlKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b25cbiAgICAgICpuZ0lmPVwiaXNFZGl0TW9kZSAmJiBzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnICYmIHdoaWxlSXNDaGFuZ2luZ1RlbXBsYXRlXCJcbiAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgIChjbGlja2VkKT1cIm9uV2hpbGVDYW5jZWxDaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgVHlwZSBTZWxlY3Rpb246IGluIGVkaXQgbW9kZSBzaG93IG9ubHkgdGhlIGN1cnJlbnQgdHlwZSAoRm9yIG9yIFdoaWxlKTsgaW4gY3JlYXRlIG1vZGUgc2hvdyBib3RoIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTQgY3FhLXctZnVsbFwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS1nYXAtMFwiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2O1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1weC0zIGNxYS10ZXh0LVsjMTExODI3XVwiPnt7IHNlbGVjdGVkTG9vcFR5cGUgPT09ICd3aGlsZScgPyAnV2hpbGUnIDogJ0ZvcicgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0VkaXRNb2RlXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1sZyBjcWEtcC0xIGNxYS1nYXAtMFwiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2O1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXRleHQtWzEycHhdIGNxYS1yb3VuZGVkLW1kIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLW1pbi13LVs4MHB4XSBjcWEtdGV4dC1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcicgPyAnIzNGNDNFRScgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyNGRkZGRkYnIDogJyM2QjcyODAnXCJcbiAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwiJzhweCdcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIicyMnB4J1wiXG4gICAgICAgIChjbGljayk9XCJvbkxvb3BUeXBlQ2hhbmdlKCdmb3InKVwiPlxuICAgICAgICBGb3JcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXRleHQtWzEycHhdIGNxYS1yb3VuZGVkLW1kIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLW1pbi13LVs4MHB4XSBjcWEtdGV4dC1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjM0Y0M0VFJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnd2hpbGUnKVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRm9ybSBGaWVsZHMgLS0+XG4gICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBEcm9wZG93biBGaWVsZHMgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTQgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPCEtLSBTZWxlY3QgT3B0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgU2VsZWN0IE9wdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwic2VsZWN0T3B0aW9uQ29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy52YWx1ZSA9PT0gJ2RhdGFQcm9maWxlJ1wiPlxuICAgICAgPCEtLSBEYXRhIFByb2ZpbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBEYXRhIFByb2ZpbGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFQcm9maWxlQ29uZmlnXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoRGF0YVByb2ZpbGVzKCRldmVudC5xdWVyeSlcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMb29wIFN0YXJ0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBTdGFydFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcFN0YXJ0Q29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBFbmQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBMb29wIEVuZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcEVuZENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdydW5UaW1lJ1wiPlxuICAgICAgICA8IS0tIFJ1biBUaW1lIElucHV0IEZpZWxkIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgICAgUnVuIFRpbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIFJ1biBUaW1lJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnZhbHVlXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YVByb2ZpbGVDb25maWc/LmRpc2FibGVkICYmIGxvb3BGb3JtLmdldCgnc2VsZWN0T3B0aW9uJyk/LnZhbHVlID09PSAnZGF0YVByb2ZpbGUnXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LXJlZC01MDAgY3FhLW1iLTJcIj5cbiAgICAgIERhdGEgUHJvZmlsZSBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIHNldCBhdCB0aGUgdGVzdCBjYXNlIGxldmVsIGNvbmZpZ3VyYXRpb24uXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0gXG4gICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVzXT1cImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIlxuICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgPC9jcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gXG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgPGNxYS1zdGVwLWJ1aWxkZXItYWN0aW9uXG4gICAgICBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXG4gICAgICBbY29tcHV0ZUh0bWxHcmFtbWFyRm5dPVwiY29tcHV0ZUh0bWxHcmFtbWFyRm5cIlxuICAgICAgW2NoYW5nZVRlbXBsYXRlU2lnbmFsXT1cIndoaWxlQ2hhbmdlVGVtcGxhdGVTaWduYWxcIlxuICAgICAgW2NhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsXT1cIndoaWxlQ2FuY2VsQ2hhbmdlVGVtcGxhdGVTaWduYWxcIlxuICAgICAgW3RlbXBsYXRlc109XCJ3aGlsZVRlbXBsYXRlc1wiXG4gICAgICBbc2V0VGVtcGxhdGVWYXJpYWJsZXNdPVwic2V0V2hpbGVUZW1wbGF0ZVZhcmlhYmxlc1wiXG4gICAgICBbc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc109XCJzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzXCJcbiAgICAgIFtlZGl0TW9kZV09XCJpc0VkaXRNb2RlXCJcbiAgICAgIFtpc0RlYnVnXT1cImlzRGVidWdcIlxuICAgICAgW2luaXRpYWxUZW1wbGF0ZV09XCJzZWxlY3RlZFdoaWxlVGVtcGxhdGVcIlxuICAgICAgW2luaXRpYWxEZXNjcmlwdGlvbl09XCJzZWxlY3RlZFdoaWxlRGVzY3JpcHRpb25cIlxuICAgICAgW2luaXRpYWxNZXRhZGF0YV09XCJzZWxlY3RlZFdoaWxlTWV0YWRhdGFcIlxuICAgICAgW3NlYXJjaFBsYWNlaG9sZGVyXT1cIndoaWxlU2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgW2VsZW1lbnRPcHRpb25zXT1cImVsZW1lbnRPcHRpb25zXCJcbiAgICAgIFtoYXNNb3JlRWxlbWVudHNdPVwiaGFzTW9yZUVsZW1lbnRzXCJcbiAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgIFtwYXJhbWV0ZXJPcHRpb25zXT1cInBhcmFtZXRlck9wdGlvbnNcIlxuICAgICAgW2hhc01vcmVQYXJhbWV0ZXJzXT1cImhhc01vcmVQYXJhbWV0ZXJzXCJcbiAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgW2Vudmlyb25tZW50T3B0aW9uc109XCJlbnZpcm9ubWVudE9wdGlvbnNcIlxuICAgICAgW2hhc01vcmVFbnZpcm9ubWVudHNdPVwiaGFzTW9yZUVudmlyb25tZW50c1wiXG4gICAgICBbaXNMb2FkaW5nRW52aXJvbm1lbnRzXT1cImlzTG9hZGluZ0Vudmlyb25tZW50c1wiXG4gICAgICBbZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkXT1cImRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZFwiXG4gICAgICBbZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XCJcbiAgICAgIFtkZWZhdWx0VGVzdERhdGFFbmRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFFbmRJbmRleFwiXG4gICAgICBbaXNJbnNpZGVGb3JMb29wU3RlcF09XCJpc0luc2lkZUZvckxvb3BTdGVwXCJcbiAgICAgIFtoYXNUZXN0RGF0YVByb2ZpbGVdPVwiaGFzVGVzdERhdGFQcm9maWxlXCJcbiAgICAgICh0ZW1wbGF0ZUNoYW5nZWQpPVwic2VsZWN0V2hpbGVUZW1wbGF0ZSgkZXZlbnQpXCJcbiAgICAgIChjYW5jZWxsZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICAoY3JlYXRlU3RlcCk9XCJjcmVhdGVXaGlsZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAoc2VhcmNoRWxlbWVudHMpPVwic2VhcmNoRWxlbWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSk9XCJzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoUGFyYW1ldGVycyk9XCJzZWFyY2hQYXJhbWV0ZXJzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChsb2FkTW9yZUVudmlyb25tZW50cyk9XCJsb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KClcIlxuICAgICAgKHJlZGlyZWN0VG9QYXJhbWV0ZXIpPVwicmVkaXJlY3RUb1BhcmFtZXRlci5lbWl0KClcIlxuICAgICAgKHJlZGlyZWN0VG9FbnZpcm9ubWVudCk9XCJyZWRpcmVjdFRvRW52aXJvbm1lbnQuZW1pdCgpXCJcbiAgICAgIChjYW5jZWxFbGVtZW50Rm9ybSk9XCJjYW5jZWxFbGVtZW50Rm9ybS5lbWl0KClcIj5cbiAgICA8L2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEFjdGlvbiBCdXR0b25zOiBBcHBseSBvbmx5IHdoZW4gaXNEZWJ1ZyArIGV4aXN0aW5nIHN0ZXAgKGlzRWRpdE1vZGUpLCBlbHNlIENyZWF0ZSBTdGVwIC0tPlxuICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1tdC02IGNxYS1wdC00IGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGNxYS1idXR0b25cbiAgICAgIGNsYXNzPVwiY3FhLXctMS8yXCJcbiAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICB0ZXh0PVwiQ2FuY2VsXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uICpuZ0lmPVwiIWlzQ3JlYXRpbmdTdGVwXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctMS8yXCJcbiAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgW3RleHRdPVwiaXNFZGl0TW9kZSA/ICdVcGRhdGUgU3RlcCcgOiAnQ3JlYXRlIFN0ZXAnXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGRpdiAqbmdJZj1cImlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzM4cHhdIGNxYS1yb3VuZGVkLVs4cHhdXCI+XG4gICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQ3JlYXRpbmfigKZcIiBpY29uPVwiYXV0b3JlbmV3XCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCIgc2l6ZT1cIm1lZGl1bVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|