@cqa-lib/cqa-ui 1.1.389 → 1.1.391
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/code-editor/code-editor.component.mjs +72 -21
- package/esm2020/lib/error-modal/error-modal.component.mjs +14 -5
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +18 -8
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +16 -6
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +2 -2
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +3 -3
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +116 -43
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +122 -43
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/code-editor/code-editor.component.d.ts +5 -0
- package/lib/error-modal/error-modal.component.d.ts +7 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -76,19 +76,29 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
76
76
|
return this.isDebug === true;
|
|
77
77
|
}
|
|
78
78
|
/** Per-step filtered three-dot menu options (e.g. hide Duplicate/Delete for step-group children). */
|
|
79
|
+
// get effectiveStepMoreMenuOptions(): StepMoreMenuOption[] {
|
|
80
|
+
// const base = this.stepMoreMenuOptions || [];
|
|
81
|
+
// // Always hide duplicate option for this container step
|
|
82
|
+
// let filtered = base.filter(opt => opt.id !== 'duplicate');
|
|
83
|
+
// const stepRef: any = this.step;
|
|
84
|
+
// if (!stepRef) return filtered;
|
|
85
|
+
// const isGroupChild = !!stepRef.isStepGroupChildren;
|
|
86
|
+
// // When step.stepMoreMenuOptions is truthy OR step is a step-group child, hide mutating items
|
|
87
|
+
// const suppressMutating = !!stepRef.stepMoreMenuOptions || isGroupChild;
|
|
88
|
+
// if (!suppressMutating) return filtered;
|
|
89
|
+
// return filtered.filter(opt => opt.id !== 'delete');
|
|
90
|
+
// }
|
|
79
91
|
get effectiveStepMoreMenuOptions() {
|
|
80
92
|
const base = this.stepMoreMenuOptions || [];
|
|
81
|
-
// Always hide duplicate option for this container step
|
|
82
|
-
let filtered = base.filter(opt => opt.id !== 'duplicate');
|
|
83
93
|
const stepRef = this.step;
|
|
84
94
|
if (!stepRef)
|
|
85
|
-
return
|
|
95
|
+
return base;
|
|
86
96
|
const isGroupChild = !!stepRef.isStepGroupChildren;
|
|
87
97
|
// When step.stepMoreMenuOptions is truthy OR step is a step-group child, hide mutating items
|
|
88
98
|
const suppressMutating = !!stepRef.stepMoreMenuOptions || isGroupChild;
|
|
89
99
|
if (!suppressMutating)
|
|
90
|
-
return
|
|
91
|
-
return
|
|
100
|
+
return base;
|
|
101
|
+
return base.filter(opt => opt.id !== 'duplicate' && opt.id !== 'delete');
|
|
92
102
|
}
|
|
93
103
|
/** True when this loop-step's own breakpoint is disabled (used to propagate parentSkipped to children). */
|
|
94
104
|
get selfDebugDisabled() {
|
|
@@ -1113,10 +1123,10 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
1113
1123
|
}
|
|
1114
1124
|
}
|
|
1115
1125
|
LoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LoopStepComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1116
|
-
LoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LoopStepComponent, selector: "cqa-loop-step", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", loopType: "loopType", iterations: "iterations", selectedIterationId: "selectedIterationId", defaultIteration: "defaultIteration", nestedSteps: "nestedSteps", showViewAllIterations: "showViewAllIterations", hasChild: "hasChild", isLive: "isLive", isLoading: "isLoading", stepDeleted: "stepDeleted", isDebug: "isDebug", debugPointSet: "debugPointSet", parentSkipped: "parentSkipped", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions", onExpandHandler: "onExpandHandler", onEditStepHandler: "onEditStepHandler", onAddStepOptionSelectHandler: "onAddStepOptionSelectHandler", onStepMoreOptionSelectHandler: "onStepMoreOptionSelectHandler", getAddStepMenuOptionsForNested: "getAddStepMenuOptionsForNested", getStepMoreMenuOptionsForNested: "getStepMoreMenuOptionsForNested", getConditionBranchesHandler: "getConditionBranchesHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", step: "step", failureDetails: "failureDetails", reasoning: "reasoning", confidence: "confidence", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selfHealAnalysis: "selfHealAnalysis", iterationData: "iterationData" }, outputs: { debugPointChange: "debugPointChange", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", addStepInsideLoop: "addStepInsideLoop", makeCurrentBaseline: "makeCurrentBaseline", uploadBaseline: "uploadBaseline", analyze: "analyze", viewFullLogs: "viewFullLogs", selfHealAction: "selfHealAction", onExpand: "onExpand", onViewAllIterations: "onViewAllIterations", onIterationChange: "onIterationChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, viewQueries: [{ propertyName: "addStepMenuTrigger", first: true, predicate: ["addStepMenuTrigger"], descendants: true }, { propertyName: "stepMoreMenuTrigger", first: true, predicate: ["stepMoreMenuTrigger"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"step.stepNumber || (stepNumber + '.' + (i + 1))\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only) -->\n <div *ngIf=\"isDebug\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n", components: [{ type: i1.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"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i4.AiLogsWithReasoningComponent, selector: "cqa-ai-logs-with-reasoning", inputs: ["status", "text", "description", "reasoning", "duration"] }, { type: i5.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step", "onExpandHandler", "getConditionBranchesHandler", "isStepLoadingHandler", "isStepExpandedHandler", "convertMsToSecondsHandler", "formatFailureDetailsHandler", "getSelfHealAnalysisHandler", "onMakeCurrentBaselineHandler", "onUploadBaselineHandler", "onAnalyzeHandler", "onViewFullLogsHandler", "onSelfHealActionHandler", "getSelfHealLoadingStatesHandler", "isUploadingBaseline", "isMakingCurrentBaseline", "selectedIterationId", "getLoopIterationsHandler", "getApiAssertionsHandler", "formatActionsHandler", "onViewAllIterationsHandler", "onConditionBranchClickHandler", "onStepClickHandler", "onJsonPathCopiedHandler", "onDownloadHandler", "onFilePathCopiedHandler", "onTextCopiedHandler", "jumpToTimestampHandler", "downloadingStepId", "isLive", "isDebug", "debugPointSet", "getDebugPointSetHandler", "onDebugPointChangeHandler", "onEditStepHandler", "addStepMenuOptions", "onAddStepOptionSelectHandler", "stepMoreMenuOptions", "onStepMoreOptionSelectHandler", "getAddStepMenuOptionsForNested", "getStepMoreMenuOptionsForNested", "stepNumber", "parentSkipped"], outputs: ["addStepOptionSelect", "stepMoreOptionSelect", "addStepInsideLoop", "componentReady"] }, { type: i6.SelfHealAnalysisComponent, selector: "cqa-self-heal-analysis", inputs: ["id", "originalLocator", "healedLocator", "confidence", "healMethod", "isLoadingAccept", "isLoadingModifyAccept"], outputs: ["action"] }, { type: i7.ViewMoreFailedStepButtonComponent, selector: "cqa-view-more-failed-step-button", inputs: ["timingBreakdown", "subSteps", "failureDetails", "isExpanded"], outputs: ["viewMoreClick"] }, { type: i8.UpdatedFailedStepComponent, selector: "cqa-updated-failed-step", inputs: ["timingBreakdown", "testStepResultId", "expanded", "subSteps", "failureDetails", "reasoning", "confidence", "isUploadingBaseline", "isMakingCurrentBaseline", "isLive"], outputs: ["makeCurrentBaseline", "uploadBaseline", "analyze", "viewFullLogs"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
|
|
1126
|
+
LoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LoopStepComponent, selector: "cqa-loop-step", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", loopType: "loopType", iterations: "iterations", selectedIterationId: "selectedIterationId", defaultIteration: "defaultIteration", nestedSteps: "nestedSteps", showViewAllIterations: "showViewAllIterations", hasChild: "hasChild", isLive: "isLive", isLoading: "isLoading", stepDeleted: "stepDeleted", isDebug: "isDebug", debugPointSet: "debugPointSet", parentSkipped: "parentSkipped", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions", onExpandHandler: "onExpandHandler", onEditStepHandler: "onEditStepHandler", onAddStepOptionSelectHandler: "onAddStepOptionSelectHandler", onStepMoreOptionSelectHandler: "onStepMoreOptionSelectHandler", getAddStepMenuOptionsForNested: "getAddStepMenuOptionsForNested", getStepMoreMenuOptionsForNested: "getStepMoreMenuOptionsForNested", getConditionBranchesHandler: "getConditionBranchesHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", step: "step", failureDetails: "failureDetails", reasoning: "reasoning", confidence: "confidence", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selfHealAnalysis: "selfHealAnalysis", iterationData: "iterationData" }, outputs: { debugPointChange: "debugPointChange", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", addStepInsideLoop: "addStepInsideLoop", makeCurrentBaseline: "makeCurrentBaseline", uploadBaseline: "uploadBaseline", analyze: "analyze", viewFullLogs: "viewFullLogs", selfHealAction: "selfHealAction", onExpand: "onExpand", onViewAllIterations: "onViewAllIterations", onIterationChange: "onIterationChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, viewQueries: [{ propertyName: "addStepMenuTrigger", first: true, predicate: ["addStepMenuTrigger"], descendants: true }, { propertyName: "stepMoreMenuTrigger", first: true, predicate: ["stepMoreMenuTrigger"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"step.stepNumber || (stepNumber + '.' + (i + 1))\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only, hidden inside step groups) -->\n <div *ngIf=\"isDebug && !step?.isStepGroupChildren\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n", components: [{ type: i1.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"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i4.AiLogsWithReasoningComponent, selector: "cqa-ai-logs-with-reasoning", inputs: ["status", "text", "description", "reasoning", "duration"] }, { type: i5.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step", "onExpandHandler", "getConditionBranchesHandler", "isStepLoadingHandler", "isStepExpandedHandler", "convertMsToSecondsHandler", "formatFailureDetailsHandler", "getSelfHealAnalysisHandler", "onMakeCurrentBaselineHandler", "onUploadBaselineHandler", "onAnalyzeHandler", "onViewFullLogsHandler", "onSelfHealActionHandler", "getSelfHealLoadingStatesHandler", "isUploadingBaseline", "isMakingCurrentBaseline", "selectedIterationId", "getLoopIterationsHandler", "getApiAssertionsHandler", "formatActionsHandler", "onViewAllIterationsHandler", "onConditionBranchClickHandler", "onStepClickHandler", "onJsonPathCopiedHandler", "onDownloadHandler", "onFilePathCopiedHandler", "onTextCopiedHandler", "jumpToTimestampHandler", "downloadingStepId", "isLive", "isDebug", "debugPointSet", "getDebugPointSetHandler", "onDebugPointChangeHandler", "onEditStepHandler", "addStepMenuOptions", "onAddStepOptionSelectHandler", "stepMoreMenuOptions", "onStepMoreOptionSelectHandler", "getAddStepMenuOptionsForNested", "getStepMoreMenuOptionsForNested", "stepNumber", "parentSkipped"], outputs: ["addStepOptionSelect", "stepMoreOptionSelect", "addStepInsideLoop", "componentReady"] }, { type: i6.SelfHealAnalysisComponent, selector: "cqa-self-heal-analysis", inputs: ["id", "originalLocator", "healedLocator", "confidence", "healMethod", "isLoadingAccept", "isLoadingModifyAccept"], outputs: ["action"] }, { type: i7.ViewMoreFailedStepButtonComponent, selector: "cqa-view-more-failed-step-button", inputs: ["timingBreakdown", "subSteps", "failureDetails", "isExpanded"], outputs: ["viewMoreClick"] }, { type: i8.UpdatedFailedStepComponent, selector: "cqa-updated-failed-step", inputs: ["timingBreakdown", "testStepResultId", "expanded", "subSteps", "failureDetails", "reasoning", "confidence", "isUploadingBaseline", "isMakingCurrentBaseline", "isLive"], outputs: ["makeCurrentBaseline", "uploadBaseline", "analyze", "viewFullLogs"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
|
|
1117
1127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LoopStepComponent, decorators: [{
|
|
1118
1128
|
type: Component,
|
|
1119
|
-
args: [{ selector: 'cqa-loop-step', host: { class: 'cqa-ui-root cqa-w-full' }, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"step.stepNumber || (stepNumber + '.' + (i + 1))\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only) -->\n <div *ngIf=\"isDebug\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n" }]
|
|
1129
|
+
args: [{ selector: 'cqa-loop-step', host: { class: 'cqa-ui-root cqa-w-full' }, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"step.stepNumber || (stepNumber + '.' + (i + 1))\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only, hidden inside step groups) -->\n <div *ngIf=\"isDebug && !step?.isStepGroupChildren\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n" }]
|
|
1120
1130
|
}], propDecorators: { id: [{
|
|
1121
1131
|
type: Input
|
|
1122
1132
|
}], testStepResultId: [{
|
|
@@ -1276,4 +1286,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1276
1286
|
}], onIterationChange: [{
|
|
1277
1287
|
type: Output
|
|
1278
1288
|
}] } });
|
|
1279
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXVELFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFFM0osT0FBTyxFQUE0Tiw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2VixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVEzRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsaUJBQWlCO0lBTHhEOztRQWtCVyxxQkFBZ0IsR0FBc0IsTUFBTSxDQUFDO1FBSTdDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFhLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUcvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQy9DLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3hFLHVKQUF1SjtRQUM3SSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzdDLHVCQUFrQixHQUF3Qiw2QkFBNkIsQ0FBQztRQUN4RSx3QkFBbUIsR0FBeUIsOEJBQThCLENBQUM7UUFxQzNF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dUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFlRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUkwQixrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBOEJ0QixRQUFRO3NCQUFqQixNQUFNO2dCQUdHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IExvb3BTdGVwQ29uZmlnLCBMb29wSXRlcmF0aW9uLCBFeGVjdXRpb25TdGVwQ29uZmlnLCBTdGVwU3RhdHVzLCBUaW1pbmdCcmVha2Rvd24sIEZhaWx1cmVEZXRhaWxzLCBTdWJTdGVwLCBTZWxmSGVhbEFuYWx5c2lzRGF0YSwgU2VsZkhlYWxBY3Rpb24sIFN0ZXBHcm91cENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBTZWxmSGVhbEFjdGlvbkV2ZW50LCBBZGRTdGVwTWVudU9wdGlvbiwgREVGQVVMVF9BRERfU1RFUF9NRU5VX09QVElPTlMsIFN0ZXBNb3JlTWVudU9wdGlvbiwgREVGQVVMVF9TVEVQX01PUkVfTUVOVV9PUFRJT05TIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJhc2VTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1zdGVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQsIHVwbG9hZEJhc2VsaW5lRXZlbnQgfSBmcm9tICcuLi92aXN1YWwtY29tcGFyaXNvbi92aXN1YWwtY29tcGFyaXNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtdy1mdWxsJyB9XG59KVxuZXhwb3J0IGNsYXNzIExvb3BTdGVwQ29tcG9uZW50IGV4dGVuZHMgQmFzZVN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBEb0NoZWNrIHtcbiAgLy8gSW5kaXZpZHVhbCBpbnB1dHNcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRlc3RTdGVwUmVzdWx0SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGF0dXMhOiBTdGVwU3RhdHVzO1xuICBASW5wdXQoKSBkdXJhdGlvbiE6IG51bWJlcjtcbiAgQElucHV0KCkgdGltaW5nQnJlYWtkb3duPzogVGltaW5nQnJlYWtkb3duO1xuICBASW5wdXQoKSBleHBhbmRlZD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxvb3BUeXBlPzogJ2ZvcicgfCAnd2hpbGUnO1xuICBASW5wdXQoKSBpdGVyYXRpb25zITogTG9vcEl0ZXJhdGlvbltdO1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0SXRlcmF0aW9uPzogJ2ZpcnN0JyB8ICdsYXN0JyA9ICdsYXN0JztcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM/OiBFeGVjdXRpb25TdGVwQ29uZmlnW107XG4gIEBJbnB1dCgpIHNob3dWaWV3QWxsSXRlcmF0aW9ucz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGhhc0NoaWxkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN0ZXBEZWxldGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNEZWJ1Zz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVidWdQb2ludFNldD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcGFyZW50U2tpcHBlZD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ2V0RGVidWdQb2ludFNldEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCB2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgQE91dHB1dCgpIGRlYnVnUG9pbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBlZGl0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFkZFN0ZXBNZW51T3B0aW9uPigpO1xuICBAT3V0cHV0KCkgc3RlcE1vcmVPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNb3JlTWVudU9wdGlvbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBcIisgQWRkIHN0ZXAgaW5zaWRlIGxvb3BcIiAoZGVidWcgb25seSkuIFBheWxvYWQgaXMgdGhlIGxvb3Agc3RlcCBzbyBwYXJlbnQgY2FuIG9wZW4gQWRkIFN0ZXAgbW9kYWwgYXQgYW55IG5lc3RpbmcgbGV2ZWwuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwSW5zaWRlTG9vcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBhZGRTdGVwTWVudU9wdGlvbnM6IEFkZFN0ZXBNZW51T3B0aW9uW10gPSBERUZBVUxUX0FERF9TVEVQX01FTlVfT1BUSU9OUztcbiAgQElucHV0KCkgc3RlcE1vcmVNZW51T3B0aW9uczogU3RlcE1vcmVNZW51T3B0aW9uW10gPSBERUZBVUxUX1NURVBfTU9SRV9NRU5VX09QVElPTlM7XG5cbiAgLy8gSGFuZGxlciBmdW5jdGlvbiB0byBwYXNzIGRvd24gdG8gbmVzdGVkIGNoaWxkIHN0ZXAgZ3JvdXBzIGZvciByZWN1cnNpdmUgZXhwYW5zaW9uXG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgcGFzc2VkIHRvIG5lc3RlZCBzdGVwLXJlbmRlcmVyIHNvIEVkaXQgb24gbmVzdGVkIHN0ZXBzIGlzIGZvcndhcmRlZCB3aXRoIHRoZSBzdGVwIGNvbmZpZy4gKi9cbiAgQElucHV0KCkgb25FZGl0U3RlcEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXI/OiAob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24sIHN0ZXA/OiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlZCB0byBnZXQgYWRkLXN0ZXAgbWVudSBvcHRpb25zIHBlciBuZXN0ZWQgc3RlcDsgb3RoZXJ3aXNlIGFkZFN0ZXBNZW51T3B0aW9ucyBpcyB1c2VkIGZvciBhbGwuICovXG4gIEBJbnB1dCgpIGdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBBZGRTdGVwTWVudU9wdGlvbltdO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlZCB0byBnZXQgc3RlcC1tb3JlIG1lbnUgb3B0aW9ucyBwZXIgbmVzdGVkIHN0ZXA7IG90aGVyd2lzZSBzdGVwTW9yZU1lbnVPcHRpb25zIGlzIHVzZWQgZm9yIGFsbC4gKi9cbiAgQElucHV0KCkgZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcblxuICAvLyBIYW5kbGVyIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIHN0ZXBzXG4gIEBJbnB1dCgpIGdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBDb25kaXRpb25CcmFuY2hbXTtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI/OiAoKSA9PiB7IGlzTG9hZGluZ0FjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07IGlzTG9hZGluZ01vZGlmeUFjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfTtcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBnZXRBcGlBc3NlcnRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZm9ybWF0QWN0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3RlcENsaWNrSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBldmVudD86IEV2ZW50KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogJ3JlcXVlc3RCb2R5JyB8ICdyZXNwb25zZUJvZHknIHwgJ3JlcXVlc3RIZWFkZXJzJyB8ICdyZXNwb25zZUhlYWRlcnMnIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRG93bmxvYWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVOYW1lOiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBmaWxlVHlwZTogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25GaWxlUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVGV4dENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgdGV4dDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkganVtcFRvVGltZXN0YW1wSGFuZGxlcj86ICh0aW1lc3RhbXA6IG51bWJlciwgdGVzdFN0ZXBJZD86IG51bWJlciB8IHN0cmluZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZG93bmxvYWRpbmdTdGVwSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzdGVwPzogYW55O1xuICBnZXQgc3RlcEJhZGdlcygpOiAoJ3NraXBwZWQnIHwgJ2VkaXRlZCcgfCAnYWRkZWQnIHwgJ3JlbW92ZWQnKVtdIHtcbiAgICBjb25zdCBiYWRnZSA9IHRoaXMuc3RlcD8uc3RlcEJhZGdlO1xuICAgIGlmICghYmFkZ2UpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShiYWRnZSkgPyBiYWRnZSA6IFtiYWRnZV07XG4gIH1cblxuICBnZXQgaXNTa2lwcGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBCYWRnZXMuaW5jbHVkZXMoJ3NraXBwZWQnKTtcbiAgfVxuXG4gIGdldCBpc1N0ZXBEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBCYWRnZXMuaW5jbHVkZXMoJ3JlbW92ZWQnKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGZhaWx1cmVEZXRhaWxzPzogRmFpbHVyZURldGFpbHM7XG4gIEBJbnB1dCgpIHJlYXNvbmluZz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBjb25maWRlbmNlPzogc3RyaW5nO1xuICBASW5wdXQoKSBpc1VwbG9hZGluZ0Jhc2VsaW5lID0ge307XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lID0ge307XG4gIEBJbnB1dCgpIHNlbGZIZWFsQW5hbHlzaXM/OiBTZWxmSGVhbEFuYWx5c2lzRGF0YTtcbiAgQElucHV0KCkgaXRlcmF0aW9uRGF0YT86IGFueTtcbiAgQE91dHB1dCgpIG1ha2VDdXJyZW50QmFzZWxpbmUgPSBuZXcgRXZlbnRFbWl0dGVyPG1ha2VDdXJyZW50QmFzZWxpbmVFdmVudD4oKTtcbiAgQE91dHB1dCgpIHVwbG9hZEJhc2VsaW5lID0gbmV3IEV2ZW50RW1pdHRlcjx1cGxvYWRCYXNlbGluZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgYW5hbHl6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdGdWxsTG9ncyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlbGZIZWFsQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxmSGVhbEFjdGlvbkV2ZW50PigpO1xuXG4gIHNob3dGYWlsZWRTdGVwRGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2FkZFN0ZXBNZW51VHJpZ2dlcicpIGFkZFN0ZXBNZW51VHJpZ2dlcj86IE1hdE1lbnVUcmlnZ2VyO1xuICBAVmlld0NoaWxkKCdzdGVwTW9yZU1lbnVUcmlnZ2VyJykgc3RlcE1vcmVNZW51VHJpZ2dlcj86IE1hdE1lbnVUcmlnZ2VyO1xuXG4gIC8qKiBTaG93IGRlYnVnIGljb24gd2hlbiBkZWJ1ZyBtb2RlIGlzIG9uIChzaG93biBvbiBwYXJlbnQgYW5kIGFsbCBjaGlsZCBzdGVwcykuICovXG4gIGdldCBzaG93RGVidWdJY29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVidWcgPT09IHRydWU7XG4gIH1cblxuICAvKiogUGVyLXN0ZXAgZmlsdGVyZWQgdGhyZWUtZG90IG1lbnUgb3B0aW9ucyAoZS5nLiBoaWRlIER1cGxpY2F0ZS9EZWxldGUgZm9yIHN0ZXAtZ3JvdXAgY2hpbGRyZW4pLiAqL1xuICBnZXQgZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9ucygpOiBTdGVwTW9yZU1lbnVPcHRpb25bXSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyB8fCBbXTtcbiAgICAvLyBBbHdheXMgaGlkZSBkdXBsaWNhdGUgb3B0aW9uIGZvciB0aGlzIGNvbnRhaW5lciBzdGVwXG4gICAgbGV0IGZpbHRlcmVkID0gYmFzZS5maWx0ZXIob3B0ID0+IG9wdC5pZCAhPT0gJ2R1cGxpY2F0ZScpO1xuICAgIFxuICAgIGNvbnN0IHN0ZXBSZWY6IGFueSA9IHRoaXMuc3RlcDtcbiAgICBpZiAoIXN0ZXBSZWYpIHJldHVybiBmaWx0ZXJlZDtcblxuICAgIGNvbnN0IGlzR3JvdXBDaGlsZCA9ICEhc3RlcFJlZi5pc1N0ZXBHcm91cENoaWxkcmVuO1xuICAgIC8vIFdoZW4gc3RlcC5zdGVwTW9yZU1lbnVPcHRpb25zIGlzIHRydXRoeSBPUiBzdGVwIGlzIGEgc3RlcC1ncm91cCBjaGlsZCwgaGlkZSBtdXRhdGluZyBpdGVtc1xuICAgIGNvbnN0IHN1cHByZXNzTXV0YXRpbmcgPSAhIXN0ZXBSZWYuc3RlcE1vcmVNZW51T3B0aW9ucyB8fCBpc0dyb3VwQ2hpbGQ7XG4gICAgaWYgKCFzdXBwcmVzc011dGF0aW5nKSByZXR1cm4gZmlsdGVyZWQ7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQuZmlsdGVyKG9wdCA9PiBvcHQuaWQgIT09ICdkZWxldGUnKTtcbiAgfVxuICBcbiAgLyoqIFRydWUgd2hlbiB0aGlzIGxvb3Atc3RlcCdzIG93biBicmVha3BvaW50IGlzIGRpc2FibGVkICh1c2VkIHRvIHByb3BhZ2F0ZSBwYXJlbnRTa2lwcGVkIHRvIGNoaWxkcmVuKS4gKi9cbiAgZ2V0IHNlbGZEZWJ1Z0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnN0ZXAgYXMgYW55KT8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhdGhpcy5wYXJlbnRTa2lwcGVkIHx8IHRoaXMuaXNTdGVwRGVsZXRlZDtcbiAgfVxuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiB0aGUgbG9vcCBzdGVwIGV4cGFuZHNcbiAgQE91dHB1dCgpIG9uRXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiBcIlZpZXcgYWxsIGl0ZXJhdGlvbnNcIiBpcyBjbGlja2VkXG4gIEBPdXRwdXQoKSBvblZpZXdBbGxJdGVyYXRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiBpdGVyYXRpb24gc2VsZWN0aW9uIGNoYW5nZXNcbiAgQE91dHB1dCgpIG9uSXRlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLy8gQ29uZmlnIHByb3BlcnR5IGZvciBiYXNlIGNsYXNzIC0gYnVpbHQgZnJvbSBpbmRpdmlkdWFsIGlucHV0cyBpbiBuZ09uSW5pdFxuICBvdmVycmlkZSBjb25maWchOiBMb29wU3RlcENvbmZpZztcblxuICBzZWxlY3RlZEl0ZXJhdGlvbjogTG9vcEl0ZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdXNlcidzIG1hbnVhbCBzZWxlY3Rpb25cbiAgcHJpdmF0ZSBwcmV2aW91c1N0YXR1cz86IFN0ZXBTdGF0dXM7XG4gIHByaXZhdGUgdXNlck1hbnVhbGx5Q2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIFRyYWNrIHdoaWNoIHN0ZXBzIGFyZSBzdGlsbCBsb2FkaW5nIHRvIHNob3cgc2tlbGV0b25cbiAgbG9hZGluZ1N0ZXBzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBQcm9jZXNzZWQgc3ViLXN0ZXBzIGZvciBsaXZlIG1vZGUgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gZ3JvdXBpbmdcbiAgcHJvY2Vzc2VkU3ViU3RlcHM6IGFueVtdID0gW107XG4gIHByaXZhdGUgbGFzdFByb2Nlc3NlZEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHdhaXRMb2NhdG9yR3JvdXBFbnRyeTogYW55IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY291bnRkb3duSW50ZXJ2YWxJZDogYW55ID0gbnVsbDtcblxuICAvLyBBSV9BVVRPX0hFQUwgZ3JvdXBpbmc6IHNob3cgbG9hZGluZyB1bnRpbCBBSV9BVVRPX0hFQUxfU1VDQ0VTUyBvciBBSV9BVVRPX0hFQUxfRkFJTEVEXG4gIHByaXZhdGUgYWlBdXRvSGVhbEdyb3VwRW50cnk6IGFueSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NlZCBzdWItc3RlcHMgZm9yIHJ1biByZXN1bHQgc2NyZWVuIChmaWx0ZXIgYW5kIHNwbGl0IEFJX0FVVE9fSEVBTF9TVUNDRVNTL0ZBSUxFRClcbiAgcHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQ6IGFueVtdID0gW107XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQnVpbGQgY29uZmlnIGZyb20gaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAvLyBVc2UgbmVzdGVkU3RlcHMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gZW1wdHkgYXJyYXlcbiAgICBjb25zdCBzdGVwc1RvVXNlID0gdGhpcy5uZXN0ZWRTdGVwcyB8fCBbXTtcblxuICAgIC8vIFVzZSBhY3Rpb24gYXMgZmFsbGJhY2sgZm9yIHRpdGxlIGlmIHRpdGxlIGlzIGVtcHR5XG4gICAgLy8gQ2hlY2sgYm90aCBpbnN0YW5jZSBwcm9wZXJ0eSBhbmQgY29uZmlnIGZvciBhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25WYWx1ZSA9ICh0aGlzIGFzIGFueSkuYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHN0ZXBUaXRsZSA9ICh0aGlzLnRpdGxlICYmIHRoaXMudGl0bGUudHJpbSgpKSA/IHRoaXMudGl0bGUgOiBhY3Rpb25WYWx1ZTtcblxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0ZXN0U3RlcElkOiB0aGlzLnN0ZXA/LnRlc3RTdGVwSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgdGVzdFN0ZXBSZXN1bHRJZDogdGhpcy50ZXN0U3RlcFJlc3VsdElkLFxuICAgICAgc3RlcE51bWJlcjogdGhpcy5zdGVwTnVtYmVyLFxuICAgICAgdGl0bGU6IHN0ZXBUaXRsZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIGRpc3BsYXlUeXBlOiAnbG9vcCcsXG4gICAgICBsb29wVHlwZTogdGhpcy5sb29wVHlwZSxcbiAgICAgIGl0ZXJhdGlvbnM6IHRoaXMuaXRlcmF0aW9ucyxcbiAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgIGRlZmF1bHRJdGVyYXRpb246IHRoaXMuZGVmYXVsdEl0ZXJhdGlvbixcbiAgICAgIG5lc3RlZFN0ZXBzOiBzdGVwc1RvVXNlLFxuICAgICAgc3RlcERlbGV0ZWQ6IHRoaXMuc3RlcERlbGV0ZWQsXG4gICAgICBzaG93Vmlld0FsbEl0ZXJhdGlvbnM6IHRoaXMuc2hvd1ZpZXdBbGxJdGVyYXRpb25zLFxuICAgICAgdGltaW5nQnJlYWtkb3duOiB0aGlzLnRpbWluZ0JyZWFrZG93bixcbiAgICAgIGV4cGFuZGVkOiB0aGlzLmV4cGFuZGVkLFxuICAgIH0gYXMgTG9vcFN0ZXBDb25maWc7XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBsaXZlIHN1Yi1zdGVwIHByb2Nlc3NpbmcgZm9yIFdBSVRfRk9SX0xPQ0FUT1IgZ3JvdXBpbmdcbiAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUHJvY2VzcyBmb3IgcnVuIHJlc3VsdCBzY3JlZW46IGZpbHRlciBhbmQgc3BsaXQgQUlfQVVUT19IRUFMX1NVQ0NFU1MvRkFJTEVEXG4gICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgc2VsZWN0aW9uIC0gcHJpb3JpdGl6ZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0LCB0aGVuIGRlZmF1bHRcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICYmIHRoaXMuaXRlcmF0aW9ucyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgLy8gSWYgZGVmYXVsdEl0ZXJhdGlvbiBpcyAnbGFzdCcsIGFsc28gc2V0IHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHRvIHRoZSBsYXN0IGl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIGlmIGFscmVhZHkgZXhwYW5kZWRcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkICYmIHRoaXMubmVzdGVkU3RlcHMgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICAgICAgaWYgKHN0ZXBJZCkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmFkZChTdHJpbmcoc3RlcElkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiB0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgIC8vIEFsd2F5cyB1cGRhdGUgd2hlbiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZXMgZnJvbSBwYXJlbnRcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBub3QgZm91bmQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiB3aGVuIGl0ZXJhdGlvbnMgYXJyYXkgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydpdGVyYXRpb25zJ10gJiYgdGhpcy5pdGVyYXRpb25zICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlciBzZWxlY3Rpb24sIHRyeSB0byBwcmVzZXJ2ZSBpdFxuICAgICAgaWYgKHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gY2hhbmdlc1xuICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlciBzZWxlY3Rpb24gbm8gbG9uZ2VyIHZhbGlkLCB1c2Ugc2VsZWN0ZWRJdGVyYXRpb25JZCBvciBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRCeUlkID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kQnlJZCkge1xuICAgICAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZEJ5SWQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmRCeUlkO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuaXRlcmF0aW9ucy5zb21lKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbj8uaWQpKSB7XG4gICAgICAgIC8vIE5vIHVzZXIgc2VsZWN0aW9uLCB1c2Ugc2VsZWN0ZWRJdGVyYXRpb25JZCBvciBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBVcGRhdGUgdGl0bGUgaWYgaXQgY2hhbmdlcyAtIGFsc28gY2hlY2sgZm9yIGFjdGlvbiBpbiBjb25maWcgb3IgaW5zdGFuY2VcbiAgICBpZiAoY2hhbmdlc1sndGl0bGUnXSkge1xuICAgICAgY29uc3QgYWN0aW9uVmFsdWUgPSAodGhpcyBhcyBhbnkpLmFjdGlvbiB8fCAodGhpcy5jb25maWcgYXMgYW55KT8uYWN0aW9uIHx8ICcnO1xuICAgICAgY29uc3Qgc3RlcFRpdGxlID0gKHRoaXMudGl0bGUgJiYgdGhpcy50aXRsZS50cmltKCkpID8gdGhpcy50aXRsZSA6IGFjdGlvblZhbHVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnRpdGxlID0gc3RlcFRpdGxlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoY2hhbmdlc1snZHVyYXRpb24nXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuZHVyYXRpb24gPSBjaGFuZ2VzWydkdXJhdGlvbiddLmN1cnJlbnRWYWx1ZSB8fCAwO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydzdGVwRGVsZXRlZCddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zdGVwRGVsZXRlZCA9IGNoYW5nZXNbJ3N0ZXBEZWxldGVkJ10uY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLnN0ZXBOdW1iZXIgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydleHBhbmRlZCddICYmIHRoaXMuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5sb2coJ2V4cGFuZGVkIGNoYW5nZWQgaW4gbG9vcC1zdGVwJywgdGhpcy5pZCwgY2hhbmdlc1snZXhwYW5kZWQnXSk7XG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHdoZW4gaW5wdXRzIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzWydpdGVyYXRpb25zJ10gfHwgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddIHx8IGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10pIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5pdGVyYXRpb25zID0gdGhpcy5pdGVyYXRpb25zO1xuICAgICAgICB0aGlzLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIHdoZW4gbmVzdGVkIHN0ZXBzIGFyZSBhZGRlZCBhbmQgc3RlcCBpcyBleHBhbmRlZFxuICAgIC8vIGlmIChjaGFuZ2VzWyduZXN0ZWRTdGVwcyddICYmIHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgIC8vICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAvLyAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAvLyAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgLy8gICAgIGlmIChzdGVwSWQpIHtcbiAgICAvLyAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgaWYgYWxyZWFkeSBleHBhbmRlZCB3aGVuIGNvbXBvbmVudCBpbml0aWFsaXplc1xuICAgIGlmIChjaGFuZ2VzWydleHBhbmRlZCddICYmIHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgICAgIGlmIChzdGVwSWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIGhhbmRsZSB3aGVuIG5lc3RlZFN0ZXBzIGlzIHBhc3NlZCB2aWEgY2hpbGRyZW4gcHJvcGVydHkgKGZvciBzdGVwLXJlbmRlcmVyIGNvbXBhdGliaWxpdHkpXG4gICAgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10gJiYgdGhpcy5uZXN0ZWRTdGVwcykge1xuICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyB1cGRhdGVkIHdpdGggbmVzdGVkU3RlcHNcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbmVzdGVkU3RlcHMgaXMgbm90IHByb3ZpZGVkIGJ1dCBjaGlsZHJlbiBpcyAoZnJvbSBzdGVwLXJlbmRlcmVyKSwgdXNlIGNoaWxkcmVuXG4gICAgaWYgKCF0aGlzLm5lc3RlZFN0ZXBzICYmICh0aGlzLmNvbmZpZyBhcyBhbnkpLmNoaWxkcmVuICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuY29uZmlnIGFzIGFueSkuY2hpbGRyZW4pKSB7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gKHRoaXMuY29uZmlnIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcubmVzdGVkU3RlcHMgPSB0aGlzLm5lc3RlZFN0ZXBzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTGl2ZSkge1xuICAgICAgLy8gVXBkYXRlIHN1YlN0ZXBzIGFycmF5IHdoZW4gbmV3IG9uZXMgYXJlIGFkZGVkXG4gICAgICBpZiAoY2hhbmdlc1snbmVzdGVkU3RlcHMnXSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzQ291bnQgPSBjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLnByZXZpb3VzVmFsdWU/Lmxlbmd0aCB8fCAwO1xuICAgICAgICBjb25zdCBjdXJyZW50U3ViU3RlcHNDb3VudCA9ICh0aGlzLm5lc3RlZFN0ZXBzIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgICAgLy8gU3ViLXN0ZXBzIGFyZSBhcHBlbmRlZCBleHRlcm5hbGx5LCBzbyB3ZSBqdXN0IHVwZGF0ZSB0aGUgY29uZmlnXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzID0gdGhpcy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQXV0by1leHBhbmQgaWYgc3RlcCBpcyBydW5uaW5nIGFuZCBuZXcgc3ViU3RlcHMgYXJlIGFkZGVkIChsb2dzIGNvbWluZyBpbilcbiAgICAgICAgaWYgKCFjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLmZpcnN0Q2hhbmdlICYmIFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJiBcbiAgICAgICAgICAgIGN1cnJlbnRTdWJTdGVwc0NvdW50ID4gcHJldmlvdXNTdWJTdGVwc0NvdW50ICYmXG4gICAgICAgICAgICB0aGlzLmhhc1N1YlN0ZXBzICYmIFxuICAgICAgICAgICAgIXRoaXMuaXNFeHBhbmRlZCAmJiBcbiAgICAgICAgICAgICF0aGlzLnVzZXJNYW51YWxseUNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuYXV0b0V4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdGF0dXMgY2hhbmdlcyAtIGF1dG8tZXhwYW5kIHdoZW4gc3RlcCBzdGFydHMgZXhlY3V0aW5nXG4gICAgICBpZiAoY2hhbmdlc1snc3RhdHVzJ10gJiYgIWNoYW5nZXNbJ3N0YXR1cyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IGNoYW5nZXNbJ3N0YXR1cyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgY29uc3Qgb2xkU3RhdHVzID0gY2hhbmdlc1snc3RhdHVzJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBdXRvLWV4cGFuZCB3aGVuIHN0YXR1cyBjaGFuZ2VzIHRvICdydW5uaW5nJyBhbmQgaGFzIHN1YlN0ZXBzIChvciB3aWxsIGhhdmUgc29vbilcbiAgICAgICAgaWYgKG5ld1N0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIG9sZFN0YXR1cyAhPT0gJ3J1bm5pbmcnICYmICF0aGlzLnVzZXJNYW51YWxseUNsb3NlZCkge1xuICAgICAgICAgIC8vIEV4cGFuZCBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGhhcyBzdWJTdGVwcywgb3Igd2FpdCBmb3IgdGhlbVxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlN0ZXBzKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9FeHBhbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZXZpb3VzU3RhdHVzID0gbmV3U3RhdHVzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXV0b0V4cGFuZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmhhc1N1YlN0ZXBzKSB7XG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy51c2VyTWFudWFsbHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaGFzU3ViU3RlcHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBvdmVycmlkZSB0b2dnbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzRXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQ7XG4gICAgc3VwZXIudG9nZ2xlKCk7XG4gICAgLy8gRW1pdCBldmVudCB3aGVuIGV4cGFuZGluZyAodHJhbnNpdGlvbmluZyBmcm9tIGNvbGxhcHNlZCB0byBleHBhbmRlZClcbiAgICBpZiAoIXdhc0V4cGFuZGVkICYmIHRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5vbkV4cGFuZC5lbWl0KCk7XG4gICAgICAvLyBJZiB0aGlzIHN0ZXAgaGFzIGNoaWxkcmVuIChoYXNDaGlsZCBpcyB0cnVlKSBhbmQgb25FeHBhbmRIYW5kbGVyIGlzIHByb3ZpZGVkLCBjYWxsIGl0IHRvIGZldGNoIGNoaWxkcmVuXG4gICAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIgJiYgdGhpcy5jb25maWcgJiYgdGhpcy5oYXNDaGlsZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzdGVwIGNvbmZpZyBvYmplY3QgZm9yIHRoZSBoYW5kbGVyIHdpdGggaGFzQ2hpbGQgcHJvcGVydHlcbiAgICAgICAgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICAgICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgICAgICBoYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICBleHBhbmRlZDogdHJ1ZSwgLy8gRW5zdXJlIGV4cGFuZGVkIGlzIHNldFxuICAgICAgICAgIHRlc3RTdGVwVHlwZTogKHRoaXMuY29uZmlnIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8ICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1JfTE9PUCcgOiAnV0hJTEVfTE9PUCcpLFxuICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBbXSxcbiAgICAgICAgICB0ZXN0U3RlcFJlc3VsdElkOiB0aGlzLnRlc3RTdGVwUmVzdWx0SWQsXG4gICAgICAgICAgaWQ6IHRoaXMuaWRcbiAgICAgICAgfSBhcyBFeGVjdXRpb25TdGVwQ29uZmlnICYgeyBoYXNDaGlsZDogYm9vbGVhbjsgdGVzdFN0ZXBUeXBlPzogc3RyaW5nOyBjaGlsZHJlbj86IGFueVtdOyBleHBhbmRlZD86IGJvb2xlYW4gfTtcbiAgICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcENvbmZpZyk7XG4gICAgICB9XG4gICAgICAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgZm9yIGFsbCBuZXN0ZWQgc3RlcHNcbiAgICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgICAgICAgaWYgKHN0ZXBJZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuYWRkKFN0cmluZyhzdGVwSWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgLy8gQ2xlYXIgbG9hZGluZyBzdGF0ZSB3aGVuIGNvbGxhcHNpbmdcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGV4cGFuZGVkIHN0YXRlIGlzIHN5bmNlZCB3aXRoIGNvbmZpZ1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuZXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSBzdGVwIGlzIHN0aWxsIGxvYWRpbmdcbiAgaXNOZXN0ZWRTdGVwTG9hZGluZyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgcmV0dXJuIHN0ZXBJZCA/IHRoaXMubG9hZGluZ1N0ZXBzLmhhcyhTdHJpbmcoc3RlcElkKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIE1hcmsgYSBzdGVwIGFzIGxvYWRlZCAoY2FsbGVkIHdoZW4gc3RlcC1yZW5kZXJlciBpcyByZWFkeSlcbiAgbWFya1N0ZXBMb2FkZWQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgIGlmIChzdGVwSWQpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmRlbGV0ZShTdHJpbmcoc3RlcElkKSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpOiB2b2lkIHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIHVzZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChcbiAgICAgICAgaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgICk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB1c2VyIGhhcyBtYW51YWxseSBzZWxlY3RlZCBzb21ldGhpbmcsIHByZXNlcnZlIGl0XG4gICAgaWYgKHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBpcyBzZWxlY3RlZFxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgYmFzZWQgb24gZGVmYXVsdEl0ZXJhdGlvbiBzZXR0aW5nXG4gICAgaWYgKHRoaXMuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0SXRlcmF0aW9uID0gdGhpcy5pdGVyYXRpb25zW3RoaXMuaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBsYXN0SXRlcmF0aW9uLmlkKSB7XG4gICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGxhc3RJdGVyYXRpb247XG4gICAgICAvLyBTZXQgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gdHJhY2sgdGhlIGRlZmF1bHQgc2VsZWN0aW9uXG4gICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdEl0ZXJhdGlvbiA9IHRoaXMuaXRlcmF0aW9uc1swXTtcbiAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmaXJzdEl0ZXJhdGlvbi5pZCkge1xuICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmaXJzdEl0ZXJhdGlvbjtcbiAgICAgIC8vIFNldCB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB0byB0cmFjayB0aGUgZGVmYXVsdCBzZWxlY3Rpb25cbiAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSBmaXJzdEl0ZXJhdGlvbi5pZDtcbiAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVJdGVyYXRpb25DaGFuZ2UoaXRlcmF0aW9uOiBMb29wSXRlcmF0aW9uKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJJVEVSQVRJT04gQ0hBTkdFXCIsIHRoaXMuY29uZmlnICxpdGVyYXRpb24pXG4gICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyBpdGVyYXRpb25zXG4gICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gaXRlcmF0aW9uLmlkKSB7XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG4gICAgLy8gU3RvcmUgdGhlIHVzZXIncyBtYW51YWwgc2VsZWN0aW9uXG4gICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbjtcbiAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gaXRlcmF0aW9uLmlkO1xuXG4gICAgaWYgKHRoaXMuaXNMaXZlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kSW5kZXgoaXRlciA9PiBpdGVyLmlkID09PSBpdGVyYXRpb24uaWQpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSAmJiB0aGlzLml0ZXJhdGlvbkRhdGE/LltpbmRleF0gJiYgdGhpcy5uZXN0ZWRTdGVwcykge1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWROZXN0ZWRTdGVwczogRXhlY3V0aW9uU3RlcENvbmZpZ1tdID1cbiAgICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzLm1hcChzdGVwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdWJTdGVwcyA9IHRoaXMuaXRlcmF0aW9uRGF0YVtpbmRleF1bc3RlcC5pZF07XG4gICAgICAgICAgICBzdGVwLmR1cmF0aW9uID0gdXBkYXRlZFN1YlN0ZXBzLnJlZHVjZSgoYWNjOiBudW1iZXIsIHN1YlN0ZXA6IGFueSkgPT4gYWNjICsgc3ViU3RlcD8uZHVyYXRpb24gfHwgMCwgMCk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkU3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGVwLFxuICAgICAgICAgICAgICAgIHN1YlN0ZXBzOiBbLi4udXBkYXRlZFN1YlN0ZXBzXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyAuLi5zdGVwIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHVwZGF0ZWROZXN0ZWRTdGVwcztcblxuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgbmVzdGVkU3RlcHM6IHVwZGF0ZWROZXN0ZWRTdGVwc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVtaXQgdGhlIGV2ZW50IHdpdGggdGhlIGl0ZXJhdGlvbiBJRFxuICAgIHRoaXMub25JdGVyYXRpb25DaGFuZ2UuZW1pdChpdGVyYXRpb24uaWQpO1xuICB9XG5cbiAgY29tcGFyZUl0ZXJhdGlvbihhOiBMb29wSXRlcmF0aW9uLCBiOiBMb29wSXRlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGEuaWQgPT09IGIuaWQgOiBhID09PSBiO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVCYWRnZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbJ0xPT1AnXTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgIGJhZGdlcy5wdXNoKCdGT1InKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGJhZGdlcy5wdXNoKCdXSElMRScpO1xuICAgIH1cbiAgICByZXR1cm4gYmFkZ2VzO1xuICB9XG5cbiAgZ2V0SXRlcmF0aW9uTGFiZWwoaXRlcmF0aW9uOiBMb29wSXRlcmF0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlcmF0aW9uLmxhYmVsO1xuICB9XG5cbiAgb25WaWV3QWxsSXRlcmF0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uQWRkU3RlcEluc2lkZUxvb3AoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmFkZFN0ZXBJbnNpZGVMb29wLmVtaXQodGhpcy5zdGVwID8/IHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIG9uVmlld01vcmVGYWlsZWRTdGVwQ2xpY2soZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGYWlsZWRTdGVwRGV0YWlscyA9IGV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0U3ViU3RlcHNGb3JGYWlsZWRTdGVwKCk6IFN1YlN0ZXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24/LnN1YlN0ZXBzIHx8IFtdO1xuICB9XG5cbiAgb25NYWtlQ3VycmVudEJhc2VsaW5lKGV2ZW50OiBtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1ha2VDdXJyZW50QmFzZWxpbmUuZW1pdChldmVudCk7XG4gIH1cblxuICBvblVwbG9hZEJhc2VsaW5lKGV2ZW50OiB1cGxvYWRCYXNlbGluZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy51cGxvYWRCYXNlbGluZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQW5hbHl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFuYWx5emUuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RnVsbExvZ3MoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3RnVsbExvZ3MuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxmSGVhbEFjdGlvbihldmVudDogU2VsZkhlYWxBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZkhlYWxBY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBnZXQgc2hvd1ZpZXdNb3JlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQgJiYgQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzKSAmJlxuICAgICAgKFxuICAgICAgICAoQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5leHBlY3RlZCB8fCB0aGlzLmZhaWx1cmVEZXRhaWxzPy5hY3R1YWwpKSB8fFxuICAgICAgICAoQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5zY3JlZW5zaG90cz8uY3VycmVudCB8fCB0aGlzLmZhaWx1cmVEZXRhaWxzPy5zY3JlZW5zaG90cz8uYmFzZWxpbmUgfHwgdGhpcy5mYWlsdXJlRGV0YWlscz8uc2NyZWVuc2hvdHM/LmRpZmZlcmVuY2UpXG4gICAgICAgICAgfHwgQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5sb2dzPy5sZW5ndGgpKSB8fCBcbiAgICAgICAgKEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscz8uYWlGaXhBcHBsaWVkICYmICh0aGlzLmZhaWx1cmVEZXRhaWxzPy5haUZpeE1lc3NhZ2UgfHwgdGhpcy5jb25maWRlbmNlIHx8IHRoaXMucmVhc29uaW5nPy5sZW5ndGgpKSlcbiAgICAgIClcbiAgfVxuXG4gIG9uRGVidWdQb2ludENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kZWJ1Z1BvaW50Q2hhbmdlLmVtaXQoIXRoaXMuZGVidWdQb2ludFNldCk7XG4gIH1cblxuICBvbkVkaXRTdGVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMub25FZGl0U3RlcEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWRpdFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQWRkU3RlcE9wdGlvblNlbGVjdChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KG9wdGlvbik7XG4gIH1cblxuICBvblN0ZXBNb3JlT3B0aW9uU2VsZWN0KG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc3RlcE1vcmVPcHRpb25TZWxlY3QuZW1pdChvcHRpb24pO1xuICB9XG5cbiAgdG9nZ2xlSGVhZGVyKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGUoKTtcbiAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zaG93RmFpbGVkU3RlcERldGFpbHMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyKSB7XG4gICAgICBjb25zdCBzdGVwVG9QYXNzID0gdGhpcy5zdGVwIHx8IHRoaXMuY29uZmlnO1xuICAgICAgaWYgKHN0ZXBUb1Bhc3MpIHtcbiAgICAgICAgdGhpcy5vblN0ZXBDbGlja0hhbmRsZXIoc3RlcFRvUGFzcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgc3RlcC1ncm91cCB3aXRoIGhhc0NoaWxkXG4gIGlzTmVzdGVkU3RlcEdyb3VwV2l0aENoaWxkcmVuKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICEhKHN0ZXAgYXMgYW55KS5oYXNDaGlsZDtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IGdyb3VwTmFtZSBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldEdyb3VwTmFtZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgU3RlcEdyb3VwQ29uZmlnKS5ncm91cE5hbWUgfHwgJyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwcyBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldFN0ZXBzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBFeGVjdXRpb25TdGVwQ29uZmlnW10ge1xuICAgIGNvbnN0IHN0ZXBHcm91cCA9IHN0ZXAgYXMgU3RlcEdyb3VwQ29uZmlnO1xuICAgIHJldHVybiBzdGVwR3JvdXAuc3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgY29uZGl0aW9uIHN0ZXBcbiAgaXNOZXN0ZWRDb25kaXRpb25TdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGVwVHlwZSA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8IHN0ZXAuZGlzcGxheVR5cGU7XG4gICAgcmV0dXJuIHN0ZXBUeXBlID09PSAnQ09ORElUSU9OX0lGJyB8fCBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFJyB8fCBcbiAgICAgICAgICAgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRV9JRicgfHwgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRUlGJyB8fFxuICAgICAgICAgICBzdGVwVHlwZSA9PT0gJ2NvbmRpdGlvbic7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIGEgc3RlcCBpcyBhIGxvb3Agc3RlcFxuICBpc05lc3RlZExvb3BTdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGVwVHlwZSA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8IHN0ZXAuZGlzcGxheVR5cGU7XG4gICAgcmV0dXJuIHN0ZXBUeXBlID09PSAnRk9SX0xPT1AnIHx8IHN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgc3RlcFR5cGUgPT09ICdsb29wJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IGxvb3AgdHlwZSBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldExvb3BUeXBlKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiAnZm9yJyB8ICd3aGlsZScgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICBpZiAoc3RlcFR5cGUgPT09ICdGT1JfTE9PUCcgfHwgKHN0ZXAgYXMgTG9vcFN0ZXBDb25maWcpLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgcmV0dXJuICdmb3InO1xuICAgIH0gZWxzZSBpZiAoc3RlcFR5cGUgPT09ICdXSElMRV9MT09QJyB8fCAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHJldHVybiAnd2hpbGUnO1xuICAgIH1cbiAgICByZXR1cm4gKHN0ZXAgYXMgTG9vcFN0ZXBDb25maWcpLmxvb3BUeXBlO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgaXRlcmF0aW9ucyBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldExvb3BJdGVyYXRpb25zKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnlbXSB7XG4gICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGNvbmZpZ1xuICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLml0ZXJhdGlvbnMgfHwgW107XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBuZXN0ZWQgc3RlcHMgZnJvbSBsb29wIHN0ZXAgY29uZmlnXG4gIGdldExvb3BOZXN0ZWRTdGVwcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogRXhlY3V0aW9uU3RlcENvbmZpZ1tdIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLm5lc3RlZFN0ZXBzIHx8IChzdGVwIGFzIGFueSkuY2hpbGRyZW4gfHwgW107XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSBuZXN0ZWQgbG9vcCBzdGVwIGV4cGFuc2lvblxuICBoYW5kbGVMb29wU3RlcEV4cGFuZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSBuZXN0ZWQgbG9vcCBzdGVwIGl0ZXJhdGlvbiBjaGFuZ2VcbiAgaGFuZGxlTG9vcFN0ZXBJdGVyYXRpb25DaGFuZ2Uoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgaXRlcmF0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnRcbiAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IGVtaXQgdGhlIGV4cGFuZCBldmVudFxuICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc3RlcCB0aXRsZVxuICBnZXRTdGVwVGl0bGUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuYWN0aW9uIHx8IHN0ZXAudGl0bGUgfHwgJyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIHN0YXR1c1xuICBnZXRTdGVwU3RhdHVzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBTdGVwU3RhdHVzIHtcbiAgICBjb25zdCByZXN1bHQgPSAoc3RlcCBhcyBhbnkpLnJlc3VsdDtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCByZXN1bHRMb3dlciA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJlc3VsdExvd2VyID09PSAnc3VjY2VzcycgfHwgcmVzdWx0TG93ZXIgPT09ICdwYXNzZWQnKSB7XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdExvd2VyID09PSAnZmFpbHVyZScgfHwgcmVzdWx0TG93ZXIgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdwZW5kaW5nJyB8fCByZXN1bHRMb3dlciA9PT0gJ25vdC1leGVjdXRlZCcpIHtcbiAgICAgICAgcmV0dXJuICdwZW5kaW5nJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdydW5uaW5nJykge1xuICAgICAgICByZXR1cm4gJ3J1bm5pbmcnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RlcC5zdGF0dXMgfHwgJ3BlbmRpbmcnO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc3RlcCBkdXJhdGlvblxuICBnZXRTdGVwRHVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuZHVyYXRpb24gfHwgc3RlcC5kdXJhdGlvbiB8fCAwO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIGNvbmRpdGlvbiBzdGVwIHByb3BlcnRpZXNcbiAgZ2V0Q29uZGl0aW9uU3RlcER1cmF0aW9uKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5nZXRTdGVwRHVyYXRpb24oc3RlcCk7XG4gICAgaWYgKHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcihkdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBFeHBhbmRlZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwLmV4cGFuZGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcFRleHQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuYWN0aW9uIHx8IHN0ZXAudGl0bGUgfHwgJyc7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwQnJhbmNoZXMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IENvbmRpdGlvbkJyYW5jaFtdIHtcbiAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcExvYWRpbmcoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcEV4cGFuZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwRmFpbHVyZURldGFpbHMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwU2VsZkhlYWxBbmFseXNpcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwU2VsZkhlYWxBY3Rpb24oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwTWFrZUJhc2VsaW5lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBVcGxvYWRCYXNlbGluZShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBBbmFseXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25BbmFseXplSGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBWaWV3TG9ncygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIHtcbiAgICAgIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHMgdG8gc2FmZWx5IGFjY2VzcyBMb29wU3RlcENvbmZpZyBwcm9wZXJ0aWVzXG4gIGdldExvb3BTZWxlY3RlZEl0ZXJhdGlvbklkKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgfVxuXG4gIGdldExvb3BEZWZhdWx0SXRlcmF0aW9uKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiAnZmlyc3QnIHwgJ2xhc3QnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLmRlZmF1bHRJdGVyYXRpb24gfHwgJ2xhc3QnO1xuICB9XG5cbiAgZ2V0TG9vcFNob3dWaWV3QWxsSXRlcmF0aW9ucyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5zaG93Vmlld0FsbEl0ZXJhdGlvbnM7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIHN0ZXAgaXMgY3VycmVudGx5IGxvYWRpbmcgbmVzdGVkIGNoaWxkcmVuXG4gIGlzU3RlcExvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIgJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nIHx8IGZhbHNlO1xuICB9XG5cbiAgb25KdW1wVG9UaW1lc3RhbXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlciAmJiB0aGlzLnN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdGVwPy5leGVjdXRlZFJlc3VsdD8udmlkZW9fc3RhcnRfdGltZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gdHlwZW9mIHRoaXMuc3RlcC5leGVjdXRlZFJlc3VsdC52aWRlb19zdGFydF90aW1lID09PSAnbnVtYmVyJyBcbiAgICAgICAgPyB0aGlzLnN0ZXAuZXhlY3V0ZWRSZXN1bHQudmlkZW9fc3RhcnRfdGltZSBcbiAgICAgICAgOiBOdW1iZXIodGhpcy5zdGVwLmV4ZWN1dGVkUmVzdWx0LnZpZGVvX3N0YXJ0X3RpbWUpO1xuICAgICAgY29uc3QgdGVzdFN0ZXBJZCA9IHRoaXMuc3RlcD8udGVzdFN0ZXBJZDtcbiAgICAgIGlmIChpc0Zpbml0ZSh0aW1lc3RhbXApICYmIHRpbWVzdGFtcCA+PSAwKSB7XG4gICAgICAgIHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcih0aW1lc3RhbXAsIHRlc3RTdGVwSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMaXZlIHx8ICF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudExlbmd0aCA9ICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzIHx8IFtdKS5sZW5ndGg7XG4gICAgLy8gUmVzZXQgaWYgaXRlcmF0aW9uIGNoYW5nZWQgKGRldGVjdGVkIGJ5IGNoZWNraW5nIGlmIHdlIGhhdmUgYSBkaWZmZXJlbnQgaXRlcmF0aW9uJ3Mgc3ViU3RlcHMpXG4gICAgaWYgKHRoaXMubGFzdFByb2Nlc3NlZEluZGV4ID4gMCAmJiBjdXJyZW50TGVuZ3RoIDwgdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXgpIHtcbiAgICAgIC8vIExpa2VseSBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBpdGVyYXRpb24sIHJlc2V0XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMZW5ndGggIT09IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4KSB7XG4gICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0xpdmVTdWJTdGVwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFN1YlN0ZXBzID0gKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgfHwgW10pIGFzIGFueVtdO1xuXG4gICAgLy8gUmVzZXQgaWYgc3ViU3RlcHMgd2VyZSBjbGVhcmVkIG9yIHJlcGxhY2VkIHdpdGggZmV3ZXIgZW50cmllc1xuICAgIGlmIChhbGxTdWJTdGVwcy5sZW5ndGggPCB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCkge1xuICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4OyBpIDwgYWxsU3ViU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlN0ZXAgPSBhbGxTdWJTdGVwc1tpXTtcbiAgICAgIGNvbnN0IHVpVHlwZTogc3RyaW5nID0gc3ViU3RlcD8udWlUeXBlIHx8IHN1YlN0ZXA/LnR5cGUgfHwgJyc7XG4gICAgICBjb25zdCBzdGF0dXM6IHN0cmluZyA9IChzdWJTdGVwPy5zdGF0dXMgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh1aVR5cGUgPT09ICdXQUlUX0ZPUl9MT0NBVE9SJykge1xuICAgICAgICAvLyBDcmVhdGUgYSBzaW5nbGUgZ3JvdXBlZCBlbnRyeSB3aXRoIGEgY291bnRkb3duOyBhYnNvcmJzIEZJTkRfTE9DQVRPUiBhbmQgTE9DQVRPUl9GT1VORFxuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHR5cGVvZiBzdWJTdGVwLnZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gc3ViU3RlcC52YWx1ZVxuICAgICAgICAgIDogKHN1YlN0ZXAudmFsdWUgPyBwYXJzZUZsb2F0KHN1YlN0ZXAudmFsdWUpIDogMzApO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuXG4gICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0ge1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgcmVtYWluaW5nU2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGREdXJhdGlvblRvV2FpdExvY2F0b3JHcm91cEVudHJ5KHN1YlN0ZXApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2godGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpO1xuXG4gICAgICAgIC8vIFRpY2sgZG93biBldmVyeSBzZWNvbmRcbiAgICAgICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IE1hdGgubWF4KDAsIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgLSAxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzIDw9IDApIHtcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnRklORF9MT0NBVE9SJykge1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIC8vIEFib3J0IGNvdW50ZG93biwgcmVwbGFjZSBncm91cCBlbnRyeSB3aXRoIHRoaXMgZmFpbGVkIGxvZ1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCwgc3RhdHVzOiAnZmFpbGVkJyB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2luZ2xlIGdyb3VwIGVudHJ5J3MgdGV4dCBzbyB0aGUgdXNlciBzZWVzIHByb2dyZXNzXG4gICAgICAgICAgY29uc3QgbmV3VGV4dCA9IHN1YlN0ZXAuZGVzY3JpcHRpb24gfHwgc3ViU3RlcC50ZXh0IHx8IHN1YlN0ZXAudGl0bGU7XG4gICAgICAgICAgaWYgKG5ld1RleHQpIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmRlc2NyaXB0aW9uID0gbmV3VGV4dDtcbiAgICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gYWN0aXZlIGdyb3VwIOKAkyBwdXNoIEZJTkRfTE9DQVRPUiBub3JtYWxseSBvbmNlIGNvdW50ZG93biBpcyBjbGVhcmVkXG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKHVpVHlwZSA9PT0gJ0xPQ0FUT1JfRk9VTkQnKSB7XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICAvLyBBYm9ydCBjb3VudGRvd24sIHJlcGxhY2UgZ3JvdXAgZW50cnkgd2l0aCB0aGlzIGZhaWxlZCBsb2dcbiAgICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMgPSB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLmZpbHRlcihlbnRyeSA9PiBlbnRyeSAhPT0gdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7IC4uLnN1YlN0ZXAsIHN0YXR1czogJ2ZhaWxlZCcgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VxdWVuY2UgY29tcGxldGUg4oCTIHVwZGF0ZSBncm91cCBlbnRyeSB0byBzaG93IExPQ0FUT1JfRk9VTkQgdGV4dCBhcyBzdWNjZXNzXG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC50aXRsZTtcbiAgICAgICAgICAgIGlmIChuZXdUZXh0KSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5kZXNjcmlwdGlvbiA9IG5ld1RleHQ7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3RpdmUgZ3JvdXAg4oCTIHB1c2ggTE9DQVRPUl9GT1VORCBub3JtYWxseVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUwnKSB7XG4gICAgICAgIC8vIElmIGEgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gaXMgYWN0aXZlLCBjb21wbGV0ZSBpdCBhcyBmYWlsZWQgYmVmb3JlIHN0YXJ0aW5nIEFJIGF1dG8taGVhbFxuICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgc2luZ2xlIGxvYWRpbmcgZW50cnk7IHdpbGwgYmUgcmVwbGFjZWQgYnkgQUlfQVVUT19IRUFMX1NVQ0NFU1Mgb3IgQUlfQVVUT19IRUFMX0ZBSUxFRFxuICAgICAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0ge1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN1YlN0ZXAuZGVzY3JpcHRpb24gfHwgc3ViU3RlcC50ZXh0IHx8ICdBSSBhdXRvLWhlYWwgc3RhcnRlZCcsXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2godGhpcy5haUF1dG9IZWFsR3JvdXBFbnRyeSk7XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnQUlfQVVUT19IRUFMX1NVQ0NFU1MnIHx8IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9GQUlMRUQnKSB7XG4gICAgICAgIC8vIElmIGEgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gaXMgYWN0aXZlLCBjb21wbGV0ZSBpdCBhcyBmYWlsZWQgYmVmb3JlIGhhbmRsaW5nIEFJIGF1dG8taGVhbCByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxvYWRpbmcgZW50cnkgYW5kIGFkZCBUV08gc2VwYXJhdGUgZW50cmllczogdmFsdWUgYW5kIHJlYXNvbmluZyAobGlrZSBBSV9BTlNXRVIpXG4gICAgICAgIGlmICh0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KTtcbiAgICAgICAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1N1Y2Nlc3MgPSB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUyc7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3ViU3RlcC52YWx1ZSA/PyBzdWJTdGVwLnRleHQgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlYXNvbmluZyA9IHN1YlN0ZXAucmVhc29uaW5nID8/IHN1YlN0ZXAuUmVhc29uaW5nID8/ICcnO1xuICAgICAgICBjb25zdCBiYXNlRHVyYXRpb24gPSBzdWJTdGVwLmR1cmF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RhdHVzID0gaXNTdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCc7XG5cbiAgICAgICAgLy8gRmlyc3QgZW50cnk6IHZhbHVlL2Rlc2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHZhbHVlRGVzY3JpcHRpb24gPSBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCAoaXNTdWNjZXNzXG4gICAgICAgICAgPyBgQUkgYXV0by1oZWFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgOiBgQUkgYXV0by1oZWFsIGZhaWxlZGApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goe1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlRGVzY3JpcHRpb24sXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHJlYXNvbmluZzogbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgIHVpVHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgdHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgZHVyYXRpb246IGJhc2VEdXJhdGlvbixcbiAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2Vjb25kIGVudHJ5OiByZWFzb25pbmcgKG9ubHkgaWYgcHJlc2VudClcbiAgICAgICAgaWYgKHJlYXNvbmluZykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgcmVhc29uaW5nOiByZWFzb25pbmcsXG4gICAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgaXNBaUF1dG9IZWFsUmVzdWx0OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW55IGZhaWxlZCBsb2cgd2hpbGUgYSBjb3VudGRvd24gaXMgYWN0aXZlIOKAkyByZXNvbHZlIGl0IGFzIGZhaWxlZFxuICAgICAgICBpZiAoKHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZScpICYmIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaChzdWJTdGVwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCA9IGFsbFN1YlN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRMaXZlUHJvY2Vzc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gW107XG4gICAgdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXggPSAwO1xuICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDb3VudGRvd25UaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3VudGRvd25JbnRlcnZhbElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnRkb3duSW50ZXJ2YWxJZCk7XG4gICAgICB0aGlzLmNvdW50ZG93bkludGVydmFsSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3RHVyYXRpb24gPSBzdWJTdGVwPy5kdXJhdGlvbjtcbiAgICBsZXQgZGVsdGEgPSAwO1xuICAgIGlmICh0eXBlb2YgcmF3RHVyYXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICBkZWx0YSA9IHJhd0R1cmF0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd0R1cmF0aW9uID09PSAnc3RyaW5nJyAmJiByYXdEdXJhdGlvbi50cmltKCkgIT09ICcnKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhd0R1cmF0aW9uKTtcbiAgICAgIGRlbHRhID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiAwO1xuICAgIH1cblxuICAgIGlmIChkZWx0YSA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJhdyA9IHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmR1cmF0aW9uO1xuICAgIGxldCBjdXJyZW50ID0gMDtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSYXcgPT09ICdudW1iZXInKSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFJhdztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50UmF3ID09PSAnc3RyaW5nJyAmJiBjdXJyZW50UmF3LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEN1cnJlbnQgPSBwYXJzZUZsb2F0KGN1cnJlbnRSYXcpO1xuICAgICAgY3VycmVudCA9IE51bWJlci5pc0Zpbml0ZShwYXJzZWRDdXJyZW50KSA/IHBhcnNlZEN1cnJlbnQgOiAwO1xuICAgIH1cblxuICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmR1cmF0aW9uID0gY3VycmVudCArIGRlbHRhO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uIHx8ICF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsU3ViU3RlcHMgPSAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyB8fCBbXSkgYXMgYW55W107XG4gICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdWJTdGVwIG9mIGFsbFN1YlN0ZXBzKSB7XG4gICAgICBjb25zdCB1aVR5cGU6IHN0cmluZyA9IHN1YlN0ZXA/LnVpVHlwZSB8fCBzdWJTdGVwPy50eXBlIHx8ICcnO1xuXG4gICAgICAvLyBTcGxpdCBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRUQgaW50byB0d28gZW50cmllc1xuICAgICAgaWYgKHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJyB8fCB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfRkFJTEVEJykge1xuICAgICAgICBjb25zdCBpc1N1Y2Nlc3MgPSB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUyc7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3ViU3RlcC52YWx1ZSA/PyBzdWJTdGVwLnRleHQgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlYXNvbmluZyA9IHN1YlN0ZXAucmVhc29uaW5nID8/IHN1YlN0ZXAuUmVhc29uaW5nID8/ICcnO1xuICAgICAgICBjb25zdCBiYXNlRHVyYXRpb24gPSBzdWJTdGVwLmR1cmF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RhdHVzID0gaXNTdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCc7XG5cbiAgICAgICAgLy8gRmlyc3QgZW50cnk6IHZhbHVlL2Rlc2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHZhbHVlRGVzY3JpcHRpb24gPSAoaXNTdWNjZXNzXG4gICAgICAgICAgPyBgQUkgYXV0by1oZWFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgOiBgQUkgYXV0by1oZWFsIGZhaWxlZGApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0LnB1c2goe1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlRGVzY3JpcHRpb24sXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHJlYXNvbmluZzogbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgIHVpVHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgdHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgZHVyYXRpb246IGJhc2VEdXJhdGlvbixcbiAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2Vjb25kIGVudHJ5OiByZWFzb25pbmcgKG9ubHkgaWYgcHJlc2VudClcbiAgICAgICAgaWYgKHJlYXNvbmluZykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgcmVhc29uaW5nOiByZWFzb25pbmcsXG4gICAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgaXNBaUF1dG9IZWFsUmVzdWx0OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IChzdWJTdGVwPy5zdGF0dXMgPz8gJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgaXNGYWlsZWQgPSBzdGF0dXMgPT09ICdmYWlsZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWx1cmUnO1xuICAgICAgICBjb25zdCBpc0xvY2F0b3JTdGVwID0gdWlUeXBlID09PSAnV0FJVF9GT1JfTE9DQVRPUicgfHwgdWlUeXBlID09PSAnRklORF9MT0NBVE9SJyB8fCB1aVR5cGUgPT09ICdMT0NBVE9SX0ZPVU5EJztcbiAgICAgICAgaWYgKGlzTG9jYXRvclN0ZXAgJiYgaXNGYWlsZWQpIHtcbiAgICAgICAgICBjb25zdCBiYXNlRGVzYyA9IHN1YlN0ZXA/LmRlc2NyaXB0aW9uID8/IHN1YlN0ZXA/LnRleHQgPz8gc3ViU3RlcD8udGl0bGUgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgbm90Rm91bmRTdWZmaXggPSAnIC0gRWxlbWVudCBub3QgZm91bmQnO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IChiYXNlRGVzYyA/IGJhc2VEZXNjICsgbm90Rm91bmRTdWZmaXggOiBub3RGb3VuZFN1ZmZpeC50cmltKCkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHN1YlN0ZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtaW50ZXIgY3FhLXctZnVsbFwiIFtjbGFzcy5jcWEtb3BhY2l0eS01MF09XCJpc0RlYnVnICYmIGlzU2tpcHBlZCAmJiAhcGFyZW50U2tpcHBlZFwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIiFpc0RlYnVnID8gbnVsbCA6IHN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGF1c2VkJyA/ICcjRkZGOUU5JyA6IHN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbGVkJyA/ICcjRkVGMkYyJyA6IG51bGxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcC0yIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlcigkZXZlbnQpXCI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWJ1Z0ljb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgIFttYXRUb29sdGlwXT1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZycgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGEgcnVubmluZyBzdGVwJyA6IChpc1N0ZXBEZWxldGVkID8gJ0JyZWFrcG9pbnQgY2Fubm90IGJlIHNldCBvbiBkZWxldGVkIHN0ZXBzJyA6ICgoISFwYXJlbnRTa2lwcGVkICYmICFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQpID8gJ0JyZWFrcG9pbnQgY2Fubm90IGJlIHNldCBvbiBhIHJ1bm5pbmcgc3RlcCcgOiAoISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIHNraXBwZWQgc3RlcHMnIDogJycpKSlcIlxuICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgW25nQ2xhc3NdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyB8fCAhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICdjcWEtY3Vyc29yLW5vdC1hbGxvd2VkIGNxYS1vcGFjaXR5LTQwIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lJyA6ICdjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZycgfHwgISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgfHwgISFwYXJlbnRTa2lwcGVkIHx8IGlzU3RlcERlbGV0ZWRcIlxuICAgICAgICAoY2xpY2spPVwib25EZWJ1Z1BvaW50Q2xpY2soJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZGVidWdQb2ludFNldCA/ICdSZW1vdmUgZGVidWcgcG9pbnQnIDogJ1NldCBkZWJ1ZyBwb2ludCdcIj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cImRlYnVnUG9pbnRTZXRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIFthdHRyLmZpbGxdPVwiISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgfHwgISFwYXJlbnRTa2lwcGVkIHx8IGlzU3RlcERlbGV0ZWQgPyAnIzlFOUU5RScgOiAnI0M2MzUzNSdcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWRlYnVnUG9pbnRTZXRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIFthdHRyLnN0cm9rZV09XCIhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICcjOUU5RTlFJyA6ICcjQzYzNTM1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU3RhdHVzIEljb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8IS0tIFN1Y2Nlc3MgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwLjkwMDUgNC45OTk5OUMxMS4xMjg5IDYuMTIwNjQgMTAuOTY2MiA3LjI4NTcxIDEwLjQzOTUgOC4zMDA4OUM5LjkxMjc5IDkuMzE2MDggOS4wNTQgMTAuMTIgOC4wMDYzMSAxMC41Nzg3QzYuOTU4NjIgMTEuMDM3MyA1Ljc4NTM2IDExLjEyMjkgNC42ODIyIDEwLjgyMTJDMy41NzkwNCAxMC41MTk1IDIuNjEyNjUgOS44NDg2OSAxLjk0NDE5IDguOTIwNzFDMS4yNzU3MyA3Ljk5MjcyIDAuOTQ1NjExIDYuODYzNjEgMS4wMDg4OCA1LjcyMTY5QzEuMDcyMTUgNC41Nzk3NiAxLjUyNDk5IDMuNDk0MDQgMi4yOTE4OCAyLjY0NTU4QzMuMDU4NzYgMS43OTcxMiA0LjA5MzM0IDEuMjM3MjEgNS4yMjMwOCAxLjA1OTIyQzYuMzUyODIgMC44ODEyMzMgNy41MDk0NCAxLjA5NTkyIDguNTAwMDUgMS42Njc0OVwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNS41TDYgN0wxMSAyXCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gRmFpbGVkIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbHVyZScgfHwgc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNCA0TDggOE04IDRMNCA4XCIgc3Ryb2tlPVwiI0VGNDQ0NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3BlbmRpbmcnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUnVubmluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzNCODJGNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIFxuICAgICAgICA8c3BhbiAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnc2tpcHBlZCdcIiAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBza2lwX25leHRcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGF1c2VkJ1wiPjxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNOC41IDJINy41QzcuMjIzODYgMiA3IDIuMjIzODYgNyAyLjVWOS41QzcgOS43NzYxNCA3LjIyMzg2IDEwIDcuNSAxMEg4LjVDOC43NzYxNCAxMCA5IDkuNzc2MTQgOSA5LjVWMi41QzkgMi4yMjM4NiA4Ljc3NjE0IDIgOC41IDJaXCIgc3Ryb2tlPVwiI0UxNzEwMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSAySDMuNUMzLjIyMzg2IDIgMyAyLjIyMzg2IDMgMi41VjkuNUMzIDkuNzc2MTQgMy4yMjM4NiAxMCAzLjUgMTBINC41QzQuNzc2MTQgMTAgNSA5Ljc3NjE0IDUgOS41VjIuNUM1IDIuMjIzODYgNC43NzYxNCAyIDQuNSAyWlwiIHN0cm9rZT1cIiNFMTcxMDBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvb3AgSWNvbiAtLT5cbiAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiNFwiIGZpbGw9XCIjRUJFQ0ZEXCIvPjxwYXRoIGQ9XCJNOS42NjY2MyA0LjY2NjY2TDExIDUuOTk5OTlMOS42NjY2MyA3LjMzMzMyXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTUgNy42NjY2N1Y3LjMzMzMzQzUgNi45Nzk3MSA1LjE0MDQ4IDYuNjQwNTcgNS4zOTA1MiA2LjM5MDUyQzUuNjQwNTcgNi4xNDA0OCA1Ljk3OTcxIDYgNi4zMzMzMyA2SDExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYuMzMzMzMgMTEuMzMzM0w1IDkuOTk5OTlMNi4zMzMzMyA4LjY2NjY2XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTExIDguMzMzMzRWOC42NjY2OEMxMSA5LjAyMDMgMTAuODU5NSA5LjM1OTQ0IDEwLjYwOTUgOS42MDk0OUMxMC4zNTk0IDkuODU5NTMgMTAuMDIwMyAxMCA5LjY2NjY3IDEwSDVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPjwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIE51bWJlciBhbmQgVGl0bGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzMzQxNTVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF1cIiBzdHlsZT1cIndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCI+XG4gICAgICAgIHt7IGNvbmZpZz8uc3RlcE51bWJlciB9fS4gPHNwYW4gW2lubmVySFRNTF09XCJjb25maWc/LnRpdGxlXCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIExvb3AgVHlwZSBCYWRnZXMgLS0+XG4gICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2YgZ2V0TG9vcFR5cGVCYWRnZXMoKVwiIFxuICAgICAgICBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtcHJpbWFyeSBjcWEtYmctWyNFQkVDRkRdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgYmFkZ2UgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLnN0ZXBEZWxldGVkXCIgY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0I0MjMxOF0gY3FhLWJnLVsjRkVGM0YyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGRUU0RTJdXCI+XG4gICAgICAgIERlbGV0ZWRcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgPCEtLSBTdGVwIENoYW5nZSBCYWRnZXMgKGRlYnVnIG9ubHkpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGVidWdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2Ygc3RlcEJhZGdlc1wiPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ3NraXBwZWQnXCJcbiAgICAgICAgICBsYWJlbD1cIlNraXBwZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInIzRBNTU2NSdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInIzk5QTFBRidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGRkZGRkYnXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ2VkaXRlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiRWRpdGVkXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiJyNGQkJGMjQnXCJcbiAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiJyNGRERGOTInXCJcbiAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIicjRkZGOUU5J1wiPlxuICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICpuZ0lmPVwiYmFkZ2UgPT09ICdhZGRlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiQWRkZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInIzBEQkQ3RCdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInIzVFRDNBOCdcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNDRkYyRTUnXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ3JlbW92ZWQnXCJcbiAgICAgICAgICBsYWJlbD1cIlJlbW92ZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInI0VFM0YzRidcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0Y0N0Y3RidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGQ0Q5RDknXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNwYW4gKm5nSWY9XCJzZWxmSGVhbEFuYWx5c2lzXCIgY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDk3RTUzXSBjcWEtYmctWyNDRkYyRTVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLW1pbi13LW1heCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzZweF1cIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5XCIgaGVpZ2h0PVwiOVwiIHZpZXdCb3g9XCIwIDAgOSA5XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQuNTA5NDEgMEM0LjU2NDg5IDAuMDIyNzM4NCA0LjU4ODU5IDAuMDc4MjY1MiA0LjYxMTMxIDAuMTI5ODQ2QzQuNjIyNjkgMC4xNTk5IDQuNjMzMTQgMC4xOTAxMTcgNC42NDMyOSAwLjIyMDU3NUM0LjY0NzI2IDAuMjMyMjQ3IDQuNjUxMjMgMC4yNDM5MTggNC42NTUzMiAwLjI1NTk0M0M0LjcwODA2IDAuNDEzMDA1IDQuNzU1MDQgMC41NzE3NDggNC44MDIyOSAwLjczMDM4QzQuODEyOTcgMC43NjYxOSA0LjgyMzY5IDAuODAxOTg3IDQuODM0NDIgMC44Mzc3ODNDNC44ODkwNSAxLjAyMDA0IDQuOTQzMjcgMS4yMDI0IDQuOTk3MTkgMS4zODQ4NEM1LjAwNDc2IDEuNDEwNDcgNS4wMTIzNCAxLjQzNjA5IDUuMDE5OTIgMS40NjE3MUM1LjA0MTI4IDEuNTMzOTUgNS4wNjI2MiAxLjYwNjE5IDUuMDgzODMgMS42Nzg0N0M1LjEyODY3IDEuODMxMiA1LjE3NDczIDEuOTgzNDcgNS4yMjM3OCAyLjEzNTAxQzUuMjI4MDcgMi4xNDgyNyA1LjIzMjM2IDIuMTYxNTIgNS4yMzY3NyAyLjE3NTE4QzUuMzY0MiAyLjU2NSA1LjU0NDgyIDIuOTE0MzcgNS44NDA5IDMuMjExOTZDNS44NDgyMyAzLjIxOTcgNS44NTU1NiAzLjIyNzQ0IDUuODYzMTIgMy4yMzU0MUM1Ljk4OTUgMy4zNjQzNyA2LjE1MTY5IDMuNDY3NzEgNi4zMTM4IDMuNTUxMTFDNi4zMjIwNiAzLjU1NTQyIDYuMzMwMzEgMy41NTk3NCA2LjMzODgyIDMuNTY0MTlDNi44MTU4NyAzLjgwOTI1IDcuMzg5NTEgMy45MTcwNCA3LjkwNjE5IDQuMDYwNUM4LjEzMjYgNC4xMjM0IDguMzU4MyA0LjE4ODI5IDguNTgzMTcgNC4yNTYwM0M4LjU5ODk3IDQuMjYwNzkgOC42MTQ3OCA0LjI2NTU0IDguNjMwNTggNC4yNzAyOEM4LjY3Nzg0IDQuMjg0NDUgOC43MjUgNC4yOTg4NyA4Ljc3MjExIDQuMzEzNDdDOC43ODMxIDQuMzE2NzkgOC43OTQwOCA0LjMyMDExIDguODA1MzkgNC4zMjM1M0M4Ljg3MDI5IDQuMzQ0MDYgOC45MzIzOSA0LjM2ODI5IDguOTg1NjYgNC40MTAyN0M5LjAwMTkxIDQuNDQ0MTggOS4wMDE5MSA0LjQ0NDE4IDguOTk3NDggNC40NzgxQzguOTQ1NjQgNC41MjczNiA4Ljg5NDIgNC41NTA0NiA4LjgyNTc4IDQuNTczQzguODE2IDQuNTc2MzIgOC44MDYyMiA0LjU3OTY1IDguNzk2MTQgNC41ODMwOEM4LjY4MDYxIDQuNjIxODMgOC41NjM1MSA0LjY1NTc1IDguNDQ2MjYgNC42ODkzNUM4LjQyMjIgNC42OTYzIDguMzk4MTQgNC43MDMyNiA4LjM3NDA4IDQuNzEwMjFDOC4yMjU3MSA0Ljc1MzAxIDguMDc3MDggNC43OTQ5IDcuOTI4MjkgNC44MzYzMkM3LjczMjMyIDQuODkwODggNy41MzY2MyA0Ljk0NjM0IDcuMzQxMTMgNS4wMDI0M0M3LjMwOTEgNS4wMTE2MiA3LjI3NzA2IDUuMDIwNzggNy4yNDUwMSA1LjAyOTkxQzcuMDc2NzEgNS4wNzc4NiA2LjkwOTIzIDUuMTI3NTMgNi43NDMxNCA1LjE4MjA4QzYuNzI5MzcgNS4xODY1OSA2LjcxNTU5IDUuMTkxMSA2LjcwMTM5IDUuMTk1NzRDNi4xNDUxMSA1LjM4MDgyIDUuNzIxMSA1LjcyNjA5IDUuNDU1NzEgNi4yMzA5OUM1LjMxMjYzIDYuNTE0NzUgNS4yMjgyMyA2LjgyMTYxIDUuMTQyMTQgNy4xMjQ0N0M1LjExODg0IDcuMjA2MTkgNS4wOTQwOSA3LjI4NzQ1IDUuMDY5MDUgNy4zNjg2OUM1LjA0OTQgNy40MzI2MSA1LjAzMDIgNy40OTY2MyA1LjAxMTQ5IDcuNTYwODFDNS4wMDkyNiA3LjU2ODQ0IDUuMDA3MDMgNy41NzYwOCA1LjAwNDczIDcuNTgzOTVDNC45OTM5NCA3LjYyMDk0IDQuOTgzMTkgNy42NTc5MyA0Ljk3MjUyIDcuNjk0OTVDNC45NDUxOSA3Ljc4ODc5IDQuOTE1NzggNy44ODE4NyA0Ljg4NTU1IDcuOTc0ODlDNC44MzE5MSA4LjE0MDIxIDQuNzgzMSA4LjMwNjc0IDQuNzM0NTkgOC40NzM1QzQuNjYxNDQgOC43MjQ1NyA0LjY2MTQ0IDguNzI0NTcgNC42MTk5NyA4Ljg0NTI3QzQuNjE3MjEgOC44NTMzNyA0LjYxNDQ2IDguODYxNDcgNC42MTE2MyA4Ljg2OTgyQzQuNTk2NDkgOC45MTI3OCA0LjU4MDkyIDguOTUyMzMgNC41NTIyNiA4Ljk4ODdDNC41MDg2NyA4Ljk5Nzg4IDQuNTA4NjcgOC45OTc4OCA0LjQ2OTUxIDlDNC40MjQ3MyA4LjkzNzU5IDQuMzk1MDggOC44NzcxMSA0LjM3MTMzIDguODA1MDhDNC4zNjc4NyA4Ljc5NDg3IDQuMzY0NDEgOC43ODQ2NiA0LjM2MDg1IDguNzc0MTVDNC4zMTY4NCA4LjY0MjQ4IDQuMjc3NTEgOC41MDk0NiA0LjIzODE3IDguMzc2NDZDNC4yMjkxNiA4LjM0NjA0IDQuMjIwMTEgOC4zMTU2NCA0LjIxMTA1IDguMjg1MjRDNC4xNDM2IDguMDU4NjMgNC4wNzcyNSA3LjgzMTc0IDQuMDExMDEgNy42MDQ4MUMzLjczNTA3IDYuNDgyMjQgMy43MzUwNyA2LjQ4MjI0IDMuMDM5IDUuNTc0NjZDMy4wMjc4NCA1LjU2NTk2IDMuMDE2NjkgNS41NTcyNiAzLjAwNTE5IDUuNTQ4M0MyLjU0OTEzIDUuMTk5MDIgMS45NDgzNCA1LjA2OTY5IDEuMzk4MTUgNC45MTgxM0MxLjI2MjA3IDQuODgwNjIgMS4xMjYwNSA0Ljg0MjkzIDAuOTkwMDMyIDQuODA1MjNDMC45NzgxMzggNC44MDE5MyAwLjk3ODEzOCA0LjgwMTkzIDAuOTY2MDAzIDQuNzk4NTdDMC43Njk4MTEgNC43NDQxNyAwLjU3MzY3NCA0LjY4OTYzIDAuMzc4MjI0IDQuNjMyODNDMC4zNjk5NTYgNC42MzA0NSAwLjM2MTY4OCA0LjYyODA2IDAuMzUzMTY5IDQuNjI1NjFDMC4wNTI4OTg5IDQuNTM4ODMgMC4wNTI4OTg5IDQuNTM4ODMgMC4wMDA2NDY1MzcgNC40NzgxQy0wLjAwMDgzMTI2MSA0LjQ1MDU0IC0wLjAwMDgzMTI2MSA0LjQ1MDU0IDAuMDEyNDY4OSA0LjQyMTU3QzAuMDY3MDgzNSA0LjM3MDQgMC4xMjAwNzcgNC4zNDg0OCAwLjE5MjE2IDQuMzI2MTlDMC4yMDI1OTcgNC4zMjI4NCAwLjIxMzAzNCA0LjMxOTQ4IDAuMjIzNzg3IDQuMzE2MDNDMC4yNTU3NTMgNC4zMDU4MiAwLjI4Nzc4OCA0LjI5NTg0IDAuMzE5ODUxIDQuMjg1OTJDMC4zMjkwMDEgNC4yODMwNSAwLjMzODE1MSA0LjI4MDE3IDAuMzQ3NTc4IDQuMjc3MjJDMC40MTIyODUgNC4yNTY5MyAwLjQ3NzIyNSA0LjIzNzQgMC41NDIyNTkgNC4yMTgwOUMwLjU1ODI0IDQuMjEzMzIgMC41NTgyNCA0LjIxMzMyIDAuNTc0NTQ0IDQuMjA4NDZDMC44NTIyNjkgNC4xMjU4NyAxLjEzMTgxIDQuMDQ5IDEuNDExMjYgMy45NzE5NkMxLjYxOTUgMy45MTQ1NSAxLjgyNzM4IDMuODU2MTggMi4wMzQ2IDMuNzk1NDhDMi4wNDQxMyAzLjc5MjcxIDIuMDUzNjUgMy43ODk5MyAyLjA2MzQ2IDMuNzg3MDdDMi41NDM1IDMuNjQ2OTYgMy4wMTI3OCAzLjQ0ODE2IDMuMzIyNzQgMy4wNTM3QzMuMzI3MzggMy4wNDc4NSAzLjMzMjAyIDMuMDQyIDMuMzM2OCAzLjAzNTk3QzMuNjgxOTcgMi41OTgxNSAzLjgxNjU4IDIuMDY1NzIgMy45NjY5NSAxLjU0NjIxQzQuMDE2NDMgMS4zNzUzNCA0LjA2NjQ5IDEuMjA0NjQgNC4xMTY3MyAxLjAzMzk5QzQuMTMwNjQgMC45ODY3MzMgNC4xNDQ1MyAwLjkzOTQ3MSA0LjE1ODM2IDAuODkyMTk0QzQuMjEzOTQgMC43MDIyODkgNC4yNzAzNSAwLjUxMjY0MiA0LjMzIDAuMzIzODY0QzQuMzM1NTggMC4zMDYxODYgNC4zNDExNCAwLjI4ODUwMSA0LjM0NjY2IDAuMjcwODA3QzQuNDMwMTcgMC4wMDM5ODc2MSA0LjQzMDE3IDAuMDAzOTg3NjEgNC41MDk0MSAwWlwiIGZpbGw9XCIjMERCRDdEXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yMzU5NyAwLjU1NDg1OUM3LjI5MDI0IDAuNjEzNTk5IDcuMzAxMDkgMC42ODI2MzEgNy4zMTc5OSAwLjc1NzYzOEM3LjM3NDM2IDAuOTkzMjY5IDcuNDM5MjkgMS4yMDk5MyA3LjY2NDY3IDEuMzQ2ODFDNy44MDM3MSAxLjQyMDM1IDcuOTY5NDQgMS40NTM4MSA4LjEyMzUgMS40ODU0MUM4LjE4ODU0IDEuNDk5MDIgOC4yNDM0OCAxLjUxNzA5IDguMjk5MjQgMS41NTMyMUM4LjMxMTgxIDEuNTcyMjkgOC4zMTE4MSAxLjU3MjI5IDguMzExMDcgMS42MDU0OUM4LjI5ODE0IDEuNjQ1ODggOC4yODY3OCAxLjY1ODkgOC4yNTI2OSAxLjY4NTMzQzguMjE1NDMgMS42OTcyNiA4LjIxNTQzIDEuNjk3MjYgOC4xNzA2OCAxLjcwNjUzQzguMTUzNzUgMS43MTAyNSA4LjEzNjgzIDEuNzE0IDguMTE5OTIgMS43MTc3OUM4LjExMDg2IDEuNzE5OCA4LjEwMTgxIDEuNzIxODEgOC4wOTI0NyAxLjcyMzg4QzcuODE2OTYgMS43ODQ4MiA3LjgxNjk2IDEuNzg0ODIgNy41Nzg4MiAxLjkyMjczQzcuNTcxMDggMS45Mjg2OSA3LjU2MzMzIDEuOTM0NjYgNy41NTUzNiAxLjk0MDhDNy4zODUxNiAyLjA4NDMxIDcuMzQ5MTYgMi4zMjMwMyA3LjI5NzkzIDIuNTIzMDFDNy4yOTQ5OSAyLjUzMzk5IDcuMjkyMDYgMi41NDQ5NyA3LjI4OTAzIDIuNTU2MjlDNy4yODY0OSAyLjU2NjAxIDcuMjgzOTUgMi41NzU3MyA3LjI4MTMzIDIuNTg1NzVDNy4yNzAyOCAyLjYxNTQ0IDcuMjU4ODEgMi42MzQ3OSA3LjIzNTk3IDIuNjU3NTRDNy4xNzIzNCAyLjY2NTI3IDcuMTcyMzQgMi42NjUyNyA3LjE0MTM5IDIuNjU3NTRDNy4wOTIxNiAyLjYyMTA2IDcuMDgxMTQgMi41Nzk1IDcuMDY4MjggMi41MjM2NUM3LjA2NjEzIDIuNTE1MDEgNy4wNjM5OCAyLjUwNjM2IDcuMDYxNzYgMi40OTc0NUM3LjA1NDg5IDIuNDY5ODMgNy4wNDgyNCAyLjQ0MjE3IDcuMDQxNjQgMi40MTQ0OUM2Ljk4OTc5IDIuMTk4OTcgNi45MzEyNiAxLjk4NzUxIDYuNzI0NTEgMS44NjExOEM2LjU2MjkzIDEuNzc1MDEgNi4zNjY0NiAxLjczNDI2IDYuMTg1ODcgMS43MDEzNkM2LjEzNjM3IDEuNjkxNTEgNi4xMDgwMiAxLjY3OTExIDYuMDc3MzggMS42NDAxMkM2LjA3MDczIDEuNjAwNTUgNi4wNzA3MyAxLjYwMDU1IDYuMDc3MzggMS41NjA5OEM2LjEyNDQ3IDEuNTE0MzcgNi4xNzQwMiAxLjUwMjk5IDYuMjM3NzIgMS40ODg5MUM2LjI1Nzc4IDEuNDg0MTYgNi4yNzc4NCAxLjQ3OTM4IDYuMjk3ODkgMS40NzQ1NkM2LjMwODI1IDEuNDcyMDkgNi4zMTg2MSAxLjQ2OTYyIDYuMzI5MjkgMS40NjcwN0M2LjM4MjEyIDEuNDU0MDcgNi40MzQ0MyAxLjQzOTQ5IDYuNDg2NzMgMS40MjQ2MkM2LjQ5NjIzIDEuNDIxOTggNi41MDU3MyAxLjQxOTM1IDYuNTE1NTIgMS40MTY2M0M2LjYyMTgyIDEuMzg2MjQgNi43MTM1NiAxLjM0NzM3IDYuNzk4NTQgMS4yNzgzNkM2LjgwNjQ3IDEuMjcyMTMgNi44MTQzOSAxLjI2NTg5IDYuODIyNTUgMS4yNTk0NkM2Ljk1NDggMS4xNDU2NSA2Ljk5OTc0IDAuOTc0Njc0IDcuMDQwNTMgMC44MTUxMzRDNy4wNDM2NCAwLjgwMzAyMiA3LjA0Njc1IDAuNzkwOTEgNy4wNDk5NSAwLjc3ODQzMkM3LjA1NjE0IDAuNzU0MTAxIDcuMDYyMjIgMC43Mjk3NDMgNy4wNjgxNyAwLjcwNTM1OUM3LjA3MjQzIDAuNjg4Mzk0IDcuMDcyNDMgMC42ODgzOTQgNy4wNzY3OCAwLjY3MTA4NkM3LjA3OTI3IDAuNjYwOTUxIDcuMDgxNzUgMC42NTA4MTYgNy4wODQzMSAwLjY0MDM3M0M3LjA5NTIxIDAuNjA4MTA4IDcuMTA5NTIgMC41ODI3NzIgNy4xMjk1NyAwLjU1NDg1OUM3LjE2ODEgMC41MzY0MzUgNy4xOTUxNSAwLjU0NDc2NCA3LjIzNTk3IDAuNTU0ODU5WlwiIGZpbGw9XCIjMDc1RjNGXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMS43OTU0NSA2LjI0NzFDMS44MDk1MSA2LjI0NzE5IDEuODA5NTEgNi4yNDcxOSAxLjgyMzg2IDYuMjQ3MjlDMS45MjQ3NyA2LjI1MDIyIDEuOTkzMDQgNi4yODExNSAyLjA2NzM2IDYuMzQ2MDFDMi4xNTM4NCA2LjQzNTMzIDIuMTkzNzcgNi41MzYxMSAyLjE5MTUgNi42NTY1QzIuMTgxNzggNi43NTQxMiAyLjEyMTU4IDYuODM5MzUgMi4wNDc3MyA2LjkwNTMzQzEuOTYwODEgNi45NzI0MiAxLjg3MzEzIDYuOTk0NTkgMS43NjIwNiA2Ljk5MTQ5QzEuNjY4NDEgNi45ODEwNyAxLjU4MDMgNi45Mzg1MiAxLjUxMzkzIDYuODc0NTFDMS40MzEzOCA2Ljc2NjgxIDEuNDA3MjUgNi42NjgwMyAxLjQxOTM1IDYuNTM1MzdDMS40NDQzMyA2LjQzMDkyIDEuNTE2MzcgNi4zNDYxMyAxLjYwODUgNi4yODY2NkMxLjY3MjUxIDYuMjU1NjQgMS43MjM5OSA2LjI0NjUyIDEuNzk1NDUgNi4yNDcxWlwiIGZpbGw9XCIjMERCRDdEXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICBTZWxmLWhlYWxlZFxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1weS0wLjUgY3FhLXB4LTEgY3FhLWJnLVsjNjM2NkYxMUFdIGNxYS1tbC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5XCIgXG4gICAgICAgICAgICpuZ0lmPVwic3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWVcIiBcbiAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0p1bXAgdG8gdmlkZW8gdGltZSdcIiBcbiAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAoY2xpY2spPVwib25KdW1wVG9UaW1lc3RhbXAoJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzYzNjM2M10gIWNxYS10ZXh0LVsxMHB4XSAhY3FhLXctWzEwcHhdICFjcWEtaC1bMTBweF1cIj5cbiAgICAgICAgICBwbGF5X2Fycm93XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzYzNjM2M11cIj5cbiAgICAgICAgICB7eyBmb3JtYXREdXJhdGlvbkNsb2NrKHN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lIHx8IDApIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImlzRGVidWdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wLjUgY3FhLXRleHQtWyM5Q0EzQUZdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXN0ZXA/LmlzU3RlcEdyb3VwQ2hpbGRyZW5cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZVwiIGFyaWEtbGFiZWw9XCJFZGl0XCIgKGNsaWNrKT1cIm9uRWRpdFN0ZXAoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXN0ZXA/LmlzU3RlcEdyb3VwQ2hpbGRyZW5cIiB0eXBlPVwiYnV0dG9uXCIgI2FkZFN0ZXBNZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZVwiIGFyaWEtbGFiZWw9XCJBZGRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWRkU3RlcE1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPmFkZDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI2FkZFN0ZXBNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLWFkZC1zdGVwLW1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIiB5UG9zaXRpb249XCJiZWxvd1wiPlxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgb3B0IG9mIGFkZFN0ZXBNZW51T3B0aW9uc1wiIChjbGljayk9XCJvbkFkZFN0ZXBPcHRpb25TZWxlY3Qob3B0LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVmZmVjdGl2ZVN0ZXBNb3JlTWVudU9wdGlvbnMubGVuZ3RoXCIgdHlwZT1cImJ1dHRvblwiICNzdGVwTW9yZU1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIk1vcmUgb3B0aW9uc1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJzdGVwTW9yZU1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI3N0ZXBNb3JlTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cImNxYS1zdGVwLW1vcmUtbWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2YgZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9uc1wiIChjbGljayk9XCJvblN0ZXBNb3JlT3B0aW9uU2VsZWN0KG9wdCwgJGV2ZW50KVwiPnt7IG9wdC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjOUNBM0FGXVwiPlxuICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihjb25maWcuZHVyYXRpb24pIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJpc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0zLjUgNUw3IDguNUwxMC41IDVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIj5cbiAgICA8IS0tIEl0ZXJhdGlvbiBTZWxlY3RvciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdXCIgKm5nSWY9XCIhaXNMaXZlIHx8IChpc0xpdmUgJiYgY29uZmlnPy5pdGVyYXRpb25zICE9PSB1bmRlZmluZWQpXCI+XG4gICAgICA8bGFiZWw+SXRlcmF0aW9uPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctZnVsbCBjcWEtbWF4LXctWzE1NnB4XVwiPlxuICAgICAgICA8IS0tIFN0YXR1cyBpbmRpY2F0b3IgZm9yIHNlbGVjdGVkIGl0ZXJhdGlvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uICYmIGNvbmZpZz8uaXRlcmF0aW9ucyAmJiBjb25maWc/Lml0ZXJhdGlvbnM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC1bMTBweF0gY3FhLXRvcC0xLzIgY3FhLXRyYW5zZm9ybSBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiIzAwQTYzRVwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAnZmFpbGVkJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiI0VGNDQ0NFwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAncGVuZGluZydcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCA2IDZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIzXCIgZmlsbD1cIiM5Q0EzQUZcIi8+PC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjM0I4MkY2XCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIGNsYXNzPVwiY3FhLXBsLVsyMnB4XSBjcWEtcHItNiBjcWEtcHktWzVweF0gY3FhLXctZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy1bI0ZBRkFGQV0gY3FhLXRleHQtYmxhY2stMTAwIGNxYS1hcHBlYXJhbmNlLW5vbmVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJdGVyYXRpb25cIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUl0ZXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUl0ZXJhdGlvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihpc0xpdmUgJiYgKHN0YXR1cyA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1cyA9PT0gJ1JVTk5JTkcnKSlcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiIWNvbmZpZz8uaXRlcmF0aW9ucyB8fCBjb25maWc/Lml0ZXJhdGlvbnM/Lmxlbmd0aCA9PT0gMFwiIHZhbHVlPVwiXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICBObyBpdGVyYXRpb25zIGF2YWlsYWJsZVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZXJhdGlvbiBvZiBjb25maWcuaXRlcmF0aW9uc1wiIFtuZ1ZhbHVlXT1cIml0ZXJhdGlvblwiPlxuICAgICAgICAgICAge3sgZ2V0SXRlcmF0aW9uTGFiZWwoaXRlcmF0aW9uKSB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPCEtLSBEcm9wZG93biBhcnJvdyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgMTAgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMSAxTDUgNUw5IDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWwtYXV0b1wiICpuZ0lmPVwiY29uZmlnPy5pdGVyYXRpb25zICYmIGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICBEZWZhdWx0OiB7eyBjb25maWcuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnID8gJ2xhc3QgaXRlcmF0aW9uJyA6ICdmaXJzdCBpdGVyYXRpb24nIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlbGVjdGVkIEl0ZXJhdGlvbiBTdWItc3RlcHMgLS0+XG4gICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uICYmIHNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1weS0xIGNxYS1tbC05XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAnMXB4IHNvbGlkICNGM0Y0RjYnXCI+XG4gICAgICA8IS0tIFNpbmdsZSBsb29wOiByZW5kZXIgYWxsIGVudHJpZXMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlN0ZXAgb2YgKGlzTGl2ZSA/IHByb2Nlc3NlZFN1YlN0ZXBzIDogcHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQpXCI+XG4gICAgICAgIDwhLS0gQUlfQVVUT19IRUFMX1NVQ0NFU1MvRkFJTEVEOiByZW5kZXIgd2l0aCBhaS1hZ2VudC1zdGVwIHN0eWxlIChib3RoIGxpdmUgYW5kIHJ1biByZXN1bHQgc2NyZWVucykgLS0+XG4gICAgICAgIDxjcWEtYWktbG9ncy13aXRoLXJlYXNvbmluZ1xuICAgICAgICAgICpuZ0lmPVwiJGFueShzdWJTdGVwKS5pc0FpQXV0b0hlYWxSZXN1bHRcIlxuICAgICAgICAgIFtzdGF0dXNdPVwic3ViU3RlcC5zdGF0dXNcIlxuICAgICAgICAgIFt0ZXh0XT1cIiRhbnkoc3ViU3RlcCkudGV4dCB8fCBzdWJTdGVwPy52YWx1ZVwiXG4gICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cIiRhbnkoc3ViU3RlcCkuZGVzY3JpcHRpb24gfHwgc3ViU3RlcD8udGV4dCB8fCBzdWJTdGVwPy52YWx1ZVwiXG4gICAgICAgICAgW3JlYXNvbmluZ109XCIkYW55KHN1YlN0ZXApLnJlYXNvbmluZyB8fCBzdWJTdGVwPy5yZWFzb25pbmdcIlxuICAgICAgICAgIFtkdXJhdGlvbl09XCJzdWJTdGVwLmR1cmF0aW9uXCI+XG4gICAgICAgIDwvY3FhLWFpLWxvZ3Mtd2l0aC1yZWFzb25pbmc+XG5cbiAgICAgICAgPCEtLSBSZWd1bGFyIHN1Yi1zdGVwcyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiISRhbnkoc3ViU3RlcCkuaXNBaUF1dG9IZWFsUmVzdWx0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS1bNS41cHhdIGNxYS1weC0zXCI+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBTdWItc3RlcCBTdGF0dXMgSWNvbiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnc3VjY2VzcycgfHwgc3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAncGFzc2VkJ1wiID5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAuOTAwNSA0Ljk5OTk5QzExLjEyODkgNi4xMjA2NCAxMC45NjYyIDcuMjg1NzEgMTAuNDM5NSA4LjMwMDg5QzkuOTEyNzkgOS4zMTYwOCA5LjA1NCAxMC4xMiA4LjAwNjMxIDEwLjU3ODdDNi45NTg2MiAxMS4wMzczIDUuNzg1MzYgMTEuMTIyOSA0LjY4MjIgMTAuODIxMkMzLjU3OTA0IDEwLjUxOTUgMi42MTI2NSA5Ljg0ODY5IDEuOTQ0MTkgOC45MjA3MUMxLjI3NTczIDcuOTkyNzIgMC45NDU2MTEgNi44NjM2MSAxLjAwODg4IDUuNzIxNjlDMS4wNzIxNSA0LjU3OTc2IDEuNTI0OTkgMy40OTQwNCAyLjI5MTg4IDIuNjQ1NThDMy4wNTg3NiAxLjc5NzEyIDQuMDkzMzQgMS4yMzcyMSA1LjIyMzA4IDEuMDU5MjJDNi4zNTI4MiAwLjg4MTIzMyA3LjUwOTQ0IDEuMDk1OTIgOC41MDAwNSAxLjY2NzQ5XCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSA1LjVMNiA3TDExIDJcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gRmFpbHVyZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbHVyZScgfHwgc3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbGVkJ1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiNEQzI2MjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk03LjUgNC41TDQuNSA3LjVcIiBzdHJva2U9XCIjREMyNjI2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDQuNUw3LjUgNy41XCIgc3Ryb2tlPVwiI0RDMjYyNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIFBlbmRpbmcgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3BlbmRpbmcnXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBSdW5uaW5nIC0gU2hvdyBzcGlubmVyIChhbHNvIHVzZWQgZm9yIGFjdGl2ZSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpbiBsaXZlIG1vZGUpIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJ1wiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLXRleHQtWyMzQjgyRjZdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBvcGFjaXR5PVwiMC4yNVwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDFBNSA1IDAgMCAxIDExIDZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdza2lwcGVkJ1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgc2tpcF9uZXh0XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIERlc2NyaXB0aW9uIC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1bMTNweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS10ZXh0LVsjMzY0MTUzXVwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS1saW5lOyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiPlxuICAgICAgICAgICAge3sgJGFueShzdWJTdGVwKS5kZXNjcmlwdGlvbiB8fCAkYW55KHN1YlN0ZXApLnRleHQgfX1cbiAgICAgICAgICAgIDwhLS0gQ291bnRkb3duIGZvciBhY3RpdmUgV0FJVF9GT1JfTE9DQVRPUiBpbiBsaXZlIG1vZGUgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTGl2ZSAmJiAkYW55KHN1YlN0ZXApLnJlbWFpbmluZ1NlY29uZHMgIT0gbnVsbFwiIGNsYXNzPVwiY3FhLXRleHQtWyNGOTczMTZdIGNxYS1mb250LW1lZGl1bSBjcWEtbWwtMVwiPih7eyAkYW55KHN1YlN0ZXApLnJlbWFpbmluZ1NlY29uZHMgfX1zIHJlbWFpbmluZyk8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBTdWItc3RlcCBEdXJhdGlvbiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LW1ldGFkYXRhLWtleVwiPlxuICAgICAgICAgICAge3sgZm9ybWF0RHVyYXRpb24oc3ViU3RlcC5kdXJhdGlvbikgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5lc3RlZCBTdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzQ2hpbGQgfHwgKGNvbmZpZy5uZXN0ZWRTdGVwcyAmJiBjb25maWcubmVzdGVkU3RlcHMubGVuZ3RoID4gMClcIiBjbGFzcz1cImNxYS1tbC05IGNxYS1wYi0xIGNxYS1uZXN0ZWQtc3RlcHMtY29udGFpbmVyXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAnMXB4IHNvbGlkICNGM0Y0RjYnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdIGNxYS1weS1bMnB4XSBjcWEtcHgtM1wiPk5lc3RlZCBzdGVwczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXBsLVsxOHB4XVwiIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQzVDN0ZBO1wiPlxuICAgICAgICA8IS0tIExvYWRpbmcgaW5kaWNhdG9yIHdoZW4gbmVzdGVkIHN0ZXBzIGFyZSBiZWluZyBsb2FkZWQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJoYXNDaGlsZCAmJiAoIWNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBjb25maWcubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSAmJiBpc1N0ZXBMb2FkaW5nKClcIiBcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weS0yIGNxYS1weC0zXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLXRleHQtWyMzQjgyRjZdXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgb3BhY2l0eT1cIjAuMjVcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMUE2IDYgMCAwIDEgMTMgN1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMXB4XSBjcWEtbGVhZGluZy1bMTNweF0gY3FhLXRleHQtWyM3MzczNzNdXCI+TG9hZGluZyBuZXN0ZWQgc3RlcHMuLi48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIGNvbmZpZy5uZXN0ZWRTdGVwczsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgIDwhLS0gV3JhcHBlciB0byBzaG93IHNrZWxldG9uIHdoaWxlIHN0ZXAtcmVuZGVyZXIgaXMgbG9hZGluZyAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNxYS1zdGVwLXJlbmRlcmVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2V4Yy0nICsgc3RlcC5pZFwiXG4gICAgICAgICAgICBbY2xhc3MubG9hZGVkXT1cIiFpc05lc3RlZFN0ZXBMb2FkaW5nKHN0ZXApXCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gb3ZlcmxheSAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImlzTmVzdGVkU3RlcExvYWRpbmcoc3RlcClcIiBjbGFzcz1cImNxYS1zdGVwLXNrZWxldG9uLW92ZXJsYXlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1zdGVwLXNrZWxldG9uIGNxYS1teC0zIGNxYS1teS0xXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tIFVzZSBzdGVwLXJlbmRlcmVyIGZvciBhbGwgbmVzdGVkIHN0ZXBzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyAtLT5cbiAgICAgICAgICAgIDwhLS0gVGhlIHN0ZXAtcmVuZGVyZXIgd2lsbCBkeW5hbWljYWxseSBsb2FkIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQgYW5kIHBhc3MgaGFuZGxlcnMgLS0+XG4gICAgICAgICAgICA8Y3FhLXN0ZXAtcmVuZGVyZXIgXG4gICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgICBbc3RlcE51bWJlcl09XCJzdGVwLnN0ZXBOdW1iZXIgfHwgKHN0ZXBOdW1iZXIgKyAnLicgKyAoaSArIDEpKVwiXG4gICAgICAgICAgICAgIFtvbkV4cGFuZEhhbmRsZXJdPVwib25FeHBhbmRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcl09XCJnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXJdPVwib25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbaXNTdGVwTG9hZGluZ0hhbmRsZXJdPVwiaXNTdGVwTG9hZGluZ0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbaXNTdGVwRXhwYW5kZWRIYW5kbGVyXT1cImlzU3RlcEV4cGFuZGVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyXT1cImNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyXT1cImZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcl09XCJnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXJdPVwiZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldEFwaUFzc2VydGlvbnNIYW5kbGVyXT1cImdldEFwaUFzc2VydGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2Zvcm1hdEFjdGlvbnNIYW5kbGVyXT1cImZvcm1hdEFjdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyXT1cIm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXJdPVwib25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblVwbG9hZEJhc2VsaW5lSGFuZGxlcl09XCJvblVwbG9hZEJhc2VsaW5lSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyXT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25BbmFseXplSGFuZGxlcl09XCJvbkFuYWx5emVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVmlld0Z1bGxMb2dzSGFuZGxlcl09XCJvblZpZXdGdWxsTG9nc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25TZWxmSGVhbEFjdGlvbkhhbmRsZXJdPVwib25TZWxmSGVhbEFjdGlvbkhhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25TdGVwQ2xpY2tIYW5kbGVyXT1cIm9uU3RlcENsaWNrSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkpzb25QYXRoQ29waWVkSGFuZGxlcl09XCJvbkpzb25QYXRoQ29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkRvd25sb2FkSGFuZGxlcl09XCJvbkRvd25sb2FkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkZpbGVQYXRoQ29waWVkSGFuZGxlcl09XCJvbkZpbGVQYXRoQ29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblRleHRDb3BpZWRIYW5kbGVyXT1cIm9uVGV4dENvcGllZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbanVtcFRvVGltZXN0YW1wSGFuZGxlcl09XCJqdW1wVG9UaW1lc3RhbXBIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2Rvd25sb2FkaW5nU3RlcElkXT1cImRvd25sb2FkaW5nU3RlcElkXCJcbiAgICAgICAgICAgICAgW2lzVXBsb2FkaW5nQmFzZWxpbmVdPVwiaXNVcGxvYWRpbmdCYXNlbGluZVwiXG4gICAgICAgICAgICAgIFtpc01ha2luZ0N1cnJlbnRCYXNlbGluZV09XCJpc01ha2luZ0N1cnJlbnRCYXNlbGluZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZXJhdGlvbklkXT1cInN0ZXA/LnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgJydcIlxuICAgICAgICAgICAgW2lzTGl2ZV09XCJpc0xpdmVcIlxuICAgICAgICAgICAgW2lzRGVidWddPVwiaXNEZWJ1Z1wiXG4gICAgICAgICAgICBbcGFyZW50U2tpcHBlZF09XCJzZWxmRGVidWdEaXNhYmxlZFwiXG4gICAgICAgICAgICBbZGVidWdQb2ludFNldF09XCJnZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA/IGdldERlYnVnUG9pbnRTZXRIYW5kbGVyKHN0ZXApIDogZGVidWdQb2ludFNldFwiXG4gICAgICAgICAgICBbZ2V0RGVidWdQb2ludFNldEhhbmRsZXJdPVwiZ2V0RGVidWdQb2ludFNldEhhbmRsZXJcIlxuICAgICAgICAgICAgW29uRGVidWdQb2ludENoYW5nZUhhbmRsZXJdPVwib25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlclwiXG4gICAgICAgICAgICBbb25FZGl0U3RlcEhhbmRsZXJdPVwib25FZGl0U3RlcEhhbmRsZXJcIlxuICAgICAgICAgICAgW2FkZFN0ZXBNZW51T3B0aW9uc109XCJnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPyBnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQoc3RlcCkgOiBhZGRTdGVwTWVudU9wdGlvbnNcIlxuICAgICAgICAgICAgW29uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXJdPVwib25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlclwiXG4gICAgICAgICAgICBbc3RlcE1vcmVNZW51T3B0aW9uc109XCJnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID8gZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZChzdGVwKSA6IHN0ZXBNb3JlTWVudU9wdGlvbnNcIlxuICAgICAgICAgICAgW29uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyXT1cIm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyXCJcbiAgICAgICAgICAgIFtnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWRdPVwiZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkXCJcbiAgICAgICAgICAgIFtnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkXT1cImdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWRcIlxuICAgICAgICAgICAgICAoYWRkU3RlcEluc2lkZUxvb3ApPVwiYWRkU3RlcEluc2lkZUxvb3AuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNvbXBvbmVudFJlYWR5KT1cIm1hcmtTdGVwTG9hZGVkKHN0ZXApXCI+XG4gICAgICAgICAgICA8L2NxYS1zdGVwLXJlbmRlcmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSArIEFkZCBzdGVwIGluc2lkZSBsb29wIChkZWJ1ZyBvbmx5KSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNEZWJ1Z1wiIGNsYXNzPVwiY3FhLW1sLTkgY3FhLXB5LTIgY3FhLXBsLVsxOHB4XVwiIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQzVDN0ZBO1wiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEluc2lkZUxvb3AoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLTAgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBmb2N1czpjcWEtb3V0bGluZS1ub25lXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNyAyVjEyTTIgN0gxMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3Bhbj5BZGQgc3RlcCBpbnNpZGUgbG9vcDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBWaWV3IEFsbCBJdGVyYXRpb25zIExpbmsgLS0+XG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZy5zaG93Vmlld0FsbEl0ZXJhdGlvbnMgJiYgIWlzTGl2ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kIGNxYS1weC0zIGNxYS1weS1bMTBweF1cIj5cbiAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0FsbEl0ZXJhdGlvbnNDbGljaygkZXZlbnQpXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1uby11bmRlcmxpbmUgY3FhLXRleHQtcHJpbWFyeSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICBWaWV3IGFsbCBpdGVyYXRpb25zXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNy42MzYzNiAxMS4yNjdMNi43NTg1MiAxMC4zOTc3TDkuMzg3NzggNy43Njg0N0gzVjYuNDk4NThIOS4zODc3OEw2Ljc1ODUyIDMuODczNThMNy42MzYzNiAzTDExLjc2OTkgNy4xMzM1Mkw3LjYzNjM2IDExLjI2N1pcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWxmIEhlYWwgQW5hbHlzaXMgLS0+XG4gICAgPGNxYS1zZWxmLWhlYWwtYW5hbHlzaXMgXG4gICAgICAqbmdJZj1cInNlbGZIZWFsQW5hbHlzaXNcIlxuICAgICAgW2lkXT1cInN0ZXA/LnRlc3RTdGVwSWRcIlxuICAgICAgW29yaWdpbmFsTG9jYXRvcl09XCJzZWxmSGVhbEFuYWx5c2lzLm9yaWdpbmFsTG9jYXRvclwiXG4gICAgICBbaGVhbGVkTG9jYXRvcl09XCJzZWxmSGVhbEFuYWx5c2lzLmhlYWxlZExvY2F0b3JcIlxuICAgICAgW2NvbmZpZGVuY2VdPVwic2VsZkhlYWxBbmFseXNpcy5jb25maWRlbmNlXCJcbiAgICAgIFtoZWFsTWV0aG9kXT1cInNlbGZIZWFsQW5hbHlzaXMuaGVhbE1ldGhvZFwiXG4gICAgICBbaXNMb2FkaW5nQWNjZXB0XT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPyBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKCkuaXNMb2FkaW5nQWNjZXB0Py5bc3RlcD8udGVzdFN0ZXBJZF0gOiBmYWxzZVwiXG4gICAgICBbaXNMb2FkaW5nTW9kaWZ5QWNjZXB0XT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPyBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKCkuaXNMb2FkaW5nTW9kaWZ5QWNjZXB0Py5bc3RlcD8udGVzdFN0ZXBJZF0gOiBmYWxzZVwiXG4gICAgICAoYWN0aW9uKT1cIm9uU2VsZkhlYWxBY3Rpb24oJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlbGYtaGVhbC1hbmFseXNpcz5cblxuICAgIDwhLS0gVGltaW5nIEJyZWFrZG93biAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnRpbWluZ0JyZWFrZG93blwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1lbmQgY3FhLWdhcC01IGNxYS1wdC0xLjUgY3FhLXB4LTQgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdj48c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG4gICAgICAgIDxzcGFuPlRpbWluZyBicmVha2Rvd248L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZGlhbG9nLW11dGVkIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgQXBwIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDBcIj57eyBmb3JtYXREdXJhdGlvbihjb25maWcudGltaW5nQnJlYWtkb3duLmFwcCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEgMTFcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTS0zLjgxNDdlLTA2IDEwLjMyVi03LjE1MjU2ZS0wN0gwLjk1OTk5NlYxMC4zMkgtMy44MTQ3ZS0wNlpcIiBmaWxsPVwiI0U1RTdFQlwiLz48L3N2Zz48L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICBUb29sIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDBcIj57eyBmb3JtYXREdXJhdGlvbihjb25maWcudGltaW5nQnJlYWtkb3duLnRvb2wpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBWaWV3IE1vcmUgRmFpbGVkIFN0ZXAgQnV0dG9uIC0gc2hvd24gd2hlbiBleHBhbmRlZCBhbmQgZmFpbHVyZSBkZXRhaWxzIGV4aXN0IC0tPlxuICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZXdNb3JlQnV0dG9uXCIgY2xhc3M9XCJjcWEtbXQtMiBjcWEtcHgtNFwiPlxuICAgIDxjcWEtdmlldy1tb3JlLWZhaWxlZC1zdGVwLWJ1dHRvblxuICAgICAgW3RpbWluZ0JyZWFrZG93bl09XCJ0aW1pbmdCcmVha2Rvd25cIlxuICAgICAgW3N1YlN0ZXBzXT1cImdldFN1YlN0ZXBzRm9yRmFpbGVkU3RlcCgpXCJcbiAgICAgIFtmYWlsdXJlRGV0YWlsc109XCJmYWlsdXJlRGV0YWlsc1wiXG4gICAgICBbaXNFeHBhbmRlZF09XCJzaG93RmFpbGVkU3RlcERldGFpbHNcIlxuICAgICAgKHZpZXdNb3JlQ2xpY2spPVwib25WaWV3TW9yZUZhaWxlZFN0ZXBDbGljaygkZXZlbnQpXCI+XG4gICAgPC9jcWEtdmlldy1tb3JlLWZhaWxlZC1zdGVwLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBVcGRhdGVkIEZhaWxlZCBTdGVwIENvbXBvbmVudCAtIHNob3duIHdoZW4gYnV0dG9uIGlzIGNsaWNrZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJzaG93Vmlld01vcmVCdXR0b24gJiZzaG93RmFpbGVkU3RlcERldGFpbHMgJiYgZmFpbHVyZURldGFpbHNcIiBjbGFzcz1cImNxYS1tdC0yIGNxYS1weC00XCI+XG4gICAgPGNxYS11cGRhdGVkLWZhaWxlZC1zdGVwXG4gICAgICBbdGVzdFN0ZXBSZXN1bHRJZF09XCJ0ZXN0U3RlcFJlc3VsdElkXCJcbiAgICAgIFt0aW1pbmdCcmVha2Rvd25dPVwidGltaW5nQnJlYWtkb3duXCJcbiAgICAgIFtleHBhbmRlZF09XCJ0cnVlXCJcbiAgICAgIFtzdWJTdGVwc109XCJnZXRTdWJTdGVwc0ZvckZhaWxlZFN0ZXAoKVwiXG4gICAgICBbZmFpbHVyZURldGFpbHNdPVwiZmFpbHVyZURldGFpbHNcIlxuICAgICAgW3JlYXNvbmluZ109XCJyZWFzb25pbmdcIlxuICAgICAgW2NvbmZpZGVuY2VdPVwiY29uZmlkZW5jZVwiXG4gICAgICBbaXNVcGxvYWRpbmdCYXNlbGluZV09XCJpc1VwbG9hZGluZ0Jhc2VsaW5lXCJcbiAgICAgIFtpc01ha2luZ0N1cnJlbnRCYXNlbGluZV09XCJpc01ha2luZ0N1cnJlbnRCYXNlbGluZVwiXG4gICAgICBbaXNMaXZlXT1cImlzTGl2ZVwiXG4gICAgICAobWFrZUN1cnJlbnRCYXNlbGluZSk9XCJvbk1ha2VDdXJyZW50QmFzZWxpbmUoJGV2ZW50KVwiXG4gICAgICAodXBsb2FkQmFzZWxpbmUpPVwib25VcGxvYWRCYXNlbGluZSgkZXZlbnQpXCJcbiAgICAgIChhbmFseXplKT1cIm9uQW5hbHl6ZSgpXCJcbiAgICAgICh2aWV3RnVsbExvZ3MpPVwib25WaWV3RnVsbExvZ3MoKVwiPlxuICAgIDwvY3FhLXVwZGF0ZWQtZmFpbGVkLXN0ZXA+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
1289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXVELFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFFM0osT0FBTyxFQUE0Tiw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2VixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVEzRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsaUJBQWlCO0lBTHhEOztRQWtCVyxxQkFBZ0IsR0FBc0IsTUFBTSxDQUFDO1FBSTdDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFhLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUcvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQy9DLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3hFLHVKQUF1SjtRQUM3SSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzdDLHVCQUFrQixHQUF3Qiw2QkFBNkIsQ0FBQztRQUN4RSx3QkFBbUIsR0FBeUIsOEJBQThCLENBQUM7UUFxQzNF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QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csK0JBQStCO3NCQUF2QyxLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQWVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBSTBCLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBQ0csbUJBQW1CO3NCQUFwRCxTQUFTO3VCQUFDLHFCQUFxQjtnQkEwQ3RCLFFBQVE7c0JBQWpCLE1BQU07Z0JBR0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUdHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBEb0NoZWNrIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTG9vcFN0ZXBDb25maWcsIExvb3BJdGVyYXRpb24sIEV4ZWN1dGlvblN0ZXBDb25maWcsIFN0ZXBTdGF0dXMsIFRpbWluZ0JyZWFrZG93biwgRmFpbHVyZURldGFpbHMsIFN1YlN0ZXAsIFNlbGZIZWFsQW5hbHlzaXNEYXRhLCBTZWxmSGVhbEFjdGlvbiwgU3RlcEdyb3VwQ29uZmlnLCBDb25kaXRpb25CcmFuY2gsIFNlbGZIZWFsQWN0aW9uRXZlbnQsIEFkZFN0ZXBNZW51T3B0aW9uLCBERUZBVUxUX0FERF9TVEVQX01FTlVfT1BUSU9OUywgU3RlcE1vcmVNZW51T3B0aW9uLCBERUZBVUxUX1NURVBfTU9SRV9NRU5VX09QVElPTlMgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgQmFzZVN0ZXBDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLXN0ZXAuY29tcG9uZW50JztcbmltcG9ydCB7IG1ha2VDdXJyZW50QmFzZWxpbmVFdmVudCwgdXBsb2FkQmFzZWxpbmVFdmVudCB9IGZyb20gJy4uL3Zpc3VhbC1jb21wYXJpc29uL3Zpc3VhbC1jb21wYXJpc29uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1sb29wLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290IGNxYS13LWZ1bGwnIH1cbn0pXG5leHBvcnQgY2xhc3MgTG9vcFN0ZXBDb21wb25lbnQgZXh0ZW5kcyBCYXNlU3RlcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xuICAvLyBJbmRpdmlkdWFsIGlucHV0c1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgdGVzdFN0ZXBSZXN1bHRJZCE6IHN0cmluZztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IHN0cmluZztcbiAgQElucHV0KCkgdGl0bGUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXR1cyE6IFN0ZXBTdGF0dXM7XG4gIEBJbnB1dCgpIGR1cmF0aW9uITogbnVtYmVyO1xuICBASW5wdXQoKSB0aW1pbmdCcmVha2Rvd24/OiBUaW1pbmdCcmVha2Rvd247XG4gIEBJbnB1dCgpIGV4cGFuZGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgbG9vcFR5cGU/OiAnZm9yJyB8ICd3aGlsZSc7XG4gIEBJbnB1dCgpIGl0ZXJhdGlvbnMhOiBMb29wSXRlcmF0aW9uW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlcmF0aW9uSWQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRJdGVyYXRpb24/OiAnZmlyc3QnIHwgJ2xhc3QnID0gJ2xhc3QnO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwcz86IEV4ZWN1dGlvblN0ZXBDb25maWdbXTtcbiAgQElucHV0KCkgc2hvd1ZpZXdBbGxJdGVyYXRpb25zPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaGFzQ2hpbGQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgc3RlcERlbGV0ZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBpc0RlYnVnPzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWJ1Z1BvaW50U2V0PzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYXJlbnRTa2lwcGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBnZXREZWJ1Z1BvaW50U2V0SGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBvbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIHZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuICBAT3V0cHV0KCkgZGVidWdQb2ludENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGVkaXRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgYWRkU3RlcE9wdGlvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8QWRkU3RlcE1lbnVPcHRpb24+KCk7XG4gIEBPdXRwdXQoKSBzdGVwTW9yZU9wdGlvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RlcE1vcmVNZW51T3B0aW9uPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFwiKyBBZGQgc3RlcCBpbnNpZGUgbG9vcFwiIChkZWJ1ZyBvbmx5KS4gUGF5bG9hZCBpcyB0aGUgbG9vcCBzdGVwIHNvIHBhcmVudCBjYW4gb3BlbiBBZGQgU3RlcCBtb2RhbCBhdCBhbnkgbmVzdGluZyBsZXZlbC4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBJbnNpZGVMb29wID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIGFkZFN0ZXBNZW51T3B0aW9uczogQWRkU3RlcE1lbnVPcHRpb25bXSA9IERFRkFVTFRfQUREX1NURVBfTUVOVV9PUFRJT05TO1xuICBASW5wdXQoKSBzdGVwTW9yZU1lbnVPcHRpb25zOiBTdGVwTW9yZU1lbnVPcHRpb25bXSA9IERFRkFVTFRfU1RFUF9NT1JFX01FTlVfT1BUSU9OUztcblxuICAvLyBIYW5kbGVyIGZ1bmN0aW9uIHRvIHBhc3MgZG93biB0byBuZXN0ZWQgY2hpbGQgc3RlcCBncm91cHMgZm9yIHJlY3Vyc2l2ZSBleHBhbnNpb25cbiAgQElucHV0KCkgb25FeHBhbmRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwYXNzZWQgdG8gbmVzdGVkIHN0ZXAtcmVuZGVyZXIgc28gRWRpdCBvbiBuZXN0ZWQgc3RlcHMgaXMgZm9yd2FyZGVkIHdpdGggdGhlIHN0ZXAgY29uZmlnLiAqL1xuICBASW5wdXQoKSBvbkVkaXRTdGVwSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24sIHN0ZXA/OiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbiwgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCB1c2VkIHRvIGdldCBhZGQtc3RlcCBtZW51IG9wdGlvbnMgcGVyIG5lc3RlZCBzdGVwOyBvdGhlcndpc2UgYWRkU3RlcE1lbnVPcHRpb25zIGlzIHVzZWQgZm9yIGFsbC4gKi9cbiAgQElucHV0KCkgZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IEFkZFN0ZXBNZW51T3B0aW9uW107XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCB1c2VkIHRvIGdldCBzdGVwLW1vcmUgbWVudSBvcHRpb25zIHBlciBuZXN0ZWQgc3RlcDsgb3RoZXJ3aXNlIHN0ZXBNb3JlTWVudU9wdGlvbnMgaXMgdXNlZCBmb3IgYWxsLiAqL1xuICBASW5wdXQoKSBnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IFN0ZXBNb3JlTWVudU9wdGlvbltdO1xuXG4gIC8vIEhhbmRsZXIgZnVuY3Rpb25zIGZvciBjb25kaXRpb24gc3RlcHNcbiAgQElucHV0KCkgZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IENvbmRpdGlvbkJyYW5jaFtdO1xuICBASW5wdXQoKSBvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj86IChzdGVwOiBhbnksIGJyYW5jaDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBpc1N0ZXBMb2FkaW5nSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcj86IChkdXJhdGlvbjogbnVtYmVyKSA9PiBudW1iZXI7XG4gIEBJbnB1dCgpIGZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblVwbG9hZEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkFuYWx5emVIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25WaWV3RnVsbExvZ3NIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcj86ICgpID0+IHsgaXNMb2FkaW5nQWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTsgaXNMb2FkaW5nTW9kaWZ5QWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB9O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIGV2ZW50PzogRXZlbnQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiAncmVxdWVzdEJvZHknIHwgJ3Jlc3BvbnNlQm9keScgfCAncmVxdWVzdEhlYWRlcnMnIHwgJ3Jlc3BvbnNlSGVhZGVycycgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Eb3dubG9hZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZU5hbWU6IHN0cmluZzsgZmlsZVBhdGg/OiBzdHJpbmc7IGZpbGVUeXBlOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkZpbGVQYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBmaWxlUGF0aDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25UZXh0Q29waWVkSGFuZGxlcj86IChldmVudDogeyB0ZXh0OiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBqdW1wVG9UaW1lc3RhbXBIYW5kbGVyPzogKHRpbWVzdGFtcDogbnVtYmVyLCB0ZXN0U3RlcElkPzogbnVtYmVyIHwgc3RyaW5nKSA9PiB2b2lkO1xuICBASW5wdXQoKSBkb3dubG9hZGluZ1N0ZXBJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXA/OiBhbnk7XG4gIGdldCBzdGVwQmFkZ2VzKCk6ICgnc2tpcHBlZCcgfCAnZWRpdGVkJyB8ICdhZGRlZCcgfCAncmVtb3ZlZCcpW10ge1xuICAgIGNvbnN0IGJhZGdlID0gdGhpcy5zdGVwPy5zdGVwQmFkZ2U7XG4gICAgaWYgKCFiYWRnZSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGJhZGdlKSA/IGJhZGdlIDogW2JhZGdlXTtcbiAgfVxuXG4gIGdldCBpc1NraXBwZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcEJhZGdlcy5pbmNsdWRlcygnc2tpcHBlZCcpO1xuICB9XG5cbiAgZ2V0IGlzU3RlcERlbGV0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcEJhZGdlcy5pbmNsdWRlcygncmVtb3ZlZCcpO1xuICB9XG5cbiAgQElucHV0KCkgZmFpbHVyZURldGFpbHM/OiBGYWlsdXJlRGV0YWlscztcbiAgQElucHV0KCkgcmVhc29uaW5nPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGNvbmZpZGVuY2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmUgPSB7fTtcbiAgQElucHV0KCkgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB7fTtcbiAgQElucHV0KCkgc2VsZkhlYWxBbmFseXNpcz86IFNlbGZIZWFsQW5hbHlzaXNEYXRhO1xuICBASW5wdXQoKSBpdGVyYXRpb25EYXRhPzogYW55O1xuICBAT3V0cHV0KCkgbWFrZUN1cnJlbnRCYXNlbGluZSA9IG5ldyBFdmVudEVtaXR0ZXI8bWFrZUN1cnJlbnRCYXNlbGluZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgdXBsb2FkQmFzZWxpbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHVwbG9hZEJhc2VsaW5lRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhbmFseXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlld0Z1bGxMb2dzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2VsZkhlYWxBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGZIZWFsQWN0aW9uRXZlbnQ+KCk7XG5cbiAgc2hvd0ZhaWxlZFN0ZXBEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnYWRkU3RlcE1lbnVUcmlnZ2VyJykgYWRkU3RlcE1lbnVUcmlnZ2VyPzogTWF0TWVudVRyaWdnZXI7XG4gIEBWaWV3Q2hpbGQoJ3N0ZXBNb3JlTWVudVRyaWdnZXInKSBzdGVwTW9yZU1lbnVUcmlnZ2VyPzogTWF0TWVudVRyaWdnZXI7XG5cbiAgLyoqIFNob3cgZGVidWcgaWNvbiB3aGVuIGRlYnVnIG1vZGUgaXMgb24gKHNob3duIG9uIHBhcmVudCBhbmQgYWxsIGNoaWxkIHN0ZXBzKS4gKi9cbiAgZ2V0IHNob3dEZWJ1Z0ljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEZWJ1ZyA9PT0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBQZXItc3RlcCBmaWx0ZXJlZCB0aHJlZS1kb3QgbWVudSBvcHRpb25zIChlLmcuIGhpZGUgRHVwbGljYXRlL0RlbGV0ZSBmb3Igc3RlcC1ncm91cCBjaGlsZHJlbikuICovXG4gIC8vIGdldCBlZmZlY3RpdmVTdGVwTW9yZU1lbnVPcHRpb25zKCk6IFN0ZXBNb3JlTWVudU9wdGlvbltdIHtcbiAgLy8gICBjb25zdCBiYXNlID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zIHx8IFtdO1xuICAvLyAgIC8vIEFsd2F5cyBoaWRlIGR1cGxpY2F0ZSBvcHRpb24gZm9yIHRoaXMgY29udGFpbmVyIHN0ZXBcbiAgLy8gICBsZXQgZmlsdGVyZWQgPSBiYXNlLmZpbHRlcihvcHQgPT4gb3B0LmlkICE9PSAnZHVwbGljYXRlJyk7XG4gICAgXG4gIC8vICAgY29uc3Qgc3RlcFJlZjogYW55ID0gdGhpcy5zdGVwO1xuICAvLyAgIGlmICghc3RlcFJlZikgcmV0dXJuIGZpbHRlcmVkO1xuXG4gIC8vICAgY29uc3QgaXNHcm91cENoaWxkID0gISFzdGVwUmVmLmlzU3RlcEdyb3VwQ2hpbGRyZW47XG4gIC8vICAgLy8gV2hlbiBzdGVwLnN0ZXBNb3JlTWVudU9wdGlvbnMgaXMgdHJ1dGh5IE9SIHN0ZXAgaXMgYSBzdGVwLWdyb3VwIGNoaWxkLCBoaWRlIG11dGF0aW5nIGl0ZW1zXG4gIC8vICAgY29uc3Qgc3VwcHJlc3NNdXRhdGluZyA9ICEhc3RlcFJlZi5zdGVwTW9yZU1lbnVPcHRpb25zIHx8IGlzR3JvdXBDaGlsZDtcbiAgLy8gICBpZiAoIXN1cHByZXNzTXV0YXRpbmcpIHJldHVybiBmaWx0ZXJlZDtcblxuICAvLyAgIHJldHVybiBmaWx0ZXJlZC5maWx0ZXIob3B0ID0+IG9wdC5pZCAhPT0gJ2RlbGV0ZScpO1xuICAvLyB9XG4gIGdldCBlZmZlY3RpdmVTdGVwTW9yZU1lbnVPcHRpb25zKCk6IFN0ZXBNb3JlTWVudU9wdGlvbltdIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IHN0ZXBSZWY6IGFueSA9IHRoaXMuc3RlcDtcbiAgICBpZiAoIXN0ZXBSZWYpIHJldHVybiBiYXNlO1xuXG4gICAgY29uc3QgaXNHcm91cENoaWxkID0gISFzdGVwUmVmLmlzU3RlcEdyb3VwQ2hpbGRyZW47XG4gICAgLy8gV2hlbiBzdGVwLnN0ZXBNb3JlTWVudU9wdGlvbnMgaXMgdHJ1dGh5IE9SIHN0ZXAgaXMgYSBzdGVwLWdyb3VwIGNoaWxkLCBoaWRlIG11dGF0aW5nIGl0ZW1zXG4gICAgY29uc3Qgc3VwcHJlc3NNdXRhdGluZyA9ICEhc3RlcFJlZi5zdGVwTW9yZU1lbnVPcHRpb25zIHx8IGlzR3JvdXBDaGlsZDtcbiAgICBpZiAoIXN1cHByZXNzTXV0YXRpbmcpIHJldHVybiBiYXNlO1xuXG4gICAgcmV0dXJuIGJhc2UuZmlsdGVyKG9wdCA9PiBvcHQuaWQgIT09ICdkdXBsaWNhdGUnICYmIG9wdC5pZCAhPT0gJ2RlbGV0ZScpO1xuICB9XG4gIFxuICAvKiogVHJ1ZSB3aGVuIHRoaXMgbG9vcC1zdGVwJ3Mgb3duIGJyZWFrcG9pbnQgaXMgZGlzYWJsZWQgKHVzZWQgdG8gcHJvcGFnYXRlIHBhcmVudFNraXBwZWQgdG8gY2hpbGRyZW4pLiAqL1xuICBnZXQgc2VsZkRlYnVnRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuc3RlcCBhcyBhbnkpPy5kZWJ1Z1BvaW50RGlzYWJsZWQgfHwgISF0aGlzLnBhcmVudFNraXBwZWQgfHwgdGhpcy5pc1N0ZXBEZWxldGVkO1xuICB9XG5cbiAgLy8gT3V0cHV0IGV2ZW50IGZvciB3aGVuIHRoZSBsb29wIHN0ZXAgZXhwYW5kc1xuICBAT3V0cHV0KCkgb25FeHBhbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IGZvciB3aGVuIFwiVmlldyBhbGwgaXRlcmF0aW9uc1wiIGlzIGNsaWNrZWRcbiAgQE91dHB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50IGZvciB3aGVuIGl0ZXJhdGlvbiBzZWxlY3Rpb24gY2hhbmdlc1xuICBAT3V0cHV0KCkgb25JdGVyYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvLyBDb25maWcgcHJvcGVydHkgZm9yIGJhc2UgY2xhc3MgLSBidWlsdCBmcm9tIGluZGl2aWR1YWwgaW5wdXRzIGluIG5nT25Jbml0XG4gIG92ZXJyaWRlIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuXG4gIHNlbGVjdGVkSXRlcmF0aW9uOiBMb29wSXRlcmF0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB1c2VyJ3MgbWFudWFsIHNlbGVjdGlvblxuICBwcml2YXRlIHByZXZpb3VzU3RhdHVzPzogU3RlcFN0YXR1cztcbiAgcHJpdmF0ZSB1c2VyTWFudWFsbHlDbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gVHJhY2sgd2hpY2ggc3RlcHMgYXJlIHN0aWxsIGxvYWRpbmcgdG8gc2hvdyBza2VsZXRvblxuICBsb2FkaW5nU3RlcHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFByb2Nlc3NlZCBzdWItc3RlcHMgZm9yIGxpdmUgbW9kZSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBncm91cGluZ1xuICBwcm9jZXNzZWRTdWJTdGVwczogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0UHJvY2Vzc2VkSW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgd2FpdExvY2F0b3JHcm91cEVudHJ5OiBhbnkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb3VudGRvd25JbnRlcnZhbElkOiBhbnkgPSBudWxsO1xuXG4gIC8vIEFJX0FVVE9fSEVBTCBncm91cGluZzogc2hvdyBsb2FkaW5nIHVudGlsIEFJX0FVVE9fSEVBTF9TVUNDRVNTIG9yIEFJX0FVVE9fSEVBTF9GQUlMRURcbiAgcHJpdmF0ZSBhaUF1dG9IZWFsR3JvdXBFbnRyeTogYW55IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gUHJvY2Vzc2VkIHN1Yi1zdGVwcyBmb3IgcnVuIHJlc3VsdCBzY3JlZW4gKGZpbHRlciBhbmQgc3BsaXQgQUlfQVVUT19IRUFMX1NVQ0NFU1MvRkFJTEVEKVxuICBwcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdDogYW55W10gPSBbXTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCdWlsZCBjb25maWcgZnJvbSBpbmRpdmlkdWFsIGlucHV0c1xuICAgIC8vIFVzZSBuZXN0ZWRTdGVwcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBlbXB0eSBhcnJheVxuICAgIGNvbnN0IHN0ZXBzVG9Vc2UgPSB0aGlzLm5lc3RlZFN0ZXBzIHx8IFtdO1xuXG4gICAgLy8gVXNlIGFjdGlvbiBhcyBmYWxsYmFjayBmb3IgdGl0bGUgaWYgdGl0bGUgaXMgZW1wdHlcbiAgICAvLyBDaGVjayBib3RoIGluc3RhbmNlIHByb3BlcnR5IGFuZCBjb25maWcgZm9yIGFjdGlvblxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gKHRoaXMgYXMgYW55KS5hY3Rpb24gfHwgJyc7XG4gICAgY29uc3Qgc3RlcFRpdGxlID0gKHRoaXMudGl0bGUgJiYgdGhpcy50aXRsZS50cmltKCkpID8gdGhpcy50aXRsZSA6IGFjdGlvblZhbHVlO1xuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHRlc3RTdGVwSWQ6IHRoaXMuc3RlcD8udGVzdFN0ZXBJZCB8fCB1bmRlZmluZWQsXG4gICAgICB0ZXN0U3RlcFJlc3VsdElkOiB0aGlzLnRlc3RTdGVwUmVzdWx0SWQsXG4gICAgICBzdGVwTnVtYmVyOiB0aGlzLnN0ZXBOdW1iZXIsXG4gICAgICB0aXRsZTogc3RlcFRpdGxlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZGlzcGxheVR5cGU6ICdsb29wJyxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLmxvb3BUeXBlLFxuICAgICAgaXRlcmF0aW9uczogdGhpcy5pdGVyYXRpb25zLFxuICAgICAgc2VsZWN0ZWRJdGVyYXRpb25JZDogdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLFxuICAgICAgZGVmYXVsdEl0ZXJhdGlvbjogdGhpcy5kZWZhdWx0SXRlcmF0aW9uLFxuICAgICAgbmVzdGVkU3RlcHM6IHN0ZXBzVG9Vc2UsXG4gICAgICBzdGVwRGVsZXRlZDogdGhpcy5zdGVwRGVsZXRlZCxcbiAgICAgIHNob3dWaWV3QWxsSXRlcmF0aW9uczogdGhpcy5zaG93Vmlld0FsbEl0ZXJhdGlvbnMsXG4gICAgICB0aW1pbmdCcmVha2Rvd246IHRoaXMudGltaW5nQnJlYWtkb3duLFxuICAgICAgZXhwYW5kZWQ6IHRoaXMuZXhwYW5kZWQsXG4gICAgfSBhcyBMb29wU3RlcENvbmZpZztcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGxpdmUgc3ViLXN0ZXAgcHJvY2Vzc2luZyBmb3IgV0FJVF9GT1JfTE9DQVRPUiBncm91cGluZ1xuICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBQcm9jZXNzIGZvciBydW4gcmVzdWx0IHNjcmVlbjogZmlsdGVyIGFuZCBzcGxpdCBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRURcbiAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3Rpb24gLSBwcmlvcml0aXplIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQsIHRoZW4gZGVmYXVsdFxuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgJiYgdGhpcy5pdGVyYXRpb25zICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXRlcmF0aW9ucyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAvLyBJZiBkZWZhdWx0SXRlcmF0aW9uIGlzICdsYXN0JywgYWxzbyBzZXQgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gdGhlIGxhc3QgaXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5kZWZhdWx0SXRlcmF0aW9uID09PSAnbGFzdCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbikge1xuICAgICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgaWYgYWxyZWFkeSBleHBhbmRlZFxuICAgIGlmICh0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5uZXN0ZWRTdGVwcyAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgICAgICBpZiAoc3RlcElkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuYWRkKFN0cmluZyhzdGVwSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gd2hlbiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddICYmIHRoaXMuaXRlcmF0aW9ucyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgICAvLyBTeW5jIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHdpdGggdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBubyB2YWx1ZSBwcm92aWRlZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHdoZW4gaXRlcmF0aW9ucyBhcnJheSBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2l0ZXJhdGlvbnMnXSAmJiB0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB1c2VyIHNlbGVjdGlvbiwgdHJ5IHRvIHByZXNlcnZlIGl0XG4gICAgICBpZiAodGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBjaGFuZ2VzXG4gICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVc2VyIHNlbGVjdGlvbiBubyBsb25nZXIgdmFsaWQsIHVzZSBzZWxlY3RlZEl0ZXJhdGlvbklkIG9yIGRlZmF1bHRcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZEJ5SWQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgICBpZiAoZm91bmRCeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kQnlJZC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZEJ5SWQ7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiB8fCAhdGhpcy5pdGVyYXRpb25zLnNvbWUoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uPy5pZCkpIHtcbiAgICAgICAgLy8gTm8gdXNlciBzZWxlY3Rpb24sIHVzZSBzZWxlY3RlZEl0ZXJhdGlvbklkIG9yIGRlZmF1bHRcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB0aXRsZSBpZiBpdCBjaGFuZ2VzIC0gYWxzbyBjaGVjayBmb3IgYWN0aW9uIGluIGNvbmZpZyBvciBpbnN0YW5jZVxuICAgIGlmIChjaGFuZ2VzWyd0aXRsZSddKSB7XG4gICAgICBjb25zdCBhY3Rpb25WYWx1ZSA9ICh0aGlzIGFzIGFueSkuYWN0aW9uIHx8ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5hY3Rpb24gfHwgJyc7XG4gICAgICBjb25zdCBzdGVwVGl0bGUgPSAodGhpcy50aXRsZSAmJiB0aGlzLnRpdGxlLnRyaW0oKSkgPyB0aGlzLnRpdGxlIDogYWN0aW9uVmFsdWU7XG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcudGl0bGUgPSBzdGVwVGl0bGU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFuZ2VzWydkdXJhdGlvbiddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5kdXJhdGlvbiA9IGNoYW5nZXNbJ2R1cmF0aW9uJ10uY3VycmVudFZhbHVlIHx8IDA7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBEZWxldGVkJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLnN0ZXBEZWxldGVkID0gY2hhbmdlc1snc3RlcERlbGV0ZWQnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBOdW1iZXInXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuc3RlcE51bWJlciA9IGNoYW5nZXNbJ3N0ZXBOdW1iZXInXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ2V4cGFuZGVkJ10gJiYgdGhpcy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnZXhwYW5kZWQgY2hhbmdlZCBpbiBsb29wLXN0ZXAnLCB0aGlzLmlkLCBjaGFuZ2VzWydleHBhbmRlZCddKTtcbiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRoaXMuZXhwYW5kZWQ7XG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2hlbiBpbnB1dHMgY2hhbmdlXG4gICAgaWYgKGNoYW5nZXNbJ2l0ZXJhdGlvbnMnXSB8fCBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gfHwgY2hhbmdlc1snbmVzdGVkU3RlcHMnXSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLml0ZXJhdGlvbnMgPSB0aGlzLml0ZXJhdGlvbnM7XG4gICAgICAgIHRoaXMuY29uZmlnLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzID0gdGhpcy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgd2hlbiBuZXN0ZWQgc3RlcHMgYXJlIGFkZGVkIGFuZCBzdGVwIGlzIGV4cGFuZGVkXG4gICAgLy8gaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10gJiYgdGhpcy5pc0V4cGFuZGVkICYmIHRoaXMubmVzdGVkU3RlcHMgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgIC8vICAgdGhpcy5uZXN0ZWRTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgIC8vICAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICAvLyAgICAgaWYgKHN0ZXBJZCkge1xuICAgIC8vICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmFkZChTdHJpbmcoc3RlcElkKSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIEluaXRpYWxpemUgbG9hZGluZyBzdGF0ZSBpZiBhbHJlYWR5IGV4cGFuZGVkIHdoZW4gY29tcG9uZW50IGluaXRpYWxpemVzXG4gICAgaWYgKGNoYW5nZXNbJ2V4cGFuZGVkJ10gJiYgdGhpcy5pc0V4cGFuZGVkICYmIHRoaXMubmVzdGVkU3RlcHMgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICAgICAgaWYgKHN0ZXBJZCkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmFkZChTdHJpbmcoc3RlcElkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsc28gaGFuZGxlIHdoZW4gbmVzdGVkU3RlcHMgaXMgcGFzc2VkIHZpYSBjaGlsZHJlbiBwcm9wZXJ0eSAoZm9yIHN0ZXAtcmVuZGVyZXIgY29tcGF0aWJpbGl0eSlcbiAgICBpZiAoY2hhbmdlc1snbmVzdGVkU3RlcHMnXSAmJiB0aGlzLm5lc3RlZFN0ZXBzKSB7XG4gICAgICAvLyBFbnN1cmUgY29uZmlnIGlzIHVwZGF0ZWQgd2l0aCBuZXN0ZWRTdGVwc1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJvdmlkZWQgYnV0IGNoaWxkcmVuIGlzIChmcm9tIHN0ZXAtcmVuZGVyZXIpLCB1c2UgY2hpbGRyZW5cbiAgICBpZiAoIXRoaXMubmVzdGVkU3RlcHMgJiYgKHRoaXMuY29uZmlnIGFzIGFueSkuY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheSgodGhpcy5jb25maWcgYXMgYW55KS5jaGlsZHJlbikpIHtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSAodGhpcy5jb25maWcgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNMaXZlKSB7XG4gICAgICAvLyBVcGRhdGUgc3ViU3RlcHMgYXJyYXkgd2hlbiBuZXcgb25lcyBhcmUgYWRkZWRcbiAgICAgIGlmIChjaGFuZ2VzWyduZXN0ZWRTdGVwcyddKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3ViU3RlcHNDb3VudCA9IGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10ucHJldmlvdXNWYWx1ZT8ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdWJTdGVwc0NvdW50ID0gKHRoaXMubmVzdGVkU3RlcHMgfHwgW10pLmxlbmd0aDtcblxuICAgICAgICAvLyBTdWItc3RlcHMgYXJlIGFwcGVuZGVkIGV4dGVybmFsbHksIHNvIHdlIGp1c3QgdXBkYXRlIHRoZSBjb25maWdcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcubmVzdGVkU3RlcHMgPSB0aGlzLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBBdXRvLWV4cGFuZCBpZiBzdGVwIGlzIHJ1bm5pbmcgYW5kIG5ldyBzdWJTdGVwcyBhcmUgYWRkZWQgKGxvZ3MgY29taW5nIGluKVxuICAgICAgICBpZiAoIWNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10uZmlyc3RDaGFuZ2UgJiYgXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIFxuICAgICAgICAgICAgY3VycmVudFN1YlN0ZXBzQ291bnQgPiBwcmV2aW91c1N1YlN0ZXBzQ291bnQgJiZcbiAgICAgICAgICAgIHRoaXMuaGFzU3ViU3RlcHMgJiYgXG4gICAgICAgICAgICAhdGhpcy5pc0V4cGFuZGVkICYmIFxuICAgICAgICAgICAgIXRoaXMudXNlck1hbnVhbGx5Q2xvc2VkKSB7XG4gICAgICAgICAgdGhpcy5hdXRvRXhwYW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN0YXR1cyBjaGFuZ2VzIC0gYXV0by1leHBhbmQgd2hlbiBzdGVwIHN0YXJ0cyBleGVjdXRpbmdcbiAgICAgIGlmIChjaGFuZ2VzWydzdGF0dXMnXSAmJiAhY2hhbmdlc1snc3RhdHVzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzID0gY2hhbmdlc1snc3RhdHVzJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBvbGRTdGF0dXMgPSBjaGFuZ2VzWydzdGF0dXMnXS5wcmV2aW91c1ZhbHVlO1xuXG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIHdoZW4gc3RhdHVzIGNoYW5nZXMgdG8gJ3J1bm5pbmcnIGFuZCBoYXMgc3ViU3RlcHMgKG9yIHdpbGwgaGF2ZSBzb29uKVxuICAgICAgICBpZiAobmV3U3RhdHVzID09PSAncnVubmluZycgJiYgb2xkU3RhdHVzICE9PSAncnVubmluZycgJiYgIXRoaXMudXNlck1hbnVhbGx5Q2xvc2VkKSB7XG4gICAgICAgICAgLy8gRXhwYW5kIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgaGFzIHN1YlN0ZXBzLCBvciB3YWl0IGZvciB0aGVtXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViU3RlcHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0V4cGFuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGF0dXMgPSBuZXdTdGF0dXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdXRvRXhwYW5kKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0V4cGFuZGVkICYmIHRoaXMuaGFzU3ViU3RlcHMpIHtcbiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLnVzZXJNYW51YWxseUNsb3NlZCA9IGZhbHNlO1xuICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBoYXNTdWJTdGVwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNFeHBhbmRlZCA9IHRoaXMuaXNFeHBhbmRlZDtcbiAgICBzdXBlci50b2dnbGUoKTtcbiAgICAvLyBFbWl0IGV2ZW50IHdoZW4gZXhwYW5kaW5nICh0cmFuc2l0aW9uaW5nIGZyb20gY29sbGFwc2VkIHRvIGV4cGFuZGVkKVxuICAgIGlmICghd2FzRXhwYW5kZWQgJiYgdGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kLmVtaXQoKTtcbiAgICAgIC8vIElmIHRoaXMgc3RlcCBoYXMgY2hpbGRyZW4gKGhhc0NoaWxkIGlzIHRydWUpIGFuZCBvbkV4cGFuZEhhbmRsZXIgaXMgcHJvdmlkZWQsIGNhbGwgaXQgdG8gZmV0Y2ggY2hpbGRyZW5cbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlciAmJiB0aGlzLmNvbmZpZyAmJiB0aGlzLmhhc0NoaWxkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHN0ZXAgY29uZmlnIG9iamVjdCBmb3IgdGhlIGhhbmRsZXIgd2l0aCBoYXNDaGlsZCBwcm9wZXJ0eVxuICAgICAgICBjb25zdCBzdGVwQ29uZmlnID0ge1xuICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgIGhhc0NoaWxkOiB0cnVlLFxuICAgICAgICAgIGV4cGFuZGVkOiB0cnVlLCAvLyBFbnN1cmUgZXhwYW5kZWQgaXMgc2V0XG4gICAgICAgICAgdGVzdFN0ZXBUeXBlOiAodGhpcy5jb25maWcgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUl9MT09QJyA6ICdXSElMRV9MT09QJyksXG4gICAgICAgICAgY2hpbGRyZW46IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdLFxuICAgICAgICAgIHRlc3RTdGVwUmVzdWx0SWQ6IHRoaXMudGVzdFN0ZXBSZXN1bHRJZCxcbiAgICAgICAgICBpZDogdGhpcy5pZFxuICAgICAgICB9IGFzIEV4ZWN1dGlvblN0ZXBDb25maWcgJiB7IGhhc0NoaWxkOiBib29sZWFuOyB0ZXN0U3RlcFR5cGU/OiBzdHJpbmc7IGNoaWxkcmVuPzogYW55W107IGV4cGFuZGVkPzogYm9vbGVhbiB9O1xuICAgICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIC8vIEluaXRpYWxpemUgbG9hZGluZyBzdGF0ZSBmb3IgYWxsIG5lc3RlZCBzdGVwc1xuICAgICAgaWYgKHRoaXMubmVzdGVkU3RlcHMgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICAgICAgICBpZiAoc3RlcElkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlIHdoZW4gY29sbGFwc2luZ1xuICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZXhwYW5kZWQgc3RhdGUgaXMgc3luY2VkIHdpdGggY29uZmlnXG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5leHBhbmRlZCA9IHRoaXMuaXNFeHBhbmRlZDtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhIHN0ZXAgaXMgc3RpbGwgbG9hZGluZ1xuICBpc05lc3RlZFN0ZXBMb2FkaW5nKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICByZXR1cm4gc3RlcElkID8gdGhpcy5sb2FkaW5nU3RlcHMuaGFzKFN0cmluZyhzdGVwSWQpKSA6IGZhbHNlO1xuICB9XG5cbiAgLy8gTWFyayBhIHN0ZXAgYXMgbG9hZGVkIChjYWxsZWQgd2hlbiBzdGVwLXJlbmRlcmVyIGlzIHJlYWR5KVxuICBtYXJrU3RlcExvYWRlZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgaWYgKHN0ZXBJZCkge1xuICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuZGVsZXRlKFN0cmluZyhzdGVwSWQpKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk6IHZvaWQge1xuICAgIC8vIEZpcnN0LCB0cnkgdG8gdXNlIHNlbGVjdGVkSXRlcmF0aW9uSWQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKFxuICAgICAgICBpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBpcyBzZWxlY3RlZFxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHVzZXIgaGFzIG1hbnVhbGx5IHNlbGVjdGVkIHNvbWV0aGluZywgcHJlc2VydmUgaXRcbiAgICBpZiAodGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGlzIHNlbGVjdGVkXG4gICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBiYXNlZCBvbiBkZWZhdWx0SXRlcmF0aW9uIHNldHRpbmdcbiAgICBpZiAodGhpcy5kZWZhdWx0SXRlcmF0aW9uID09PSAnbGFzdCcgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb24gPSB0aGlzLml0ZXJhdGlvbnNbdGhpcy5pdGVyYXRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGxhc3RJdGVyYXRpb24uaWQpIHtcbiAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gbGFzdEl0ZXJhdGlvbjtcbiAgICAgIC8vIFNldCB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB0byB0cmFjayB0aGUgZGVmYXVsdCBzZWxlY3Rpb25cbiAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSBsYXN0SXRlcmF0aW9uLmlkO1xuICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBpcyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0SXRlcmF0aW9uID0gdGhpcy5pdGVyYXRpb25zWzBdO1xuICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZpcnN0SXRlcmF0aW9uLmlkKSB7XG4gICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZpcnN0SXRlcmF0aW9uO1xuICAgICAgLy8gU2V0IHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHRvIHRyYWNrIHRoZSBkZWZhdWx0IHNlbGVjdGlvblxuICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IGZpcnN0SXRlcmF0aW9uLmlkO1xuICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBpcyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUl0ZXJhdGlvbkNoYW5nZShpdGVyYXRpb246IExvb3BJdGVyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIklURVJBVElPTiBDSEFOR0VcIiwgdGhpcy5jb25maWcgLGl0ZXJhdGlvbilcbiAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIGl0ZXJhdGlvbnNcbiAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBpdGVyYXRpb24uaWQpIHtcbiAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgIH1cbiAgICAvLyBTdG9yZSB0aGUgdXNlcidzIG1hbnVhbCBzZWxlY3Rpb25cbiAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gaXRlcmF0aW9uO1xuICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSBpdGVyYXRpb24uaWQ7XG5cbiAgICBpZiAodGhpcy5pc0xpdmUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVyYXRpb25zLmZpbmRJbmRleChpdGVyID0+IGl0ZXIuaWQgPT09IGl0ZXJhdGlvbi5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xICYmIHRoaXMuaXRlcmF0aW9uRGF0YT8uW2luZGV4XSAmJiB0aGlzLm5lc3RlZFN0ZXBzKSB7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZE5lc3RlZFN0ZXBzOiBFeGVjdXRpb25TdGVwQ29uZmlnW10gPVxuICAgICAgICAgIHRoaXMubmVzdGVkU3RlcHMubWFwKHN0ZXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFN1YlN0ZXBzID0gdGhpcy5pdGVyYXRpb25EYXRhW2luZGV4XVtzdGVwLmlkXTtcbiAgICAgICAgICAgIHN0ZXAuZHVyYXRpb24gPSB1cGRhdGVkU3ViU3RlcHMucmVkdWNlKChhY2M6IG51bWJlciwgc3ViU3RlcDogYW55KSA9PiBhY2MgKyBzdWJTdGVwPy5kdXJhdGlvbiB8fCAwLCAwKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZWRTdWJTdGVwcykge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnN0ZXAsXG4gICAgICAgICAgICAgICAgc3ViU3RlcHM6IFsuLi51cGRhdGVkU3ViU3RlcHNdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IC4uLnN0ZXAgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gdXBkYXRlZE5lc3RlZFN0ZXBzO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICBuZXN0ZWRTdGVwczogdXBkYXRlZE5lc3RlZFN0ZXBzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRW1pdCB0aGUgZXZlbnQgd2l0aCB0aGUgaXRlcmF0aW9uIElEXG4gICAgdGhpcy5vbkl0ZXJhdGlvbkNoYW5nZS5lbWl0KGl0ZXJhdGlvbi5pZCk7XG4gIH1cblxuICBjb21wYXJlSXRlcmF0aW9uKGE6IExvb3BJdGVyYXRpb24sIGI6IExvb3BJdGVyYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYSAmJiBiID8gYS5pZCA9PT0gYi5pZCA6IGEgPT09IGI7XG4gIH1cblxuICBnZXRMb29wVHlwZUJhZGdlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFsnTE9PUCddO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgYmFkZ2VzLnB1c2goJ0ZPUicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgYmFkZ2VzLnB1c2goJ1dISUxFJyk7XG4gICAgfVxuICAgIHJldHVybiBiYWRnZXM7XG4gIH1cblxuICBnZXRJdGVyYXRpb25MYWJlbChpdGVyYXRpb246IExvb3BJdGVyYXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVyYXRpb24ubGFiZWw7XG4gIH1cblxuICBvblZpZXdBbGxJdGVyYXRpb25zQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25BZGRTdGVwSW5zaWRlTG9vcChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuYWRkU3RlcEluc2lkZUxvb3AuZW1pdCh0aGlzLnN0ZXAgPz8gdGhpcy5jb25maWcpO1xuICB9XG5cbiAgb25WaWV3TW9yZUZhaWxlZFN0ZXBDbGljayhleHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZhaWxlZFN0ZXBEZXRhaWxzID0gZXhwYW5kZWQ7XG4gIH1cblxuICBnZXRTdWJTdGVwc0ZvckZhaWxlZFN0ZXAoKTogU3ViU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbj8uc3ViU3RlcHMgfHwgW107XG4gIH1cblxuICBvbk1ha2VDdXJyZW50QmFzZWxpbmUoZXZlbnQ6IG1ha2VDdXJyZW50QmFzZWxpbmVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubWFrZUN1cnJlbnRCYXNlbGluZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uVXBsb2FkQmFzZWxpbmUoZXZlbnQ6IHVwbG9hZEJhc2VsaW5lRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnVwbG9hZEJhc2VsaW5lLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25BbmFseXplKCk6IHZvaWQge1xuICAgIHRoaXMuYW5hbHl6ZS5lbWl0KCk7XG4gIH1cblxuICBvblZpZXdGdWxsTG9ncygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdGdWxsTG9ncy5lbWl0KCk7XG4gIH1cblxuICBvblNlbGZIZWFsQWN0aW9uKGV2ZW50OiBTZWxmSGVhbEFjdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZWxmSGVhbEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGdldCBzaG93Vmlld01vcmVCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFeHBhbmRlZCAmJiBCb29sZWFuKHRoaXMuZmFpbHVyZURldGFpbHMpICYmXG4gICAgICAoXG4gICAgICAgIChCb29sZWFuKHRoaXMuZmFpbHVyZURldGFpbHM/LmV4cGVjdGVkIHx8IHRoaXMuZmFpbHVyZURldGFpbHM/LmFjdHVhbCkpIHx8XG4gICAgICAgIChCb29sZWFuKHRoaXMuZmFpbHVyZURldGFpbHM/LnNjcmVlbnNob3RzPy5jdXJyZW50IHx8IHRoaXMuZmFpbHVyZURldGFpbHM/LnNjcmVlbnNob3RzPy5iYXNlbGluZSB8fCB0aGlzLmZhaWx1cmVEZXRhaWxzPy5zY3JlZW5zaG90cz8uZGlmZmVyZW5jZSlcbiAgICAgICAgICB8fCBCb29sZWFuKHRoaXMuZmFpbHVyZURldGFpbHM/LmxvZ3M/Lmxlbmd0aCkpIHx8IFxuICAgICAgICAoQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5haUZpeEFwcGxpZWQgJiYgKHRoaXMuZmFpbHVyZURldGFpbHM/LmFpRml4TWVzc2FnZSB8fCB0aGlzLmNvbmZpZGVuY2UgfHwgdGhpcy5yZWFzb25pbmc/Lmxlbmd0aCkpKVxuICAgICAgKVxuICB9XG5cbiAgb25EZWJ1Z1BvaW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRlYnVnUG9pbnRDaGFuZ2UuZW1pdCghdGhpcy5kZWJ1Z1BvaW50U2V0KTtcbiAgfVxuXG4gIG9uRWRpdFN0ZXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5vbkVkaXRTdGVwSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0U3RlcC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgb25BZGRTdGVwT3B0aW9uU2VsZWN0KG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQob3B0aW9uKTtcbiAgfVxuXG4gIG9uU3RlcE1vcmVPcHRpb25TZWxlY3Qob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KG9wdGlvbik7XG4gIH1cblxuICB0b2dnbGVIZWFkZXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLnNob3dGYWlsZWRTdGVwRGV0YWlscyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vblN0ZXBDbGlja0hhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHN0ZXBUb1Bhc3MgPSB0aGlzLnN0ZXAgfHwgdGhpcy5jb25maWc7XG4gICAgICBpZiAoc3RlcFRvUGFzcykge1xuICAgICAgICB0aGlzLm9uU3RlcENsaWNrSGFuZGxlcihzdGVwVG9QYXNzLCBldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIHN0ZXAgaXMgYSBzdGVwLWdyb3VwIHdpdGggaGFzQ2hpbGRcbiAgaXNOZXN0ZWRTdGVwR3JvdXBXaXRoQ2hpbGRyZW4oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGVwLmRpc3BsYXlUeXBlID09PSAnc3RlcC1ncm91cCcgJiYgISEoc3RlcCBhcyBhbnkpLmhhc0NoaWxkO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgZ3JvdXBOYW1lIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0R3JvdXBOYW1lKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoc3RlcCBhcyBTdGVwR3JvdXBDb25maWcpLmdyb3VwTmFtZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXBzIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0U3RlcHMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IEV4ZWN1dGlvblN0ZXBDb25maWdbXSB7XG4gICAgY29uc3Qgc3RlcEdyb3VwID0gc3RlcCBhcyBTdGVwR3JvdXBDb25maWc7XG4gICAgcmV0dXJuIHN0ZXBHcm91cC5zdGVwcyB8fCAoc3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8IFtdO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIHN0ZXAgaXMgYSBjb25kaXRpb24gc3RlcFxuICBpc05lc3RlZENvbmRpdGlvblN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICByZXR1cm4gc3RlcFR5cGUgPT09ICdDT05ESVRJT05fSUYnIHx8IHN0ZXBUeXBlID09PSAnQ09ORElUSU9OX0VMU0UnIHx8IFxuICAgICAgICAgICBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFX0lGJyB8fCBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFSUYnIHx8XG4gICAgICAgICAgIHN0ZXBUeXBlID09PSAnY29uZGl0aW9uJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgbG9vcCBzdGVwXG4gIGlzTmVzdGVkTG9vcFN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICByZXR1cm4gc3RlcFR5cGUgPT09ICdGT1JfTE9PUCcgfHwgc3RlcFR5cGUgPT09ICdXSElMRV9MT09QJyB8fCBzdGVwVHlwZSA9PT0gJ2xvb3AnO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgbG9vcCB0eXBlIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0TG9vcFR5cGUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6ICdmb3InIHwgJ3doaWxlJyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RlcFR5cGUgPSAoc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZSB8fCBzdGVwLmRpc3BsYXlUeXBlO1xuICAgIGlmIChzdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICByZXR1cm4gJ2Zvcic7XG4gICAgfSBlbHNlIGlmIChzdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnIHx8IChzdGVwIGFzIExvb3BTdGVwQ29uZmlnKS5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuICd3aGlsZSc7XG4gICAgfVxuICAgIHJldHVybiAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGU7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBpdGVyYXRpb25zIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0TG9vcEl0ZXJhdGlvbnMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGFueVtdIHtcbiAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgY29uZmlnXG4gICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuaXRlcmF0aW9ucyB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IG5lc3RlZCBzdGVwcyBmcm9tIGxvb3Agc3RlcCBjb25maWdcbiAgZ2V0TG9vcE5lc3RlZFN0ZXBzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBFeGVjdXRpb25TdGVwQ29uZmlnW10ge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAubmVzdGVkU3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gaGFuZGxlIG5lc3RlZCBsb29wIHN0ZXAgZXhwYW5zaW9uXG4gIGhhbmRsZUxvb3BTdGVwRXhwYW5kKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gaGFuZGxlIG5lc3RlZCBsb29wIHN0ZXAgaXRlcmF0aW9uIGNoYW5nZVxuICBoYW5kbGVMb29wU3RlcEl0ZXJhdGlvbkNoYW5nZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBpdGVyYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSB0aGUgcGFyZW50IGNvbXBvbmVudFxuICAgIC8vIEZvciBub3csIHdlIGp1c3QgZW1pdCB0aGUgZXhwYW5kIGV2ZW50XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIHRpdGxlXG4gIGdldFN0ZXBUaXRsZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgc3RlcC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXAgc3RhdHVzXG4gIGdldFN0ZXBTdGF0dXMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IFN0ZXBTdGF0dXMge1xuICAgIGNvbnN0IHJlc3VsdCA9IChzdGVwIGFzIGFueSkucmVzdWx0O1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdExvd2VyID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocmVzdWx0TG93ZXIgPT09ICdzdWNjZXNzJyB8fCByZXN1bHRMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdmYWlsdXJlJyB8fCByZXN1bHRMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3BlbmRpbmcnIHx8IHJlc3VsdExvd2VyID09PSAnbm90LWV4ZWN1dGVkJykge1xuICAgICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGVwLnN0YXR1cyB8fCAncGVuZGluZyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIGR1cmF0aW9uXG4gIGdldFN0ZXBEdXJhdGlvbihzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5kdXJhdGlvbiB8fCBzdGVwLmR1cmF0aW9uIHx8IDA7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgY29uZGl0aW9uIHN0ZXAgcHJvcGVydGllc1xuICBnZXRDb25kaXRpb25TdGVwRHVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmdldFN0ZXBEdXJhdGlvbihzdGVwKTtcbiAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKGR1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcEV4cGFuZGVkKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXAuZXhwYW5kZWQgfHwgZmFsc2U7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwVGV4dChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgc3RlcC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBCcmFuY2hlcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogQ29uZGl0aW9uQnJhbmNoW10ge1xuICAgIGlmICh0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwTG9hZGluZyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwRXhwYW5kKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBGYWlsdXJlRGV0YWlscyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYW55IHtcbiAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBTZWxmSGVhbEFuYWx5c2lzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBTZWxmSGVhbEFjdGlvbihldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBNYWtlQmFzZWxpbmUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcFVwbG9hZEJhc2VsaW5lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcEFuYWx5emUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25BbmFseXplSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcFZpZXdMb2dzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcikge1xuICAgICAgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyB0byBzYWZlbHkgYWNjZXNzIExvb3BTdGVwQ29uZmlnIHByb3BlcnRpZXNcbiAgZ2V0TG9vcFNlbGVjdGVkSXRlcmF0aW9uSWQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICB9XG5cbiAgZ2V0TG9vcERlZmF1bHRJdGVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6ICdmaXJzdCcgfCAnbGFzdCcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuZGVmYXVsdEl0ZXJhdGlvbiB8fCAnbGFzdCc7XG4gIH1cblxuICBnZXRMb29wU2hvd1ZpZXdBbGxJdGVyYXRpb25zKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLnNob3dWaWV3QWxsSXRlcmF0aW9ucztcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgc3RlcCBpcyBjdXJyZW50bHkgbG9hZGluZyBuZXN0ZWQgY2hpbGRyZW5cbiAgaXNTdGVwTG9hZGluZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlciAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIodGhpcy5jb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgZmFsc2U7XG4gIH1cblxuICBvbkp1bXBUb1RpbWVzdGFtcChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyICYmIHRoaXMuc3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0eXBlb2YgdGhpcy5zdGVwLmV4ZWN1dGVkUmVzdWx0LnZpZGVvX3N0YXJ0X3RpbWUgPT09ICdudW1iZXInIFxuICAgICAgICA/IHRoaXMuc3RlcC5leGVjdXRlZFJlc3VsdC52aWRlb19zdGFydF90aW1lIFxuICAgICAgICA6IE51bWJlcih0aGlzLnN0ZXAuZXhlY3V0ZWRSZXN1bHQudmlkZW9fc3RhcnRfdGltZSk7XG4gICAgICBjb25zdCB0ZXN0U3RlcElkID0gdGhpcy5zdGVwPy50ZXN0U3RlcElkO1xuICAgICAgaWYgKGlzRmluaXRlKHRpbWVzdGFtcCkgJiYgdGltZXN0YW1wID49IDApIHtcbiAgICAgICAgdGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyKHRpbWVzdGFtcCwgdGVzdFN0ZXBJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xpdmUgfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50TGVuZ3RoID0gKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgfHwgW10pLmxlbmd0aDtcbiAgICAvLyBSZXNldCBpZiBpdGVyYXRpb24gY2hhbmdlZCAoZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgaWYgd2UgaGF2ZSBhIGRpZmZlcmVudCBpdGVyYXRpb24ncyBzdWJTdGVwcylcbiAgICBpZiAodGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXggPiAwICYmIGN1cnJlbnRMZW5ndGggPCB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCkge1xuICAgICAgLy8gTGlrZWx5IHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvbiwgcmVzZXRcbiAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudExlbmd0aCAhPT0gdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXgpIHtcbiAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTGl2ZVN1YlN0ZXBzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiB8fCAhdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsU3ViU3RlcHMgPSAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyB8fCBbXSkgYXMgYW55W107XG5cbiAgICAvLyBSZXNldCBpZiBzdWJTdGVwcyB3ZXJlIGNsZWFyZWQgb3IgcmVwbGFjZWQgd2l0aCBmZXdlciBlbnRyaWVzXG4gICAgaWYgKGFsbFN1YlN0ZXBzLmxlbmd0aCA8IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4KSB7XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXg7IGkgPCBhbGxTdWJTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU3RlcCA9IGFsbFN1YlN0ZXBzW2ldO1xuICAgICAgY29uc3QgdWlUeXBlOiBzdHJpbmcgPSBzdWJTdGVwPy51aVR5cGUgfHwgc3ViU3RlcD8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1czogc3RyaW5nID0gKHN1YlN0ZXA/LnN0YXR1cyB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHVpVHlwZSA9PT0gJ1dBSVRfRk9SX0xPQ0FUT1InKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBncm91cGVkIGVudHJ5IHdpdGggYSBjb3VudGRvd247IGFic29yYnMgRklORF9MT0NBVE9SIGFuZCBMT0NBVE9SX0ZPVU5EXG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gdHlwZW9mIHN1YlN0ZXAudmFsdWUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBzdWJTdGVwLnZhbHVlXG4gICAgICAgICAgOiAoc3ViU3RlcC52YWx1ZSA/IHBhcnNlRmxvYXQoc3ViU3RlcC52YWx1ZSkgOiAzMCk7XG5cbiAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG5cbiAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSB7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICByZW1haW5pbmdTZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG5cbiAgICAgICAgLy8gVGljayBkb3duIGV2ZXJ5IHNlY29uZFxuICAgICAgICB0aGlzLmNvdW50ZG93bkludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gTWF0aC5tYXgoMCwgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyAtIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPD0gMCkge1xuICAgICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdGSU5EX0xPQ0FUT1InKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgLy8gQWJvcnQgY291bnRkb3duLCByZXBsYWNlIGdyb3VwIGVudHJ5IHdpdGggdGhpcyBmYWlsZWQgbG9nXG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5maWx0ZXIoZW50cnkgPT4gZW50cnkgIT09IHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwLCBzdGF0dXM6ICdmYWlsZWQnIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBzaW5nbGUgZ3JvdXAgZW50cnkncyB0ZXh0IHNvIHRoZSB1c2VyIHNlZXMgcHJvZ3Jlc3NcbiAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC50aXRsZTtcbiAgICAgICAgICBpZiAobmV3VGV4dCkgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZGVzY3JpcHRpb24gPSBuZXdUZXh0O1xuICAgICAgICAgIHRoaXMuYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBhY3RpdmUgZ3JvdXAg4oCTIHB1c2ggRklORF9MT0NBVE9SIG5vcm1hbGx5IG9uY2UgY291bnRkb3duIGlzIGNsZWFyZWRcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwIH0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnTE9DQVRPUl9GT1VORCcpIHtcblxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIC8vIEFib3J0IGNvdW50ZG93biwgcmVwbGFjZSBncm91cCBlbnRyeSB3aXRoIHRoaXMgZmFpbGVkIGxvZ1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCwgc3RhdHVzOiAnZmFpbGVkJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBjb21wbGV0ZSDigJMgdXBkYXRlIGdyb3VwIGVudHJ5IHRvIHNob3cgTE9DQVRPUl9GT1VORCB0ZXh0IGFzIHN1Y2Nlc3NcbiAgICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBzdWJTdGVwLmRlc2NyaXB0aW9uIHx8IHN1YlN0ZXAudGV4dCB8fCBzdWJTdGVwLnRpdGxlO1xuICAgICAgICAgICAgaWYgKG5ld1RleHQpIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmRlc2NyaXB0aW9uID0gbmV3VGV4dDtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgIHRoaXMuYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSBncm91cCDigJMgcHVzaCBMT0NBVE9SX0ZPVU5EIG5vcm1hbGx5XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTCcpIHtcbiAgICAgICAgLy8gSWYgYSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpcyBhY3RpdmUsIGNvbXBsZXRlIGl0IGFzIGZhaWxlZCBiZWZvcmUgc3RhcnRpbmcgQUkgYXV0by1oZWFsXG4gICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBzaW5nbGUgbG9hZGluZyBlbnRyeTsgd2lsbCBiZSByZXBsYWNlZCBieSBBSV9BVVRPX0hFQUxfU1VDQ0VTUyBvciBBSV9BVVRPX0hFQUxfRkFJTEVEXG4gICAgICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSB7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgJ0FJIGF1dG8taGVhbCBzdGFydGVkJyxcbiAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUwnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KTtcblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUycgfHwgdWlUeXBlID09PSAnQUlfQVVUT19IRUFMX0ZBSUxFRCcpIHtcbiAgICAgICAgLy8gSWYgYSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpcyBhY3RpdmUsIGNvbXBsZXRlIGl0IGFzIGZhaWxlZCBiZWZvcmUgaGFuZGxpbmcgQUkgYXV0by1oZWFsIHJlc3VsdFxuICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgbG9hZGluZyBlbnRyeSBhbmQgYWRkIFRXTyBzZXBhcmF0ZSBlbnRyaWVzOiB2YWx1ZSBhbmQgcmVhc29uaW5nIChsaWtlIEFJX0FOU1dFUilcbiAgICAgICAgaWYgKHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5maWx0ZXIoZW50cnkgPT4gZW50cnkgIT09IHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkpO1xuICAgICAgICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJTdGVwLnZhbHVlID8/IHN1YlN0ZXAudGV4dCA/PyAnJztcbiAgICAgICAgY29uc3QgcmVhc29uaW5nID0gc3ViU3RlcC5yZWFzb25pbmcgPz8gc3ViU3RlcC5SZWFzb25pbmcgPz8gJyc7XG4gICAgICAgIGNvbnN0IGJhc2VEdXJhdGlvbiA9IHN1YlN0ZXAuZHVyYXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBpc1N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbGVkJztcblxuICAgICAgICAvLyBGaXJzdCBlbnRyeTogdmFsdWUvZGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgdmFsdWVEZXNjcmlwdGlvbiA9IHN1YlN0ZXAudGV4dCB8fCBzdWJTdGVwLmRlc2NyaXB0aW9uIHx8IChpc1N1Y2Nlc3NcbiAgICAgICAgICA/IGBBSSBhdXRvLWhlYWwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICA6IGBBSSBhdXRvLWhlYWwgZmFpbGVkYCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWVEZXNjcmlwdGlvbixcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcmVhc29uaW5nOiBudWxsLFxuICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgIGlzQWlBdXRvSGVhbFJlc3VsdDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWNvbmQgZW50cnk6IHJlYXNvbmluZyAob25seSBpZiBwcmVzZW50KVxuICAgICAgICBpZiAocmVhc29uaW5nKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVhc29uaW5nLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICByZWFzb25pbmc6IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIHR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBiYXNlRHVyYXRpb24sXG4gICAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbnkgZmFpbGVkIGxvZyB3aGlsZSBhIGNvdW50ZG93biBpcyBhY3RpdmUg4oCTIHJlc29sdmUgaXQgYXMgZmFpbGVkXG4gICAgICAgIGlmICgoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykgJiYgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHN1YlN0ZXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGFzdFByb2Nlc3NlZEluZGV4ID0gYWxsU3ViU3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldExpdmVQcm9jZXNzaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMgPSBbXTtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCA9IDA7XG4gICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNvdW50ZG93blRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvdW50ZG93bkludGVydmFsSWQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGRvd25JbnRlcnZhbElkKTtcbiAgICAgIHRoaXMuY291bnRkb3duSW50ZXJ2YWxJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREdXJhdGlvblRvV2FpdExvY2F0b3JHcm91cEVudHJ5KHN1YlN0ZXA6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXdEdXJhdGlvbiA9IHN1YlN0ZXA/LmR1cmF0aW9uO1xuICAgIGxldCBkZWx0YSA9IDA7XG4gICAgaWYgKHR5cGVvZiByYXdEdXJhdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlbHRhID0gcmF3RHVyYXRpb247XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3RHVyYXRpb24gPT09ICdzdHJpbmcnICYmIHJhd0R1cmF0aW9uLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQocmF3RHVyYXRpb24pO1xuICAgICAgZGVsdGEgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IDA7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UmF3ID0gdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZHVyYXRpb247XG4gICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgIGlmICh0eXBlb2YgY3VycmVudFJhdyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50UmF3O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGN1cnJlbnRSYXcgPT09ICdzdHJpbmcnICYmIGN1cnJlbnRSYXcudHJpbSgpICE9PSAnJykge1xuICAgICAgY29uc3QgcGFyc2VkQ3VycmVudCA9IHBhcnNlRmxvYXQoY3VycmVudFJhdyk7XG4gICAgICBjdXJyZW50ID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZEN1cnJlbnQpID8gcGFyc2VkQ3VycmVudCA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZHVyYXRpb24gPSBjdXJyZW50ICsgZGVsdGE7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxTdWJTdGVwcyA9ICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzIHx8IFtdKSBhcyBhbnlbXTtcbiAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHN1YlN0ZXAgb2YgYWxsU3ViU3RlcHMpIHtcbiAgICAgIGNvbnN0IHVpVHlwZTogc3RyaW5nID0gc3ViU3RlcD8udWlUeXBlIHx8IHN1YlN0ZXA/LnR5cGUgfHwgJyc7XG5cbiAgICAgIC8vIFNwbGl0IEFJX0FVVE9fSEVBTF9TVUNDRVNTL0ZBSUxFRCBpbnRvIHR3byBlbnRyaWVzXG4gICAgICBpZiAodWlUeXBlID09PSAnQUlfQVVUT19IRUFMX1NVQ0NFU1MnIHx8IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9GQUlMRUQnKSB7XG4gICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJTdGVwLnZhbHVlID8/IHN1YlN0ZXAudGV4dCA/PyAnJztcbiAgICAgICAgY29uc3QgcmVhc29uaW5nID0gc3ViU3RlcC5yZWFzb25pbmcgPz8gc3ViU3RlcC5SZWFzb25pbmcgPz8gJyc7XG4gICAgICAgIGNvbnN0IGJhc2VEdXJhdGlvbiA9IHN1YlN0ZXAuZHVyYXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBpc1N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbGVkJztcblxuICAgICAgICAvLyBGaXJzdCBlbnRyeTogdmFsdWUvZGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgdmFsdWVEZXNjcmlwdGlvbiA9IChpc1N1Y2Nlc3NcbiAgICAgICAgICA/IGBBSSBhdXRvLWhlYWwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICA6IGBBSSBhdXRvLWhlYWwgZmFpbGVkYCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWVEZXNjcmlwdGlvbixcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcmVhc29uaW5nOiBudWxsLFxuICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgIGlzQWlBdXRvSGVhbFJlc3VsdDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWNvbmQgZW50cnk6IHJlYXNvbmluZyAob25seSBpZiBwcmVzZW50KVxuICAgICAgICBpZiAocmVhc29uaW5nKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVhc29uaW5nLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICByZWFzb25pbmc6IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIHR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBiYXNlRHVyYXRpb24sXG4gICAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKHN1YlN0ZXA/LnN0YXR1cyA/PyAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBpc0ZhaWxlZCA9IHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZSc7XG4gICAgICAgIGNvbnN0IGlzTG9jYXRvclN0ZXAgPSB1aVR5cGUgPT09ICdXQUlUX0ZPUl9MT0NBVE9SJyB8fCB1aVR5cGUgPT09ICdGSU5EX0xPQ0FUT1InIHx8IHVpVHlwZSA9PT0gJ0xPQ0FUT1JfRk9VTkQnO1xuICAgICAgICBpZiAoaXNMb2NhdG9yU3RlcCAmJiBpc0ZhaWxlZCkge1xuICAgICAgICAgIGNvbnN0IGJhc2VEZXNjID0gc3ViU3RlcD8uZGVzY3JpcHRpb24gPz8gc3ViU3RlcD8udGV4dCA/PyBzdWJTdGVwPy50aXRsZSA/PyAnJztcbiAgICAgICAgICBjb25zdCBub3RGb3VuZFN1ZmZpeCA9ICcgLSBFbGVtZW50IG5vdCBmb3VuZCc7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogKGJhc2VEZXNjID8gYmFzZURlc2MgKyBub3RGb3VuZFN1ZmZpeCA6IG5vdEZvdW5kU3VmZml4LnRyaW0oKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0LnB1c2goc3ViU3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZm9udC1pbnRlciBjcWEtdy1mdWxsXCIgW2NsYXNzLmNxYS1vcGFjaXR5LTUwXT1cImlzRGVidWcgJiYgaXNTa2lwcGVkICYmICFwYXJlbnRTa2lwcGVkXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiIWlzRGVidWcgPyBudWxsIDogc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwYXVzZWQnID8gJyNGRkY5RTknIDogc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnID8gJyNGRUYyRjInIDogbnVsbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1wLTIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyKCRldmVudClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlYnVnSWNvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgW21hdFRvb2x0aXBdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyA/ICdCcmVha3BvaW50IGNhbm5vdCBiZSBzZXQgb24gYSBydW5uaW5nIHN0ZXAnIDogKGlzU3RlcERlbGV0ZWQgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGRlbGV0ZWQgc3RlcHMnIDogKCghIXBhcmVudFNraXBwZWQgJiYgIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCkgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGEgcnVubmluZyBzdGVwJyA6ICghIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCA/ICdCcmVha3BvaW50IGNhbm5vdCBiZSBzZXQgb24gc2tpcHBlZCBzdGVwcycgOiAnJykpKVwiXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLXJvdW5kZWQtZnVsbCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICBbbmdDbGFzc109XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnIHx8ICEhc3RlcD8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhcGFyZW50U2tpcHBlZCB8fCBpc1N0ZXBEZWxldGVkID8gJ2NxYS1jdXJzb3Itbm90LWFsbG93ZWQgY3FhLW9wYWNpdHktNDAgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUnIDogJ2NxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyB8fCAhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZFwiXG4gICAgICAgIChjbGljayk9XCJvbkRlYnVnUG9pbnRDbGljaygkZXZlbnQpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJkZWJ1Z1BvaW50U2V0ID8gJ1JlbW92ZSBkZWJ1ZyBwb2ludCcgOiAnU2V0IGRlYnVnIHBvaW50J1wiPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiZGVidWdQb2ludFNldFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgW2F0dHIuZmlsbF09XCIhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICcjOUU5RTlFJyA6ICcjQzYzNTM1J1wiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgKm5nSWY9XCIhZGVidWdQb2ludFNldFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgW2F0dHIuc3Ryb2tlXT1cIiEhc3RlcD8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhcGFyZW50U2tpcHBlZCB8fCBpc1N0ZXBEZWxldGVkID8gJyM5RTlFOUUnIDogJyNDNjM1MzUnXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBTdGF0dXMgSWNvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDwhLS0gU3VjY2VzcyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3N1Y2Nlc3MnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAuOTAwNSA0Ljk5OTk5QzExLjEyODkgNi4xMjA2NCAxMC45NjYyIDcuMjg1NzEgMTAuNDM5NSA4LjMwMDg5QzkuOTEyNzkgOS4zMTYwOCA5LjA1NCAxMC4xMiA4LjAwNjMxIDEwLjU3ODdDNi45NTg2MiAxMS4wMzczIDUuNzg1MzYgMTEuMTIyOSA0LjY4MjIgMTAuODIxMkMzLjU3OTA0IDEwLjUxOTUgMi42MTI2NSA5Ljg0ODY5IDEuOTQ0MTkgOC45MjA3MUMxLjI3NTczIDcuOTkyNzIgMC45NDU2MTEgNi44NjM2MSAxLjAwODg4IDUuNzIxNjlDMS4wNzIxNSA0LjU3OTc2IDEuNTI0OTkgMy40OTQwNCAyLjI5MTg4IDIuNjQ1NThDMy4wNTg3NiAxLjc5NzEyIDQuMDkzMzQgMS4yMzcyMSA1LjIyMzA4IDEuMDU5MjJDNi4zNTI4MiAwLjg4MTIzMyA3LjUwOTQ0IDEuMDk1OTIgOC41MDAwNSAxLjY2NzQ5XCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSA1LjVMNiA3TDExIDJcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBGYWlsZWQgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhaWxlZCdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiNFRjQ0NDRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00IDRMOCA4TTggNEw0IDhcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBQZW5kaW5nIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGVuZGluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBSdW5uaW5nIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiMzQjgyRjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdza2lwcGVkJ1wiICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgIHNraXBfbmV4dFxuICAgICAgICA8L3NwYW4+XG4gICAgICA8ZGl2ICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwYXVzZWQnXCI+PHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk04LjUgMkg3LjVDNy4yMjM4NiAyIDcgMi4yMjM4NiA3IDIuNVY5LjVDNyA5Ljc3NjE0IDcuMjIzODYgMTAgNy41IDEwSDguNUM4Ljc3NjE0IDEwIDkgOS43NzYxNCA5IDkuNVYyLjVDOSAyLjIyMzg2IDguNzc2MTQgMiA4LjUgMlpcIiBzdHJva2U9XCIjRTE3MTAwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDJIMy41QzMuMjIzODYgMiAzIDIuMjIzODYgMyAyLjVWOS41QzMgOS43NzYxNCAzLjIyMzg2IDEwIDMuNSAxMEg0LjVDNC43NzYxNCAxMCA1IDkuNzc2MTQgNSA5LjVWMi41QzUgMi4yMjM4NiA0Ljc3NjE0IDIgNC41IDJaXCIgc3Ryb2tlPVwiI0UxNzEwMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXY+PHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCI0XCIgZmlsbD1cIiNFQkVDRkRcIi8+PHBhdGggZD1cIk05LjY2NjYzIDQuNjY2NjZMMTEgNS45OTk5OUw5LjY2NjYzIDcuMzMzMzJcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNSA3LjY2NjY3VjcuMzMzMzNDNSA2Ljk3OTcxIDUuMTQwNDggNi42NDA1NyA1LjM5MDUyIDYuMzkwNTJDNS42NDA1NyA2LjE0MDQ4IDUuOTc5NzEgNiA2LjMzMzMzIDZIMTFcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNi4zMzMzMyAxMS4zMzMzTDUgOS45OTk5OUw2LjMzMzMzIDguNjY2NjZcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMTEgOC4zMzMzNFY4LjY2NjY4QzExIDkuMDIwMyAxMC44NTk1IDkuMzU5NDQgMTAuNjA5NSA5LjYwOTQ5QzEwLjM1OTQgOS44NTk1MyAxMC4wMjAzIDEwIDkuNjY2NjcgMTBINVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG5cbiAgICA8IS0tIFN0ZXAgTnVtYmVyIGFuZCBUaXRsZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzMzNDE1NV0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XVwiIHN0eWxlPVwid29yZC1icmVhazogYnJlYWstd29yZDtcIj5cbiAgICAgICAge3sgY29uZmlnPy5zdGVwTnVtYmVyIH19LiA8c3BhbiBbaW5uZXJIVE1MXT1cImNvbmZpZz8udGl0bGVcIj48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICBcbiAgICAgIDwhLS0gTG9vcCBUeXBlIEJhZGdlcyAtLT5cbiAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBnZXRMb29wVHlwZUJhZGdlcygpXCIgXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1mdWxsIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1wcmltYXJ5IGNxYS1iZy1bI0VCRUNGRF0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBiYWRnZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuc3RlcERlbGV0ZWRcIiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQjQyMzE4XSBjcWEtYmctWyNGRUYzRjJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZFRTRFMl1cIj5cbiAgICAgICAgRGVsZXRlZFxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1mb250LWludGVyXCI+XG4gICAgICA8IS0tIFN0ZXAgQ2hhbmdlIEJhZGdlcyAoZGVidWcgb25seSkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEZWJ1Z1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBzdGVwQmFkZ2VzXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAnc2tpcHBlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiU2tpcHBlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjNEE1NTY1J1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjOTlBMUFGJ1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0ZGRkZGRidcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAnZWRpdGVkJ1wiXG4gICAgICAgICAgbGFiZWw9XCJFZGl0ZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInI0ZCQkYyNCdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0ZEREY5MidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGRkY5RTknXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ2FkZGVkJ1wiXG4gICAgICAgICAgbGFiZWw9XCJBZGRlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjMERCRDdEJ1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjNUVEM0E4J1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0NGRjJFNSdcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAncmVtb3ZlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiUmVtb3ZlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjRUUzRjNGJ1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjRjQ3RjdGJ1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0ZDRDlEOSdcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3BhbiAqbmdJZj1cInNlbGZIZWFsQW5hbHlzaXNcIiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwOTdFNTNdIGNxYS1iZy1bI0NGRjJFNV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWluLXctbWF4IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bNnB4XVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjlcIiBoZWlnaHQ9XCI5XCIgdmlld0JveD1cIjAgMCA5IDlcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNC41MDk0MSAwQzQuNTY0ODkgMC4wMjI3Mzg0IDQuNTg4NTkgMC4wNzgyNjUyIDQuNjExMzEgMC4xMjk4NDZDNC42MjI2OSAwLjE1OTkgNC42MzMxNCAwLjE5MDExNyA0LjY0MzI5IDAuMjIwNTc1QzQuNjQ3MjYgMC4yMzIyNDcgNC42NTEyMyAwLjI0MzkxOCA0LjY1NTMyIDAuMjU1OTQzQzQuNzA4MDYgMC40MTMwMDUgNC43NTUwNCAwLjU3MTc0OCA0LjgwMjI5IDAuNzMwMzhDNC44MTI5NyAwLjc2NjE5IDQuODIzNjkgMC44MDE5ODcgNC44MzQ0MiAwLjgzNzc4M0M0Ljg4OTA1IDEuMDIwMDQgNC45NDMyNyAxLjIwMjQgNC45OTcxOSAxLjM4NDg0QzUuMDA0NzYgMS40MTA0NyA1LjAxMjM0IDEuNDM2MDkgNS4wMTk5MiAxLjQ2MTcxQzUuMDQxMjggMS41MzM5NSA1LjA2MjYyIDEuNjA2MTkgNS4wODM4MyAxLjY3ODQ3QzUuMTI4NjcgMS44MzEyIDUuMTc0NzMgMS45ODM0NyA1LjIyMzc4IDIuMTM1MDFDNS4yMjgwNyAyLjE0ODI3IDUuMjMyMzYgMi4xNjE1MiA1LjIzNjc3IDIuMTc1MThDNS4zNjQyIDIuNTY1IDUuNTQ0ODIgMi45MTQzNyA1Ljg0MDkgMy4yMTE5NkM1Ljg0ODIzIDMuMjE5NyA1Ljg1NTU2IDMuMjI3NDQgNS44NjMxMiAzLjIzNTQxQzUuOTg5NSAzLjM2NDM3IDYuMTUxNjkgMy40Njc3MSA2LjMxMzggMy41NTExMUM2LjMyMjA2IDMuNTU1NDIgNi4zMzAzMSAzLjU1OTc0IDYuMzM4ODIgMy41NjQxOUM2LjgxNTg3IDMuODA5MjUgNy4zODk1MSAzLjkxNzA0IDcuOTA2MTkgNC4wNjA1QzguMTMyNiA0LjEyMzQgOC4zNTgzIDQuMTg4MjkgOC41ODMxNyA0LjI1NjAzQzguNTk4OTcgNC4yNjA3OSA4LjYxNDc4IDQuMjY1NTQgOC42MzA1OCA0LjI3MDI4QzguNjc3ODQgNC4yODQ0NSA4LjcyNSA0LjI5ODg3IDguNzcyMTEgNC4zMTM0N0M4Ljc4MzEgNC4zMTY3OSA4Ljc5NDA4IDQuMzIwMTEgOC44MDUzOSA0LjMyMzUzQzguODcwMjkgNC4zNDQwNiA4LjkzMjM5IDQuMzY4MjkgOC45ODU2NiA0LjQxMDI3QzkuMDAxOTEgNC40NDQxOCA5LjAwMTkxIDQuNDQ0MTggOC45OTc0OCA0LjQ3ODFDOC45NDU2NCA0LjUyNzM2IDguODk0MiA0LjU1MDQ2IDguODI1NzggNC41NzNDOC44MTYgNC41NzYzMiA4LjgwNjIyIDQuNTc5NjUgOC43OTYxNCA0LjU4MzA4QzguNjgwNjEgNC42MjE4MyA4LjU2MzUxIDQuNjU1NzUgOC40NDYyNiA0LjY4OTM1QzguNDIyMiA0LjY5NjMgOC4zOTgxNCA0LjcwMzI2IDguMzc0MDggNC43MTAyMUM4LjIyNTcxIDQuNzUzMDEgOC4wNzcwOCA0Ljc5NDkgNy45MjgyOSA0LjgzNjMyQzcuNzMyMzIgNC44OTA4OCA3LjUzNjYzIDQuOTQ2MzQgNy4zNDExMyA1LjAwMjQzQzcuMzA5MSA1LjAxMTYyIDcuMjc3MDYgNS4wMjA3OCA3LjI0NTAxIDUuMDI5OTFDNy4wNzY3MSA1LjA3Nzg2IDYuOTA5MjMgNS4xMjc1MyA2Ljc0MzE0IDUuMTgyMDhDNi43MjkzNyA1LjE4NjU5IDYuNzE1NTkgNS4xOTExIDYuNzAxMzkgNS4xOTU3NEM2LjE0NTExIDUuMzgwODIgNS43MjExIDUuNzI2MDkgNS40NTU3MSA2LjIzMDk5QzUuMzEyNjMgNi41MTQ3NSA1LjIyODIzIDYuODIxNjEgNS4xNDIxNCA3LjEyNDQ3QzUuMTE4ODQgNy4yMDYxOSA1LjA5NDA5IDcuMjg3NDUgNS4wNjkwNSA3LjM2ODY5QzUuMDQ5NCA3LjQzMjYxIDUuMDMwMiA3LjQ5NjYzIDUuMDExNDkgNy41NjA4MUM1LjAwOTI2IDcuNTY4NDQgNS4wMDcwMyA3LjU3NjA4IDUuMDA0NzMgNy41ODM5NUM0Ljk5Mzk0IDcuNjIwOTQgNC45ODMxOSA3LjY1NzkzIDQuOTcyNTIgNy42OTQ5NUM0Ljk0NTE5IDcuNzg4NzkgNC45MTU3OCA3Ljg4MTg3IDQuODg1NTUgNy45NzQ4OUM0LjgzMTkxIDguMTQwMjEgNC43ODMxIDguMzA2NzQgNC43MzQ1OSA4LjQ3MzVDNC42NjE0NCA4LjcyNDU3IDQuNjYxNDQgOC43MjQ1NyA0LjYxOTk3IDguODQ1MjdDNC42MTcyMSA4Ljg1MzM3IDQuNjE0NDYgOC44NjE0NyA0LjYxMTYzIDguODY5ODJDNC41OTY0OSA4LjkxMjc4IDQuNTgwOTIgOC45NTIzMyA0LjU1MjI2IDguOTg4N0M0LjUwODY3IDguOTk3ODggNC41MDg2NyA4Ljk5Nzg4IDQuNDY5NTEgOUM0LjQyNDczIDguOTM3NTkgNC4zOTUwOCA4Ljg3NzExIDQuMzcxMzMgOC44MDUwOEM0LjM2Nzg3IDguNzk0ODcgNC4zNjQ0MSA4Ljc4NDY2IDQuMzYwODUgOC43NzQxNUM0LjMxNjg0IDguNjQyNDggNC4yNzc1MSA4LjUwOTQ2IDQuMjM4MTcgOC4zNzY0NkM0LjIyOTE2IDguMzQ2MDQgNC4yMjAxMSA4LjMxNTY0IDQuMjExMDUgOC4yODUyNEM0LjE0MzYgOC4wNTg2MyA0LjA3NzI1IDcuODMxNzQgNC4wMTEwMSA3LjYwNDgxQzMuNzM1MDcgNi40ODIyNCAzLjczNTA3IDYuNDgyMjQgMy4wMzkgNS41NzQ2NkMzLjAyNzg0IDUuNTY1OTYgMy4wMTY2OSA1LjU1NzI2IDMuMDA1MTkgNS41NDgzQzIuNTQ5MTMgNS4xOTkwMiAxLjk0ODM0IDUuMDY5NjkgMS4zOTgxNSA0LjkxODEzQzEuMjYyMDcgNC44ODA2MiAxLjEyNjA1IDQuODQyOTMgMC45OTAwMzIgNC44MDUyM0MwLjk3ODEzOCA0LjgwMTkzIDAuOTc4MTM4IDQuODAxOTMgMC45NjYwMDMgNC43OTg1N0MwLjc2OTgxMSA0Ljc0NDE3IDAuNTczNjc0IDQuNjg5NjMgMC4zNzgyMjQgNC42MzI4M0MwLjM2OTk1NiA0LjYzMDQ1IDAuMzYxNjg4IDQuNjI4MDYgMC4zNTMxNjkgNC42MjU2MUMwLjA1Mjg5ODkgNC41Mzg4MyAwLjA1Mjg5ODkgNC41Mzg4MyAwLjAwMDY0NjUzNyA0LjQ3ODFDLTAuMDAwODMxMjYxIDQuNDUwNTQgLTAuMDAwODMxMjYxIDQuNDUwNTQgMC4wMTI0Njg5IDQuNDIxNTdDMC4wNjcwODM1IDQuMzcwNCAwLjEyMDA3NyA0LjM0ODQ4IDAuMTkyMTYgNC4zMjYxOUMwLjIwMjU5NyA0LjMyMjg0IDAuMjEzMDM0IDQuMzE5NDggMC4yMjM3ODcgNC4zMTYwM0MwLjI1NTc1MyA0LjMwNTgyIDAuMjg3Nzg4IDQuMjk1ODQgMC4zMTk4NTEgNC4yODU5MkMwLjMyOTAwMSA0LjI4MzA1IDAuMzM4MTUxIDQuMjgwMTcgMC4zNDc1NzggNC4yNzcyMkMwLjQxMjI4NSA0LjI1NjkzIDAuNDc3MjI1IDQuMjM3NCAwLjU0MjI1OSA0LjIxODA5QzAuNTU4MjQgNC4yMTMzMiAwLjU1ODI0IDQuMjEzMzIgMC41NzQ1NDQgNC4yMDg0NkMwLjg1MjI2OSA0LjEyNTg3IDEuMTMxODEgNC4wNDkgMS40MTEyNiAzLjk3MTk2QzEuNjE5NSAzLjkxNDU1IDEuODI3MzggMy44NTYxOCAyLjAzNDYgMy43OTU0OEMyLjA0NDEzIDMuNzkyNzEgMi4wNTM2NSAzLjc4OTkzIDIuMDYzNDYgMy43ODcwN0MyLjU0MzUgMy42NDY5NiAzLjAxMjc4IDMuNDQ4MTYgMy4zMjI3NCAzLjA1MzdDMy4zMjczOCAzLjA0Nzg1IDMuMzMyMDIgMy4wNDIgMy4zMzY4IDMuMDM1OTdDMy42ODE5NyAyLjU5ODE1IDMuODE2NTggMi4wNjU3MiAzLjk2Njk1IDEuNTQ2MjFDNC4wMTY0MyAxLjM3NTM0IDQuMDY2NDkgMS4yMDQ2NCA0LjExNjczIDEuMDMzOTlDNC4xMzA2NCAwLjk4NjczMyA0LjE0NDUzIDAuOTM5NDcxIDQuMTU4MzYgMC44OTIxOTRDNC4yMTM5NCAwLjcwMjI4OSA0LjI3MDM1IDAuNTEyNjQyIDQuMzMgMC4zMjM4NjRDNC4zMzU1OCAwLjMwNjE4NiA0LjM0MTE0IDAuMjg4NTAxIDQuMzQ2NjYgMC4yNzA4MDdDNC40MzAxNyAwLjAwMzk4NzYxIDQuNDMwMTcgMC4wMDM5ODc2MSA0LjUwOTQxIDBaXCIgZmlsbD1cIiMwREJEN0RcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk03LjIzNTk3IDAuNTU0ODU5QzcuMjkwMjQgMC42MTM1OTkgNy4zMDEwOSAwLjY4MjYzMSA3LjMxNzk5IDAuNzU3NjM4QzcuMzc0MzYgMC45OTMyNjkgNy40MzkyOSAxLjIwOTkzIDcuNjY0NjcgMS4zNDY4MUM3LjgwMzcxIDEuNDIwMzUgNy45Njk0NCAxLjQ1MzgxIDguMTIzNSAxLjQ4NTQxQzguMTg4NTQgMS40OTkwMiA4LjI0MzQ4IDEuNTE3MDkgOC4yOTkyNCAxLjU1MzIxQzguMzExODEgMS41NzIyOSA4LjMxMTgxIDEuNTcyMjkgOC4zMTEwNyAxLjYwNTQ5QzguMjk4MTQgMS42NDU4OCA4LjI4Njc4IDEuNjU4OSA4LjI1MjY5IDEuNjg1MzNDOC4yMTU0MyAxLjY5NzI2IDguMjE1NDMgMS42OTcyNiA4LjE3MDY4IDEuNzA2NTNDOC4xNTM3NSAxLjcxMDI1IDguMTM2ODMgMS43MTQgOC4xMTk5MiAxLjcxNzc5QzguMTEwODYgMS43MTk4IDguMTAxODEgMS43MjE4MSA4LjA5MjQ3IDEuNzIzODhDNy44MTY5NiAxLjc4NDgyIDcuODE2OTYgMS43ODQ4MiA3LjU3ODgyIDEuOTIyNzNDNy41NzEwOCAxLjkyODY5IDcuNTYzMzMgMS45MzQ2NiA3LjU1NTM2IDEuOTQwOEM3LjM4NTE2IDIuMDg0MzEgNy4zNDkxNiAyLjMyMzAzIDcuMjk3OTMgMi41MjMwMUM3LjI5NDk5IDIuNTMzOTkgNy4yOTIwNiAyLjU0NDk3IDcuMjg5MDMgMi41NTYyOUM3LjI4NjQ5IDIuNTY2MDEgNy4yODM5NSAyLjU3NTczIDcuMjgxMzMgMi41ODU3NUM3LjI3MDI4IDIuNjE1NDQgNy4yNTg4MSAyLjYzNDc5IDcuMjM1OTcgMi42NTc1NEM3LjE3MjM0IDIuNjY1MjcgNy4xNzIzNCAyLjY2NTI3IDcuMTQxMzkgMi42NTc1NEM3LjA5MjE2IDIuNjIxMDYgNy4wODExNCAyLjU3OTUgNy4wNjgyOCAyLjUyMzY1QzcuMDY2MTMgMi41MTUwMSA3LjA2Mzk4IDIuNTA2MzYgNy4wNjE3NiAyLjQ5NzQ1QzcuMDU0ODkgMi40Njk4MyA3LjA0ODI0IDIuNDQyMTcgNy4wNDE2NCAyLjQxNDQ5QzYuOTg5NzkgMi4xOTg5NyA2LjkzMTI2IDEuOTg3NTEgNi43MjQ1MSAxLjg2MTE4QzYuNTYyOTMgMS43NzUwMSA2LjM2NjQ2IDEuNzM0MjYgNi4xODU4NyAxLjcwMTM2QzYuMTM2MzcgMS42OTE1MSA2LjEwODAyIDEuNjc5MTEgNi4wNzczOCAxLjY0MDEyQzYuMDcwNzMgMS42MDA1NSA2LjA3MDczIDEuNjAwNTUgNi4wNzczOCAxLjU2MDk4QzYuMTI0NDcgMS41MTQzNyA2LjE3NDAyIDEuNTAyOTkgNi4yMzc3MiAxLjQ4ODkxQzYuMjU3NzggMS40ODQxNiA2LjI3Nzg0IDEuNDc5MzggNi4yOTc4OSAxLjQ3NDU2QzYuMzA4MjUgMS40NzIwOSA2LjMxODYxIDEuNDY5NjIgNi4zMjkyOSAxLjQ2NzA3QzYuMzgyMTIgMS40NTQwNyA2LjQzNDQzIDEuNDM5NDkgNi40ODY3MyAxLjQyNDYyQzYuNDk2MjMgMS40MjE5OCA2LjUwNTczIDEuNDE5MzUgNi41MTU1MiAxLjQxNjYzQzYuNjIxODIgMS4zODYyNCA2LjcxMzU2IDEuMzQ3MzcgNi43OTg1NCAxLjI3ODM2QzYuODA2NDcgMS4yNzIxMyA2LjgxNDM5IDEuMjY1ODkgNi44MjI1NSAxLjI1OTQ2QzYuOTU0OCAxLjE0NTY1IDYuOTk5NzQgMC45NzQ2NzQgNy4wNDA1MyAwLjgxNTEzNEM3LjA0MzY0IDAuODAzMDIyIDcuMDQ2NzUgMC43OTA5MSA3LjA0OTk1IDAuNzc4NDMyQzcuMDU2MTQgMC43NTQxMDEgNy4wNjIyMiAwLjcyOTc0MyA3LjA2ODE3IDAuNzA1MzU5QzcuMDcyNDMgMC42ODgzOTQgNy4wNzI0MyAwLjY4ODM5NCA3LjA3Njc4IDAuNjcxMDg2QzcuMDc5MjcgMC42NjA5NTEgNy4wODE3NSAwLjY1MDgxNiA3LjA4NDMxIDAuNjQwMzczQzcuMDk1MjEgMC42MDgxMDggNy4xMDk1MiAwLjU4Mjc3MiA3LjEyOTU3IDAuNTU0ODU5QzcuMTY4MSAwLjUzNjQzNSA3LjE5NTE1IDAuNTQ0NzY0IDcuMjM1OTcgMC41NTQ4NTlaXCIgZmlsbD1cIiMwNzVGM0ZcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xLjc5NTQ1IDYuMjQ3MUMxLjgwOTUxIDYuMjQ3MTkgMS44MDk1MSA2LjI0NzE5IDEuODIzODYgNi4yNDcyOUMxLjkyNDc3IDYuMjUwMjIgMS45OTMwNCA2LjI4MTE1IDIuMDY3MzYgNi4zNDYwMUMyLjE1Mzg0IDYuNDM1MzMgMi4xOTM3NyA2LjUzNjExIDIuMTkxNSA2LjY1NjVDMi4xODE3OCA2Ljc1NDEyIDIuMTIxNTggNi44MzkzNSAyLjA0NzczIDYuOTA1MzNDMS45NjA4MSA2Ljk3MjQyIDEuODczMTMgNi45OTQ1OSAxLjc2MjA2IDYuOTkxNDlDMS42Njg0MSA2Ljk4MTA3IDEuNTgwMyA2LjkzODUyIDEuNTEzOTMgNi44NzQ1MUMxLjQzMTM4IDYuNzY2ODEgMS40MDcyNSA2LjY2ODAzIDEuNDE5MzUgNi41MzUzN0MxLjQ0NDMzIDYuNDMwOTIgMS41MTYzNyA2LjM0NjEzIDEuNjA4NSA2LjI4NjY2QzEuNjcyNTEgNi4yNTU2NCAxLjcyMzk5IDYuMjQ2NTIgMS43OTU0NSA2LjI0NzFaXCIgZmlsbD1cIiMwREJEN0RcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIFNlbGYtaGVhbGVkXG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXJvdW5kZWQtWzRweF0gY3FhLXB5LTAuNSBjcWEtcHgtMSBjcWEtYmctWyM2MzY2RjExQV0gY3FhLW1sLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHlcIiBcbiAgICAgICAgICAgKm5nSWY9XCJzdGVwPy5leGVjdXRlZFJlc3VsdD8udmlkZW9fc3RhcnRfdGltZVwiIFxuICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInSnVtcCB0byB2aWRlbyB0aW1lJ1wiIFxuICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgIChjbGljayk9XCJvbkp1bXBUb1RpbWVzdGFtcCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjM2MzYzXSAhY3FhLXRleHQtWzEwcHhdICFjcWEtdy1bMTBweF0gIWNxYS1oLVsxMHB4XVwiPlxuICAgICAgICAgIHBsYXlfYXJyb3dcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjNjM2MzYzXVwiPlxuICAgICAgICAgIHt7IGZvcm1hdER1cmF0aW9uQ2xvY2soc3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWUgfHwgMCkgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNEZWJ1Z1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTAuNSBjcWEtdGV4dC1bIzlDQTNBRl1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhc3RlcD8uaXNTdGVwR3JvdXBDaGlsZHJlblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIkVkaXRcIiAoY2xpY2spPVwib25FZGl0U3RlcCgkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS10ZXh0LVsxNHB4XSAhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF1cIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhc3RlcD8uaXNTdGVwR3JvdXBDaGlsZHJlblwiIHR5cGU9XCJidXR0b25cIiAjYWRkU3RlcE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIkFkZFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJhZGRTdGVwTWVudVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtbWVudSAjYWRkU3RlcE1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJjcWEtYWRkLXN0ZXAtbWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2YgYWRkU3RlcE1lbnVPcHRpb25zXCIgKGNsaWNrKT1cIm9uQWRkU3RlcE9wdGlvblNlbGVjdChvcHQsICRldmVudClcIj5cbiAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9ucy5sZW5ndGhcIiB0eXBlPVwiYnV0dG9uXCIgI3N0ZXBNb3JlTWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiTW9yZSBvcHRpb25zXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInN0ZXBNb3JlTWVudVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtbWVudSAjc3RlcE1vcmVNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLXN0ZXAtbW9yZS1tZW51XCIgeFBvc2l0aW9uPVwiYmVmb3JlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IG9wdCBvZiBlZmZlY3RpdmVTdGVwTW9yZU1lbnVPcHRpb25zXCIgKGNsaWNrKT1cIm9uU3RlcE1vcmVPcHRpb25TZWxlY3Qob3B0LCAkZXZlbnQpXCI+e3sgb3B0LmxhYmVsIH19PC9idXR0b24+XG4gICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+XG4gICAgICAgIHt7IGZvcm1hdER1cmF0aW9uKGNvbmZpZy5kdXJhdGlvbikgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImlzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTMuNSA1TDcgOC41TDEwLjUgNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IC0tPlxuICA8ZGl2ICpuZ0lmPVwiaXNFeHBhbmRlZFwiPlxuICAgIDwhLS0gSXRlcmF0aW9uIFNlbGVjdG9yIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktMiBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M11cIiAqbmdJZj1cIiFpc0xpdmUgfHwgKGlzTGl2ZSAmJiBjb25maWc/Lml0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZClcIj5cbiAgICAgIDxsYWJlbD5JdGVyYXRpb248L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMTU2cHhdXCI+XG4gICAgICAgIDwhLS0gU3RhdHVzIGluZGljYXRvciBmb3Igc2VsZWN0ZWQgaXRlcmF0aW9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24gJiYgY29uZmlnPy5pdGVyYXRpb25zICYmIGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LVsxMHB4XSBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCI+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjMDBBNjNFXCIvPjwvc3ZnPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdmYWlsZWQnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjRUY0NDQ0XCIvPjwvc3ZnPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiIzlDQTNBRlwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAncnVubmluZydcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCA2IDZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIzXCIgZmlsbD1cIiMzQjgyRjZcIi8+PC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJjcWEtcGwtWzIycHhdIGNxYS1wci02IGNxYS1weS1bNXB4XSBjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkFGQUZBXSBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLWFwcGVhcmFuY2Utbm9uZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEl0ZXJhdGlvblwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlSXRlcmF0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlSXRlcmF0aW9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGlzTGl2ZSAmJiAoc3RhdHVzID09PSAncnVubmluZycgfHwgc3RhdHVzID09PSAnUlVOTklORycpKVwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCIhY29uZmlnPy5pdGVyYXRpb25zIHx8IGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID09PSAwXCIgdmFsdWU9XCJcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgIE5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlcmF0aW9uIG9mIGNvbmZpZy5pdGVyYXRpb25zXCIgW25nVmFsdWVdPVwiaXRlcmF0aW9uXCI+XG4gICAgICAgICAgICB7eyBnZXRJdGVyYXRpb25MYWJlbChpdGVyYXRpb24pIH19XG4gICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8IS0tIERyb3Bkb3duIGFycm93IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yaWdodC0yIGNxYS10b3AtMS8yIGNxYS10cmFuc2Zvcm0gY3FhLS10cmFuc2xhdGUteS0xLzIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCAxMCA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xIDFMNSA1TDkgMVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1tbC1hdXRvXCIgKm5nSWY9XCJjb25maWc/Lml0ZXJhdGlvbnMgJiYgY29uZmlnPy5pdGVyYXRpb25zPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIERlZmF1bHQ6IHt7IGNvbmZpZy5kZWZhdWx0SXRlcmF0aW9uID09PSAnbGFzdCcgPyAnbGFzdCBpdGVyYXRpb24nIDogJ2ZpcnN0IGl0ZXJhdGlvbicgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgSXRlcmF0aW9uIFN1Yi1zdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24gJiYgc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLXB5LTEgY3FhLW1sLTlcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICcxcHggc29saWQgI0YzRjRGNidcIj5cbiAgICAgIDwhLS0gU2luZ2xlIGxvb3A6IHJlbmRlciBhbGwgZW50cmllcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3ViU3RlcCBvZiAoaXNMaXZlID8gcHJvY2Vzc2VkU3ViU3RlcHMgOiBwcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdClcIj5cbiAgICAgICAgPCEtLSBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRUQ6IHJlbmRlciB3aXRoIGFpLWFnZW50LXN0ZXAgc3R5bGUgKGJvdGggbGl2ZSBhbmQgcnVuIHJlc3VsdCBzY3JlZW5zKSAtLT5cbiAgICAgICAgPGNxYS1haS1sb2dzLXdpdGgtcmVhc29uaW5nXG4gICAgICAgICAgKm5nSWY9XCIkYW55KHN1YlN0ZXApLmlzQWlBdXRvSGVhbFJlc3VsdFwiXG4gICAgICAgICAgW3N0YXR1c109XCJzdWJTdGVwLnN0YXR1c1wiXG4gICAgICAgICAgW3RleHRdPVwiJGFueShzdWJTdGVwKS50ZXh0IHx8IHN1YlN0ZXA/LnZhbHVlXCJcbiAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiJGFueShzdWJTdGVwKS5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwPy50ZXh0IHx8IHN1YlN0ZXA/LnZhbHVlXCJcbiAgICAgICAgICBbcmVhc29uaW5nXT1cIiRhbnkoc3ViU3RlcCkucmVhc29uaW5nIHx8IHN1YlN0ZXA/LnJlYXNvbmluZ1wiXG4gICAgICAgICAgW2R1cmF0aW9uXT1cInN1YlN0ZXAuZHVyYXRpb25cIj5cbiAgICAgICAgPC9jcWEtYWktbG9ncy13aXRoLXJlYXNvbmluZz5cblxuICAgICAgICA8IS0tIFJlZ3VsYXIgc3ViLXN0ZXBzIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhJGFueShzdWJTdGVwKS5pc0FpQXV0b0hlYWxSZXN1bHRcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LVs1LjVweF0gY3FhLXB4LTNcIj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIFN0YXR1cyBJY29uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJyB8fCBzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdwYXNzZWQnXCIgPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMC45MDA1IDQuOTk5OTlDMTEuMTI4OSA2LjEyMDY0IDEwLjk2NjIgNy4yODU3MSAxMC40Mzk1IDguMzAwODlDOS45MTI3OSA5LjMxNjA4IDkuMDU0IDEwLjEyIDguMDA2MzEgMTAuNTc4N0M2Ljk1ODYyIDExLjAzNzMgNS43ODUzNiAxMS4xMjI5IDQuNjgyMiAxMC44MjEyQzMuNTc5MDQgMTAuNTE5NSAyLjYxMjY1IDkuODQ4NjkgMS45NDQxOSA4LjkyMDcxQzEuMjc1NzMgNy45OTI3MiAwLjk0NTYxMSA2Ljg2MzYxIDEuMDA4ODggNS43MjE2OUMxLjA3MjE1IDQuNTc5NzYgMS41MjQ5OSAzLjQ5NDA0IDIuMjkxODggMi42NDU1OEMzLjA1ODc2IDEuNzk3MTIgNC4wOTMzNCAxLjIzNzIxIDUuMjIzMDggMS4wNTkyMkM2LjM1MjgyIDAuODgxMjMzIDcuNTA5NDQgMS4wOTU5MiA4LjUwMDA1IDEuNjY3NDlcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDUuNUw2IDdMMTEgMlwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBGYWlsdXJlIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsdXJlJyB8fCBzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiI0RDMjYyNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTcuNSA0LjVMNC41IDcuNVwiIHN0cm9rZT1cIiNEQzI2MjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNC41TDcuNSA3LjVcIiBzdHJva2U9XCIjREMyNjI2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAncGVuZGluZydcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIFJ1bm5pbmcgLSBTaG93IHNwaW5uZXIgKGFsc28gdXNlZCBmb3IgYWN0aXZlIFdBSVRfRk9SX0xPQ0FUT1IgY291bnRkb3duIGluIGxpdmUgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFuaW1hdGUtc3BpbiBjcWEtdGV4dC1bIzNCODJGNl1cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCI2XCIgcj1cIjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiIG9wYWNpdHk9XCIwLjI1XCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMUE1IDUgMCAwIDEgMTEgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3NraXBwZWQnXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgICAgICBza2lwX25leHRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gU3ViLXN0ZXAgRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LVsxM3B4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLXRleHQtWyMzNjQxNTNdXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCI+XG4gICAgICAgICAgICB7eyAkYW55KHN1YlN0ZXApLmRlc2NyaXB0aW9uIHx8ICRhbnkoc3ViU3RlcCkudGV4dCB9fVxuICAgICAgICAgICAgPCEtLSBDb3VudGRvd24gZm9yIGFjdGl2ZSBXQUlUX0ZPUl9MT0NBVE9SIGluIGxpdmUgbW9kZSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNMaXZlICYmICRhbnkoc3ViU3RlcCkucmVtYWluaW5nU2Vjb25kcyAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdGV4dC1bI0Y5NzMxNl0gY3FhLWZvbnQtbWVkaXVtIGNxYS1tbC0xXCI+KHt7ICRhbnkoc3ViU3RlcCkucmVtYWluaW5nU2Vjb25kcyB9fXMgcmVtYWluaW5nKTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIER1cmF0aW9uIC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtbWV0YWRhdGEta2V5XCI+XG4gICAgICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihzdWJTdGVwLmR1cmF0aW9uKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTmVzdGVkIFN0ZXBzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNDaGlsZCB8fCAoY29uZmlnLm5lc3RlZFN0ZXBzICYmIGNvbmZpZy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKVwiIGNsYXNzPVwiY3FhLW1sLTkgY3FhLXBiLTEgY3FhLW5lc3RlZC1zdGVwcy1jb250YWluZXJcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICcxcHggc29saWQgI0YzRjRGNidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M10gY3FhLXB5LVsycHhdIGNxYS1weC0zXCI+TmVzdGVkIHN0ZXBzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcGwtWzE4cHhdXCIgc3R5bGU9XCJib3JkZXItbGVmdDogMnB4IHNvbGlkICNDNUM3RkE7XCI+XG4gICAgICAgIDwhLS0gTG9hZGluZyBpbmRpY2F0b3Igd2hlbiBuZXN0ZWQgc3RlcHMgYXJlIGJlaW5nIGxvYWRlZCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhhc0NoaWxkICYmICghY29uZmlnLm5lc3RlZFN0ZXBzIHx8IGNvbmZpZy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApICYmIGlzU3RlcExvYWRpbmcoKVwiIFxuICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB5LTIgY3FhLXB4LTNcIj5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFuaW1hdGUtc3BpbiBjcWEtdGV4dC1bIzNCODJGNl1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBvcGFjaXR5PVwiMC4yNVwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxQTYgNiAwIDAgMSAxMyA3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzExcHhdIGNxYS1sZWFkaW5nLVsxM3B4XSBjcWEtdGV4dC1bIzczNzM3M11cIj5Mb2FkaW5nIG5lc3RlZCBzdGVwcy4uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgY29uZmlnLm5lc3RlZFN0ZXBzOyBpbmRleCBhcyBpXCI+XG4gICAgICAgICAgPCEtLSBXcmFwcGVyIHRvIHNob3cgc2tlbGV0b24gd2hpbGUgc3RlcC1yZW5kZXJlciBpcyBsb2FkaW5nIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXN0ZXAtcmVuZGVyZXItd3JhcHBlclwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCInZXhjLScgKyBzdGVwLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5sb2FkZWRdPVwiIWlzTmVzdGVkU3RlcExvYWRpbmcoc3RlcClcIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBvdmVybGF5IC0tPlxuICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaXNOZXN0ZWRTdGVwTG9hZGluZyhzdGVwKVwiIGNsYXNzPVwiY3FhLXN0ZXAtc2tlbGV0b24tb3ZlcmxheVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXN0ZXAtc2tlbGV0b24gY3FhLW14LTMgY3FhLW15LTFcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gVXNlIHN0ZXAtcmVuZGVyZXIgZm9yIGFsbCBuZXN0ZWQgc3RlcHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIC0tPlxuICAgICAgICAgICAgPCEtLSBUaGUgc3RlcC1yZW5kZXJlciB3aWxsIGR5bmFtaWNhbGx5IGxvYWQgdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudCBhbmQgcGFzcyBoYW5kbGVycyAtLT5cbiAgICAgICAgICAgIDxjcWEtc3RlcC1yZW5kZXJlciBcbiAgICAgICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgICAgIFtzdGVwTnVtYmVyXT1cInN0ZXAuc3RlcE51bWJlciB8fCAoc3RlcE51bWJlciArICcuJyArIChpICsgMSkpXCJcbiAgICAgICAgICAgICAgW29uRXhwYW5kSGFuZGxlcl09XCJvbkV4cGFuZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyXT1cImdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcl09XCJvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtpc1N0ZXBMb2FkaW5nSGFuZGxlcl09XCJpc1N0ZXBMb2FkaW5nSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtpc1N0ZXBFeHBhbmRlZEhhbmRsZXJdPVwiaXNTdGVwRXhwYW5kZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2NvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXJdPVwiY29udmVydE1zVG9TZWNvbmRzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXJdPVwiZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyXT1cImdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldExvb3BJdGVyYXRpb25zSGFuZGxlcl09XCJnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXJdPVwiZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZm9ybWF0QWN0aW9uc0hhbmRsZXJdPVwiZm9ybWF0QWN0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXJdPVwib25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcl09XCJvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVXBsb2FkQmFzZWxpbmVIYW5kbGVyXT1cIm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXJdPVwiZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkFuYWx5emVIYW5kbGVyXT1cIm9uQW5hbHl6ZUhhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25WaWV3RnVsbExvZ3NIYW5kbGVyXT1cIm9uVmlld0Z1bGxMb2dzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblNlbGZIZWFsQWN0aW9uSGFuZGxlcl09XCJvblNlbGZIZWFsQWN0aW9uSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblN0ZXBDbGlja0hhbmRsZXJdPVwib25TdGVwQ2xpY2tIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uSnNvblBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uRG93bmxvYWRIYW5kbGVyXT1cIm9uRG93bmxvYWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uRmlsZVBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVGV4dENvcGllZEhhbmRsZXJdPVwib25UZXh0Q29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtqdW1wVG9UaW1lc3RhbXBIYW5kbGVyXT1cImp1bXBUb1RpbWVzdGFtcEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZG93bmxvYWRpbmdTdGVwSWRdPVwiZG93bmxvYWRpbmdTdGVwSWRcIlxuICAgICAgICAgICAgICBbaXNVcGxvYWRpbmdCYXNlbGluZV09XCJpc1VwbG9hZGluZ0Jhc2VsaW5lXCJcbiAgICAgICAgICAgICAgW2lzTWFraW5nQ3VycmVudEJhc2VsaW5lXT1cImlzTWFraW5nQ3VycmVudEJhc2VsaW5lXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSXRlcmF0aW9uSWRdPVwic3RlcD8uc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCAnJ1wiXG4gICAgICAgICAgICBbaXNMaXZlXT1cImlzTGl2ZVwiXG4gICAgICAgICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgICAgICAgIFtwYXJlbnRTa2lwcGVkXT1cInNlbGZEZWJ1Z0Rpc2FibGVkXCJcbiAgICAgICAgICAgIFtkZWJ1Z1BvaW50U2V0XT1cImdldERlYnVnUG9pbnRTZXRIYW5kbGVyID8gZ2V0RGVidWdQb2ludFNldEhhbmRsZXIoc3RlcCkgOiBkZWJ1Z1BvaW50U2V0XCJcbiAgICAgICAgICAgIFtnZXREZWJ1Z1BvaW50U2V0SGFuZGxlcl09XCJnZXREZWJ1Z1BvaW50U2V0SGFuZGxlclwiXG4gICAgICAgICAgICBbb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcl09XCJvbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyXCJcbiAgICAgICAgICAgIFtvbkVkaXRTdGVwSGFuZGxlcl09XCJvbkVkaXRTdGVwSGFuZGxlclwiXG4gICAgICAgICAgICBbYWRkU3RlcE1lbnVPcHRpb25zXT1cImdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCA/IGdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZChzdGVwKSA6IGFkZFN0ZXBNZW51T3B0aW9uc1wiXG4gICAgICAgICAgICBbb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcl09XCJvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyXCJcbiAgICAgICAgICAgIFtzdGVwTW9yZU1lbnVPcHRpb25zXT1cImdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgPyBnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkKHN0ZXApIDogc3RlcE1vcmVNZW51T3B0aW9uc1wiXG4gICAgICAgICAgICBbb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXJdPVwib25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXJcIlxuICAgICAgICAgICAgW2dldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZF09XCJnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWRcIlxuICAgICAgICAgICAgW2dldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWRdPVwiZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZFwiXG4gICAgICAgICAgICAgIChhZGRTdGVwSW5zaWRlTG9vcCk9XCJhZGRTdGVwSW5zaWRlTG9vcC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoY29tcG9uZW50UmVhZHkpPVwibWFya1N0ZXBMb2FkZWQoc3RlcClcIj5cbiAgICAgICAgICAgIDwvY3FhLXN0ZXAtcmVuZGVyZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tICsgQWRkIHN0ZXAgaW5zaWRlIGxvb3AgKGRlYnVnIG9ubHksIGhpZGRlbiBpbnNpZGUgc3RlcCBncm91cHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0RlYnVnICYmICFzdGVwPy5pc1N0ZXBHcm91cENoaWxkcmVuXCIgY2xhc3M9XCJjcWEtbWwtOSBjcWEtcHktMiBjcWEtcGwtWzE4cHhdXCIgc3R5bGU9XCJib3JkZXItbGVmdDogMnB4IHNvbGlkICNDNUM3RkE7XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25BZGRTdGVwSW5zaWRlTG9vcCgkZXZlbnQpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItMCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk03IDJWMTJNMiA3SDEyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzcGFuPkFkZCBzdGVwIGluc2lkZSBsb29wPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFZpZXcgQWxsIEl0ZXJhdGlvbnMgTGluayAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnNob3dWaWV3QWxsSXRlcmF0aW9ucyAmJiAhaXNMaXZlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQgY3FhLXB4LTMgY3FhLXB5LVsxMHB4XVwiPlxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25WaWV3QWxsSXRlcmF0aW9uc0NsaWNrKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLW5vLXVuZGVybGluZSBjcWEtdGV4dC1wcmltYXJ5IGNxYS1mb250LXNlbWlib2xkIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgIFZpZXcgYWxsIGl0ZXJhdGlvbnNcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk03LjYzNjM2IDExLjI2N0w2Ljc1ODUyIDEwLjM5NzdMOS4zODc3OCA3Ljc2ODQ3SDNWNi40OTg1OEg5LjM4Nzc4TDYuNzU4NTIgMy44NzM1OEw3LjYzNjM2IDNMMTEuNzY5OSA3LjEzMzUyTDcuNjM2MzYgMTEuMjY3WlwiIGZpbGw9XCIjM0Y0M0VFXCIvPjwvc3ZnPlxuICAgICAgPC9hPlxuICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlbGYgSGVhbCBBbmFseXNpcyAtLT5cbiAgICA8Y3FhLXNlbGYtaGVhbC1hbmFseXNpcyBcbiAgICAgICpuZ0lmPVwic2VsZkhlYWxBbmFseXNpc1wiXG4gICAgICBbaWRdPVwic3RlcD8udGVzdFN0ZXBJZFwiXG4gICAgICBbb3JpZ2luYWxMb2NhdG9yXT1cInNlbGZIZWFsQW5hbHlzaXMub3JpZ2luYWxMb2NhdG9yXCJcbiAgICAgIFtoZWFsZWRMb2NhdG9yXT1cInNlbGZIZWFsQW5hbHlzaXMuaGVhbGVkTG9jYXRvclwiXG4gICAgICBbY29uZmlkZW5jZV09XCJzZWxmSGVhbEFuYWx5c2lzLmNvbmZpZGVuY2VcIlxuICAgICAgW2hlYWxNZXRob2RdPVwic2VsZkhlYWxBbmFseXNpcy5oZWFsTWV0aG9kXCJcbiAgICAgIFtpc0xvYWRpbmdBY2NlcHRdPVwiZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlciA/IGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIoKS5pc0xvYWRpbmdBY2NlcHQ/LltzdGVwPy50ZXN0U3RlcElkXSA6IGZhbHNlXCJcbiAgICAgIFtpc0xvYWRpbmdNb2RpZnlBY2NlcHRdPVwiZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlciA/IGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIoKS5pc0xvYWRpbmdNb2RpZnlBY2NlcHQ/LltzdGVwPy50ZXN0U3RlcElkXSA6IGZhbHNlXCJcbiAgICAgIChhY3Rpb24pPVwib25TZWxmSGVhbEFjdGlvbigkZXZlbnQpXCI+XG4gICAgPC9jcWEtc2VsZi1oZWFsLWFuYWx5c2lzPlxuXG4gICAgPCEtLSBUaW1pbmcgQnJlYWtkb3duIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjb25maWcudGltaW5nQnJlYWtkb3duXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWVuZCBjcWEtZ2FwLTUgY3FhLXB0LTEuNSBjcWEtcHgtNCBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzlDQTNBRl1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz48L2Rpdj5cbiAgICAgICAgPHNwYW4+VGltaW5nIGJyZWFrZG93bjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1kaWFsb2ctbXV0ZWQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICBBcHAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMFwiPnt7IGZvcm1hdER1cmF0aW9uKGNvbmZpZy50aW1pbmdCcmVha2Rvd24uYXBwKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+PHN2ZyB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMSAxMVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNLTMuODE0N2UtMDYgMTAuMzJWLTcuMTUyNTZlLTA3SDAuOTU5OTk2VjEwLjMySC0zLjgxNDdlLTA2WlwiIGZpbGw9XCIjRTVFN0VCXCIvPjwvc3ZnPjwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIFRvb2wgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMFwiPnt7IGZvcm1hdER1cmF0aW9uKGNvbmZpZy50aW1pbmdCcmVha2Rvd24udG9vbCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFZpZXcgTW9yZSBGYWlsZWQgU3RlcCBCdXR0b24gLSBzaG93biB3aGVuIGV4cGFuZGVkIGFuZCBmYWlsdXJlIGRldGFpbHMgZXhpc3QgLS0+XG4gIDxkaXYgKm5nSWY9XCJzaG93Vmlld01vcmVCdXR0b25cIiBjbGFzcz1cImNxYS1tdC0yIGNxYS1weC00XCI+XG4gICAgPGNxYS12aWV3LW1vcmUtZmFpbGVkLXN0ZXAtYnV0dG9uXG4gICAgICBbdGltaW5nQnJlYWtkb3duXT1cInRpbWluZ0JyZWFrZG93blwiXG4gICAgICBbc3ViU3RlcHNdPVwiZ2V0U3ViU3RlcHNGb3JGYWlsZWRTdGVwKClcIlxuICAgICAgW2ZhaWx1cmVEZXRhaWxzXT1cImZhaWx1cmVEZXRhaWxzXCJcbiAgICAgIFtpc0V4cGFuZGVkXT1cInNob3dGYWlsZWRTdGVwRGV0YWlsc1wiXG4gICAgICAodmlld01vcmVDbGljayk9XCJvblZpZXdNb3JlRmFpbGVkU3RlcENsaWNrKCRldmVudClcIj5cbiAgICA8L2NxYS12aWV3LW1vcmUtZmFpbGVkLXN0ZXAtYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIFVwZGF0ZWQgRmFpbGVkIFN0ZXAgQ29tcG9uZW50IC0gc2hvd24gd2hlbiBidXR0b24gaXMgY2xpY2tlZCAtLT5cbiAgPGRpdiAqbmdJZj1cInNob3dWaWV3TW9yZUJ1dHRvbiAmJnNob3dGYWlsZWRTdGVwRGV0YWlscyAmJiBmYWlsdXJlRGV0YWlsc1wiIGNsYXNzPVwiY3FhLW10LTIgY3FhLXB4LTRcIj5cbiAgICA8Y3FhLXVwZGF0ZWQtZmFpbGVkLXN0ZXBcbiAgICAgIFt0ZXN0U3RlcFJlc3VsdElkXT1cInRlc3RTdGVwUmVzdWx0SWRcIlxuICAgICAgW3RpbWluZ0JyZWFrZG93bl09XCJ0aW1pbmdCcmVha2Rvd25cIlxuICAgICAgW2V4cGFuZGVkXT1cInRydWVcIlxuICAgICAgW3N1YlN0ZXBzXT1cImdldFN1YlN0ZXBzRm9yRmFpbGVkU3RlcCgpXCJcbiAgICAgIFtmYWlsdXJlRGV0YWlsc109XCJmYWlsdXJlRGV0YWlsc1wiXG4gICAgICBbcmVhc29uaW5nXT1cInJlYXNvbmluZ1wiXG4gICAgICBbY29uZmlkZW5jZV09XCJjb25maWRlbmNlXCJcbiAgICAgIFtpc1VwbG9hZGluZ0Jhc2VsaW5lXT1cImlzVXBsb2FkaW5nQmFzZWxpbmVcIlxuICAgICAgW2lzTWFraW5nQ3VycmVudEJhc2VsaW5lXT1cImlzTWFraW5nQ3VycmVudEJhc2VsaW5lXCJcbiAgICAgIFtpc0xpdmVdPVwiaXNMaXZlXCJcbiAgICAgIChtYWtlQ3VycmVudEJhc2VsaW5lKT1cIm9uTWFrZUN1cnJlbnRCYXNlbGluZSgkZXZlbnQpXCJcbiAgICAgICh1cGxvYWRCYXNlbGluZSk9XCJvblVwbG9hZEJhc2VsaW5lKCRldmVudClcIlxuICAgICAgKGFuYWx5emUpPVwib25BbmFseXplKClcIlxuICAgICAgKHZpZXdGdWxsTG9ncyk9XCJvblZpZXdGdWxsTG9ncygpXCI+XG4gICAgPC9jcWEtdXBkYXRlZC1mYWlsZWQtc3RlcD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|