@cqa-lib/cqa-ui 1.1.213 → 1.1.215
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/test-case-details/condition-step/condition-step.component.mjs +11 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +11 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +11 -3
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +5 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +34 -8
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +34 -8
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +9 -1
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +9 -1
- package/lib/test-case-details/step-group/step-group.component.d.ts +9 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +1 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -25,6 +25,8 @@ export class TestCaseLoopStepComponent {
|
|
|
25
25
|
this.isLoadingDataProfiles = false;
|
|
26
26
|
/** Options for natural text actions (for while loop condition) */
|
|
27
27
|
this.naturalTextActionsOptions = [];
|
|
28
|
+
/** Show "Add Step Between" buttons */
|
|
29
|
+
this.addStepBetween = false;
|
|
28
30
|
this.toggleExpanded = new EventEmitter();
|
|
29
31
|
this.testDataProfileChange = new EventEmitter();
|
|
30
32
|
this.startStepChange = new EventEmitter();
|
|
@@ -48,6 +50,8 @@ export class TestCaseLoopStepComponent {
|
|
|
48
50
|
this.stepUpdate = new EventEmitter();
|
|
49
51
|
/** Re-emit when a nested step (e.g. normal-step) emits clickAction (e.g. element/label click for popup) */
|
|
50
52
|
this.clickAction = new EventEmitter();
|
|
53
|
+
/** Re-emit addStepBetweenClick from nested renderers */
|
|
54
|
+
this.addStepBetweenClick = new EventEmitter();
|
|
51
55
|
/** Expose global constructors for template (Angular templates don't have String/Number) */
|
|
52
56
|
this.stringFn = String;
|
|
53
57
|
this.numberFn = Number;
|
|
@@ -419,10 +423,10 @@ export class TestCaseLoopStepComponent {
|
|
|
419
423
|
}
|
|
420
424
|
}
|
|
421
425
|
TestCaseLoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
422
|
-
TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isReorder: "isReorder", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover) -->\n <div class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\" \n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "branch", "isReorder", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }] });
|
|
426
|
+
TestCaseLoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseLoopStepComponent, selector: "cqa-test-case-loop-step", inputs: { config: "config", id: "id", loopType: "loopType", stepNumber: "stepNumber", condition: "condition", maxIterations: "maxIterations", testDataProfile: "testDataProfile", startStep: "startStep", endStep: "endStep", nestedSteps: "nestedSteps", expanded: "expanded", isNested: "isNested", isInsideLoop: "isInsideLoop", isReorder: "isReorder", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", addStepBetween: "addStepBetween" }, outputs: { toggleExpanded: "toggleExpanded", testDataProfileChange: "testDataProfileChange", startStepChange: "startStepChange", endStepChange: "endStepChange", conditionChange: "conditionChange", maxIterationsChange: "maxIterationsChange", nestedStepChange: "nestedStepChange", addStep: "addStep", deleteStep: "deleteStep", duplicate: "duplicate", delete: "delete", moreOptions: "moreOptions", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover) -->\n <div class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\" \n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>", styles: [".step-actions{opacity:0;transition:opacity .15s ease}.step-row:hover .step-actions{opacity:1}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "branch", "isReorder", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }] });
|
|
423
427
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
|
|
424
428
|
type: Component,
|
|
425
|
-
args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover) -->\n <div class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\" \n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>" }]
|
|
429
|
+
args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [STEP_ROW_ACTIONS_STYLES], template: "<div class=\"cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: Frame 2147224910 - flex row, 1056\u00D736, gap 12px, flex-none -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-items-center cqa-gap-3 cqa-justify-between\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-grow\">\n <!-- Loop Type Label -->\n <div class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getLoopTypeLabel() }}\n </div>\n\n <!-- FOR LOOP inline edit: cqa-dynamic-select (same usage as default stories) -->\n <ng-container *ngIf=\"loopType === 'for'\">\n <!-- First select: width 216.25px, height 36px, gap 4px, opacity 1 -->\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"forOptionTypeSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"testDataProfileSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"startStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"endStepSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- WHILE LOOP inline edit -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-dynamic-select [form]=\"editForm\" [config]=\"conditionSelectConfig\"\n class=\"cqa-w-full cqa-max-w-[216px]\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" (click)=\"onEditInDepth(); $event.preventDefault()\"\n class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-[2px] cqa-no-underline\">\n Edit In depth\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <!-- Cancel / Apply -->\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Cancel'\"\n (clicked)=\"onEditCancel()\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [customClass]=\"'cqa-text-[14px] cqa-py-[9px]'\" [text]=\"'Apply'\"\n (clicked)=\"onEditApply()\"></cqa-button>\n </div>\n </div>\n\n <!-- Loop Header (normal view when not editing) -->\n <div *ngIf=\"!isEditing\"\n [class]=\"'step-row cqa-flex cqa-items-center cqa-gap-3 cqa-py-2 ' + (isInsideLoop ? 'cqa-pl-10 cqa-pr-4' : 'cqa-px-4')\">\n <!-- Expand/Collapse Icon -->\n <button type=\"button\" (click)=\"onToggleExpanded()\" class=\"cqa-p-0\">\n <svg [class.cqa-rotate-180]=\"!expanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"#6B7280\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Loop Icon -->\n <div *ngIf=\"loopType === 'for'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#1C398E\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#1C398E\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div *ngIf=\"loopType === 'while'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.334 1.33325L14.0007 3.99992L11.334 6.66659\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 7.33333V6.66667C2 5.95942 2.28095 5.28115 2.78105 4.78105C3.28115 4.28095 3.95942 4 4.66667 4H14\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.66667 14.6666L2 11.9999L4.66667 9.33325\" stroke=\"#59168B\" stroke-width=\"1.33333\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M14 8.66675V9.33341C14 10.0407 13.719 10.7189 13.219 11.219C12.7189 11.7191 12.0406 12.0001 11.3333 12.0001H2\"\n stroke=\"#59168B\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Loop Type Label -->\n <span class=\"cqa-font-semibold cqa-text-[#1C398E] cqa-text-[12px] cqa-leading-none\">\n {{ getLoopTypeLabel() }}\n </span>\n\n <!-- For Loop Controls -->\n <div *ngIf=\"loopType === 'for'\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"testDataProfile\" [class.cqa-text-primary]=\"testDataProfile\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getTestDataProfileLabel() }}\n </button>\n\n <!-- Start Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"startStep\" [class.cqa-text-primary]=\"startStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getStartStepLabel() }}\n </button>\n\n <!-- End Button -->\n <button type=\"button\" [class.cqa-bg-primary-100]=\"endStep\" [class.cqa-text-primary]=\"endStep\"\n class=\"cqa-py-0.5 cqa-px-2 cqa-text-[#3F43EE] cqa-text-[14px] cqa-leading-[17px] cqa-font-semibold cqa-border cqa-border-solid cqa-border-[#8A8CF4] cqa-rounded cqa-bg-[#D8D9FC]\">\n {{ getEndStepLabel() }}\n </button>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-gray-700 cqa-text-sm\">\n While\n </span>\n <span class=\"cqa-text-gray-900 cqa-text-sm\" [innerHTML]=\"getConditionDisplay()\"></span>\n </div>\n\n <!-- Steps Summary -->\n <div\n class=\"cqa-ml-auto cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-lg cqa-py-0.5 cqa-px-2 cqa-text-[#0A0A0A] cqa-text-[12px] cqa-leading-[15px]\">\n {{ getStepsSummary() }}\n </div>\n\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover) -->\n <div class=\"step-actions cqa-flex cqa-items-center cqa-gap-3 cqa-px-[7px]\">\n <button type=\"button\" (click)=\"onEdit(); $event.stopPropagation()\" title=\"Edit\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 11.6666H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9.55208 2.1128C9.7843 1.88058 10.0993 1.75012 10.4277 1.75012C10.7561 1.75012 11.071 1.88058 11.3033 2.1128C11.5355 2.34502 11.6659 2.65998 11.6659 2.98838C11.6659 3.31679 11.5355 3.63175 11.3033 3.86397L4.29742 10.8704C4.15864 11.0092 3.9871 11.1107 3.79867 11.1656L2.12333 11.6544C2.07314 11.669 2.01993 11.6699 1.96928 11.6569C1.91863 11.6439 1.8724 11.6176 1.83543 11.5806C1.79846 11.5437 1.7721 11.4974 1.75913 11.4468C1.74615 11.3961 1.74703 11.3429 1.76167 11.2927L2.2505 9.61738C2.30546 9.42916 2.40698 9.25783 2.54567 9.11922L9.55208 2.1128Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onLink(); $event.stopPropagation()\" title=\"Link\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.00065 9.91671H3.66732C2.78326 9.91671 1.93542 9.60942 1.3103 9.06244C0.685174 8.51545 0.333984 7.77359 0.333984 7.00004C0.333984 6.22649 0.685174 5.48463 1.3103 4.93765C1.93542 4.39066 2.78326 4.08337 3.66732 4.08337H5.00065\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M9 4.08337H10.3333C11.2174 4.08337 12.0652 4.39066 12.6904 4.93765C13.3155 5.48463 13.6667 6.22649 13.6667 7.00004C13.6667 7.77359 13.3155 8.51545 12.6904 9.06244C12.0652 9.60942 11.2174 9.91671 10.3333 9.91671H9\"\n stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.33398 7H9.66732\" stroke=\"currentColor\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDuplicate(); $event.stopPropagation()\" title=\"Duplicate\"\n class=\"cqa-p-0 cqa-text-[#99A1Af] hover:cqa-text-[#1447E6]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.666 4.66663H5.83268C5.18835 4.66663 4.66602 5.18896 4.66602 5.83329V11.6666C4.66602 12.311 5.18835 12.8333 5.83268 12.8333H11.666C12.3103 12.8333 12.8327 12.311 12.8327 11.6666V5.83329C12.8327 5.18896 12.3103 4.66663 11.666 4.66663Z\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M2.33268 9.33329C1.69102 9.33329 1.16602 8.80829 1.16602 8.16663V2.33329C1.16602 1.69163 1.69102 1.16663 2.33268 1.16663H8.16602C8.80768 1.16663 9.33268 1.69163 9.33268 2.33329\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button type=\"button\" (click)=\"onDelete(); $event.stopPropagation()\" title=\"Delete\"\n class=\"cqa-p-0 cqa-text-[#ff6467] hover:cqa-text-[#C63535]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.75 3.5H12.25\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M11.0827 3.5V11.6667C11.0827 12.25 10.4993 12.8333 9.91602 12.8333H4.08268C3.49935 12.8333 2.91602 12.25 2.91602 11.6667V3.5\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M4.66602 3.49996V2.33329C4.66602 1.74996 5.24935 1.16663 5.83268 1.16663H8.16602C8.74935 1.16663 9.33268 1.74996 9.33268 2.33329V3.49996\"\n stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.83398 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M8.16602 6.41663V9.91663\" stroke=\"currentColor\" stroke-width=\"1.16667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Expanded Content with Nested Steps (renderer dispatches by step type, n-level nesting) -->\n <div *ngIf=\"expanded\" class=\"cqa-flex cqa-flex-col\">\n <div *ngIf=\"!isReorder\" class=\"cqa-flex cqa-flex-col\">\n <cqa-test-case-details-renderer *ngFor=\"let step of nestedSteps; let i = index\" [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\" \n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n <div *ngIf=\"isReorder\" class=\"cqa-flex cqa-flex-col nested-step-drop-list\"\n [dndDropzone]=\"['step']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"step-drag-placeholder-nested cqa-my-1 cqa-min-h-[50px] cqa-border-2 cqa-border-dashed cqa-border-[#3F43EE] cqa-rounded cqa-bg-[rgba(63,67,238,0.08)] cqa-flex cqa-items-center cqa-justify-center cqa-text-[#3F43EE] cqa-text-xs\">Drop here</div>\n <div *ngFor=\"let step of nestedSteps; let i = index\" class=\"nested-step-drag-item\"\n [dndDraggable]=\"step\"\n dndEffectAllowed=\"move\"\n dndType=\"step\">\n <cqa-test-case-details-renderer [step]=\"step\" [index]=\"i\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetween]=\"addStepBetween\"\n [dataProfileOptions]=\"dataProfileOptions\" [hasMoreDataProfiles]=\"hasMoreDataProfiles\" [isLoadingDataProfiles]=\"isLoadingDataProfiles\"\n [naturalTextActionsOptions]=\"naturalTextActionsOptions\"\n (nestedStepChange)=\"onNestedStepChange($event.step, $event.index)\"\n (addStep)=\"onAddStep()\" (deleteStep)=\"onDeleteStep($event)\"\n (toggleExpanded)=\"onNestedToggleExpanded($event, step, i)\"\n (groupNameChange)=\"$any(step).groupName = $event; onNestedStepChange(step, i)\"\n (descriptionChange)=\"$any(step).description = $event; onNestedStepChange(step, i)\"\n (reusableChange)=\"$any(step).reusable = $event; onNestedStepChange(step, i)\"\n (openExternal)=\"onNestedStepChange(step, i)\" (edit)=\"onNestedStepChange(step, i)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedStepChange(step, i)\" (delete)=\"onDeleteStep(i)\"\n (conditionChange)=\"$any(step).condition = $event; onNestedStepChange(step, i)\"\n (branchStepChange)=\"onNestedStepChange(step, i)\" (addBranch)=\"onNestedConditionAddBranch($any(step), i)\"\n (deleteBranch)=\"onNestedConditionDeleteBranch($any(step), $event, i)\"\n (testDataProfileChange)=\"$any(step).testDataProfile = $event; onNestedStepChange(step, i)\"\n (startStepChange)=\"$any(step).startStep = $event; onNestedStepChange(step, i)\"\n (endStepChange)=\"$any(step).endStep = $event; onNestedStepChange(step, i)\"\n (maxIterationsChange)=\"$any(step).maxIterations = $event; onNestedStepChange(step, i)\"\n (eventTypeChange)=\"$any(step).eventType = $event; onNestedStepChange(step, i)\"\n (parameterChange)=\"onNestedStepChange(step, i)\"\n (selectionChange)=\"$any(step).selected = $event; onNestedStepChange(step, i)\"\n (loadMoreDataProfiles)=\"loadMoreDataProfiles.emit($event)\"\n (searchDataProfiles)=\"searchDataProfiles.emit($event)\"\n (dndDropInZone)=\"dndDropInZone.emit($event)\"\n (clickAction)=\"clickAction.emit($event)\"\n (editInDepth)=\"editInDepth.emit($event)\"\n (addStepBetweenClick)=\"addStepBetweenClick.emit($event)\">\n </cqa-test-case-details-renderer>\n </div>\n </div>\n\n <!-- END Marker -->\n <div\n [class]=\"'cqa-pl-4 cqa-py-1 cqa-bg-[#DBEAFE80] cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium'\"\n style=\"border-top: 1px solid #BEDBFF;\">\n {{ getEndLabel() }}\n </div>\n </div>\n</div>" }]
|
|
426
430
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { config: [{
|
|
427
431
|
type: Input
|
|
428
432
|
}], id: [{
|
|
@@ -459,6 +463,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
459
463
|
type: Input
|
|
460
464
|
}], naturalTextActionsOptions: [{
|
|
461
465
|
type: Input
|
|
466
|
+
}], addStepBetween: [{
|
|
467
|
+
type: Input
|
|
462
468
|
}], toggleExpanded: [{
|
|
463
469
|
type: Output
|
|
464
470
|
}], testDataProfileChange: [{
|
|
@@ -497,5 +503,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
497
503
|
type: Output
|
|
498
504
|
}], clickAction: [{
|
|
499
505
|
type: Output
|
|
506
|
+
}], addStepBetweenClick: [{
|
|
507
|
+
type: Output
|
|
500
508
|
}] } });
|
|
501
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFJekcsT0FBTyxFQUErRyxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFTckUsTUFBTSxPQUFPLHlCQUF5QjtJQWlGcEMsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUE5RTFCLGFBQVEsR0FBb0IsS0FBSyxDQUFDO1FBT2xDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUNwQyxnRkFBZ0Y7UUFDdkUsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUN0RCxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsa0VBQWtFO1FBQ3pELDhCQUF5QixHQUFtQixFQUFFLENBQUM7UUFFOUMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUNqRiwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ25ELG9C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QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9vcFN0ZXBDb25maWcsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgQ29uZGl0aW9uU3RlcENvbmZpZywgU3RlcEdyb3VwQ29uZmlnLCBDb25kaXRpb25CcmFuY2gsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IERhdGFQcm9maWxlT3B0aW9uIH0gZnJvbSAnLi4vLi4vc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1sb29wL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgc3R5bGVzOiBbU1RFUF9ST1dfQUNUSU9OU19TVFlMRVNdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBMb29wU3RlcENvbmZpZztcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxvb3BUeXBlOiAnZm9yJyB8ICd3aGlsZScgPSAnZm9yJztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KCkgY29uZGl0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgZW5kU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKGZvciB3aGlsZSBsb29wIGNvbmRpdGlvbikgKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb25maWc6IExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0U3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZW5kU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29uZGl0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBtYXhJdGVyYXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBuZXN0ZWRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgYWRkU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG5cbiAgb25EbmREcm9wKGV2ZW50OiBEbmREcm9wRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRuZERyb3BJblpvbmUuZW1pdCh7IGV2ZW50LCB0YXJnZXRMaXN0OiB0aGlzLm5lc3RlZFN0ZXBzIH0pO1xuICB9XG5cbiAgLyoqIEV4cG9zZSBnbG9iYWwgY29uc3RydWN0b3JzIGZvciB0ZW1wbGF0ZSAoQW5ndWxhciB0ZW1wbGF0ZXMgZG9uJ3QgaGF2ZSBTdHJpbmcvTnVtYmVyKSAqL1xuICByZWFkb25seSBzdHJpbmdGbiA9IFN0cmluZztcbiAgcmVhZG9ubHkgbnVtYmVyRm4gPSBOdW1iZXI7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGVhZGVyIHNob3dzIGlubGluZSBlZGl0IGZvcm0gKGRyb3Bkb3ducywgaW5wdXRzLCBDYW5jZWwvQXBwbHkpICovXG4gIGlzRWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGZvciBlZGl0IG1vZGU7IGJvdW5kIHRvIGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSBwYXR0ZXJuIGFzIGRlZmF1bHQgc3RvcmllcykgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMgdG8gYXZvaWQgY2hhbmdlLWRldGVjdGlvbiBsb29wcykgKi9cbiAgZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBzdGFydFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGVuZFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogT3B0aW9ucyBmb3IgTG9vcCBTdGFydCAvIExvb3AgRW5kIGRyb3Bkb3ducyAoMS0xMCkgKi9cbiAgbG9vcFN0ZXBPcHRpb25zOiBudW1iZXJbXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF07XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgdmFsdWVzIHdoaWxlIGVkaXRpbmcgKGZvciBDYW5jZWwgcmV2ZXJ0KSAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDoge1xuICAgIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgICBzdGFydFN0ZXA/OiBudW1iZXI7XG4gICAgZW5kU3RlcD86IG51bWJlcjtcbiAgICBjb25kaXRpb24/OiBzdHJpbmc7XG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5sb29wVHlwZSA9IHRoaXMuY29uZmlnLmxvb3BUeXBlO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5jb25maWcubWF4SXRlcmF0aW9ucztcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5jb25maWcudGVzdERhdGFQcm9maWxlO1xuICAgICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmNvbmZpZy5zdGFydFN0ZXA7XG4gICAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmNvbmZpZy5lbmRTdGVwO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuY29uZmlnLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5leHBhbmRlZCA6IHRydWU7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFQcm9maWxlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVEYXRhUHJvZmlsZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdEYXRhUHJvZmlsZXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogW251bGwgYXMgc3RyaW5nIHwgbnVsbF0sXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IFt0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJ10sXG4gICAgICBzdGFydFN0ZXA6IFt0aGlzLnN0YXJ0U3RlcCA/PyBudWxsIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgZW5kU3RlcDogW3RoaXMuZW5kU3RlcCA/PyBudWxsIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgY29uZGl0aW9uOiBbdGhpcy5jb25kaXRpb24gPz8gJyddLFxuICAgICAgbWF4SXRlcmF0aW9uczogW3RoaXMubWF4SXRlcmF0aW9ucyA/PyA1XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBzZWxlY3QgY29uZmlncyBvbmNlIChzYW1lIG9wdGlvbiBzaGFwZSBhcyBkZWZhdWx0IHN0b3JpZXM6IGlkICsgbmFtZSkgKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5sb29wU3RlcE9wdGlvbnMubWFwKChuKSA9PiAoe1xuICAgICAgaWQ6IG4sXG4gICAgICB2YWx1ZTogbixcbiAgICAgIG5hbWU6IFN0cmluZyhuKSxcbiAgICAgIGxhYmVsOiBTdHJpbmcobiksXG4gICAgfSkpO1xuICAgIHRoaXMuZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2Zvck9wdGlvblR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGlkOiAndGVzdC1kYXRhJywgdmFsdWU6ICd0ZXN0LWRhdGEnLCBuYW1lOiAnVGVzdCBEYXRhIFByb2ZpbGUnLCBsYWJlbDogJ1Rlc3QgRGF0YSBQcm9maWxlJyB9LFxuICAgICAgICB7IGlkOiAnZml4ZWQnLCB2YWx1ZTogJ2ZpeGVkJywgbmFtZTogJ0ZpeGVkIGNvdW50JywgbGFiZWw6ICdGaXhlZCBjb3VudCcgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnc3RhcnRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBTdGFydCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdlbmRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBFbmQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgY29uZGl0aW9uIHNlbGVjdCBjb25maWcgd2l0aCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvcHRpb25zICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgd2l0aCBjdXJyZW50IG9wdGlvbnMgYW5kIGNhbGxiYWNrcyAqL1xuICBwcml2YXRlIHVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1Rlc3RkYXRhcHJvZmlsZScsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyh0aGlzLmRhdGFQcm9maWxlT3B0aW9ucyksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeSB8fCAnJyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udmVydCBEYXRhUHJvZmlsZU9wdGlvbltdIHRvIFNlbGVjdE9wdGlvbltdICovXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb24gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBzZWFyY2ggZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgcHJpdmF0ZSBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGxvYWQgbW9yZSBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXRMb29wVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QJyA6ICdXSElMRSBMT09QJztcbiAgfVxuXG4gIGlzV2hpbGVMb29wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnO1xuICB9XG5cbiAgaXNGb3JMb29wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJztcbiAgfVxuXG4gIGdldEVuZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0VORCBGT1InIDogJ0VORCBXSElMRSc7XG4gIH1cblxuICBnZXRTdGVwc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnMCBzdGVwcyc7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydFN0ZXAgfHwgdGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciB8fCAxO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZW5kU3RlcCB8fCB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgfHwgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICByZXR1cm4gYFN0ZXBzICR7c3RhcnR9LSR7ZW5kfSAoJHtjb3VudH0gc3RlcCR7Y291bnQgIT09IDEgPyAncycgOiAnJ30pYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwKSB7XG4gICAgICByZXR1cm4gYFN0YXJ0OiAke3RoaXMuc3RhcnRTdGVwfWA7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRTdGFydCA9IHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgfHwgMTtcbiAgICByZXR1cm4gYFN0YXJ0OiAke2RlZmF1bHRTdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kU3RlcCkge1xuICAgICAgcmV0dXJuIGBFbmQ6ICR7dGhpcy5lbmRTdGVwfWA7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgfHwgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBFbmQ6ICR7ZGVmYXVsdEVuZH1gO1xuICB9XG5cbiAgZ2V0VGVzdERhdGFQcm9maWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50ZXN0RGF0YVByb2ZpbGUpIHtcbiAgICAgIHJldHVybiBgVGVzdCBEYXRhIHByb2ZpbGU6ICR7dGhpcy50ZXN0RGF0YVByb2ZpbGV9YDtcbiAgICB9XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICBnZXRDb25kaXRpb25EaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uIHx8ICdlbGVtZW50IFwiLm5vdGlmaWNhdGlvbi1iYWRnZVwiIGV4aXN0cyc7XG4gIH1cblxuICBvblRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzp0aGlzLmNvbmZpZywgZXhwYW5kZWQ6dGhpcy5leHBhbmRlZH0pO1xuICB9XG5cbiAgb25UZXN0RGF0YVByb2ZpbGVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdmFsdWU7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblN0YXJ0U3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uRW5kU3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbmRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Db25kaXRpb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk1heEl0ZXJhdGlvbnNDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTmVzdGVkU3RlcENoYW5nZShzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5lc3RlZFN0ZXBDaGFuZ2UuZW1pdCh7IHN0ZXAsIGluZGV4IH0pO1xuICB9XG5cbiAgb25OZXN0ZWRUb2dnbGVFeHBhbmRlZChldmVudDogYm9vbGVhbiB8IHtjb25maWc6IFRlc3RDYXNlU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgYm90aCBib29sZWFuIGFuZCBvYmplY3QgZm9ybWF0c1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnICYmIGV2ZW50ICE9PSBudWxsICYmICdleHBhbmRlZCcgaW4gZXZlbnQpIHtcbiAgICAgIC8vIE9iamVjdCBmb3JtYXQgZnJvbSBzdGVwLWdyb3VwOiB7Y29uZmlnLCBleHBhbmRlZH1cbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudC5leHBhbmRlZDtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCdzIGNvbmZpZyBpcyBhIHN0ZXAtZ3JvdXAgKG5vdCB0aGUgY3VycmVudCBzdGVwKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5lc3RlZCBzdGVwLWdyb3VwIGV2ZW50cyBidWJibGUgdXAgY29ycmVjdGx5IGV2ZW4gd2hlbiBjb25kaXRpb24gc3RlcCBpcyBpbnNpZGUgbG9vcCBzdGVwXG4gICAgICBpZiAodGhpcy5pc1N0ZXBHcm91cChldmVudC5jb25maWcpKSB7XG4gICAgICAgIC8vIFJlLWVtaXQgdGhlIHRvZ2dsZUV4cGFuZGVkIGV2ZW50IHdpdGggdGhlIG9iamVjdCBmb3JtYXQsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICAvLyBDYXN0IHRvIHNhdGlzZnkgVHlwZVNjcmlwdCAtIHRoZSByZW5kZXJlciBhY2NlcHRzIFRlc3RDYXNlU3RlcENvbmZpZyB3aGljaCBpbmNsdWRlcyBTdGVwR3JvdXBDb25maWdcbiAgICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6IGV2ZW50LmNvbmZpZyBhcyBhbnkgYXMgTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBldmVudC5leHBhbmRlZH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb29sZWFuIGZvcm1hdCBmcm9tIG90aGVyIHN0ZXAgdHlwZXNcbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudCBhcyBib29sZWFuO1xuICAgIH1cbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbkFkZFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlU3RlcChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVTdGVwLmVtaXQoaW5kZXgpO1xuICB9XG5cbiAgaXNOb3JtYWxTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTm9ybWFsU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdldmVudFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0xvb3BTdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgTG9vcFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnbG9vcFR5cGUnIGluIHN0ZXA7XG4gIH1cblxuICBpc0NvbmRpdGlvblN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBDb25kaXRpb25TdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2NvbmRpdGlvbicgaW4gc3RlcCAmJiAnYnJhbmNoZXMnIGluIHN0ZXA7XG4gIH1cblxuICBpc1N0ZXBHcm91cChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIFN0ZXBHcm91cENvbmZpZyB7XG4gICAgcmV0dXJuICdncm91cE5hbWUnIGluIHN0ZXA7XG4gIH1cblxuICBvbkFkZEJyYW5jaCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uRGVsZXRlQnJhbmNoKGJyYW5jaDogYW55KTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIGEgbmV3IGJyYW5jaCB0byB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKCFuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzID0gW107XG4gICAgfVxuICAgIGNvbnN0IG5ld0JyYW5jaDogQ29uZGl0aW9uQnJhbmNoID0ge1xuICAgICAgdHlwZTogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnaWYnIDogJ2Vsc2UnLFxuICAgICAgbGFiZWw6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ0lGIFRSVUUnIDogJ0VMU0UnLCBcbiAgICAgIHN0ZXBUeXBlOiBTdGVwVHlwZXMuQ09ORElUSU9OX0lGLFxuICAgICAgbmVzdGVkU3RlcHM6IFtdXG4gICAgfTtcbiAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnB1c2gobmV3QnJhbmNoKTtcbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk5lc3RlZENvbmRpdGlvbkRlbGV0ZUJyYW5jaChuZXN0ZWRTdGVwOiBDb25kaXRpb25TdGVwQ29uZmlnLCBicmFuY2g6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIERlbGV0ZSBhIGJyYW5jaCBmcm9tIHRoZSBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBcbiAgICBpZiAobmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoSW5kZXggPSBuZXN0ZWRTdGVwLmJyYW5jaGVzLmluZGV4T2YoYnJhbmNoKTtcbiAgICAgIGlmIChicmFuY2hJbmRleCA+IC0xKSB7XG4gICAgICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMuc3BsaWNlKGJyYW5jaEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25PcGVuRXh0ZXJuYWwoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHtcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwLFxuICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbixcbiAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmb3JPcHRpb25UeXBlOiBudWxsLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAgPz8gbnVsbCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCA/PyBudWxsLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1LFxuICAgIH0pO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXQuZW1pdCgpO1xuICB9XG5cbiAgb25FZGl0QXBwbHkoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuZWRpdEZvcm0udmFsdWU7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsdWUgPSB2LnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHYuc3RhcnRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZFN0ZXAgPSB2LmVuZFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZGl0aW9uID0gdi5jb25kaXRpb24gPz8gJyc7XG4gICAgY29uc3QgbWF4VmFsID0gdi5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHR5cGVvZiBtYXhWYWwgPT09ICdudW1iZXInID8gbWF4VmFsIDogKG1heFZhbCAhPSBudWxsICYmIG1heFZhbCAhPT0gJycgPyBOdW1iZXIobWF4VmFsKSA6IHVuZGVmaW5lZCk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgc2VsZWN0ZWQgZGF0YSBwcm9maWxlIG9wdGlvbiB0byBnZXQgYm90aCBJRCBhbmQgbmFtZVxuICAgIGxldCB0ZXN0RGF0YVByb2ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0ZXN0RGF0YVByb2ZpbGVOYW1lOiBzdHJpbmcgPSAnJztcbiAgICBcbiAgICBpZiAodGVzdERhdGFQcm9maWxlVmFsdWUgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGZvcm0gdmFsdWUgbWlnaHQgYmUgSUQgKG51bWJlcikgb3IgbmFtZSAoc3RyaW5nKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCBvcHRpb24ubmFtZSA9PT0gdGVzdERhdGFQcm9maWxlVmFsdWUgfHwgU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gc2VsZWN0ZWRQcm9maWxlLmlkO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVOYW1lID0gc2VsZWN0ZWRQcm9maWxlLm5hbWU7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSB2YWx1ZSBhcy1pcyAobWlnaHQgYmUgSUQgb3IgbmFtZSlcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZTtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIG5ldyB2YWx1ZXMgKGluY2x1ZGUgdGVzdERhdGFQcm9maWxlSWQgYXMgYWRkaXRpb25hbCBwcm9wZXJ0eSlcbiAgICBjb25zdCB1cGRhdGVkQ29uZmlnOiBMb29wU3RlcENvbmZpZyAmIHsgdGVzdERhdGFQcm9maWxlSWQ/OiBzdHJpbmcgfCBudW1iZXIgfSA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZUlkOiB0ZXN0RGF0YVByb2ZpbGVJZCwgLy8gQWRkIElEIGZvciBBUEkgY2FsbFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgfTtcbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodGhpcy50ZXN0RGF0YVByb2ZpbGUpO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodGhpcy5zdGFydFN0ZXAgPz8gMSk7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodGhpcy5lbmRTdGVwID8/IDEpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29uZGl0aW9uKTtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnXG4gICAgY29uc29sZS5sb2coJ0xvb3Atc3RlcDogRW1pdHRpbmcgc3RlcFVwZGF0ZSBldmVudCcsIHVwZGF0ZWRDb25maWcpO1xuICAgIHRoaXMuc3RlcFVwZGF0ZS5lbWl0KHVwZGF0ZWRDb25maWcpO1xuICAgIFxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZXN0RGF0YVByb2ZpbGU7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5zdGFydFN0ZXA7XG4gICAgdGhpcy5lbmRTdGVwID0gdGhpcy5lZGl0U25hcHNob3QuZW5kU3RlcDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbjtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmVkaXRTbmFwc2hvdC5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ251bWJlcicgPyB0aGlzLnN0ZXBOdW1iZXIgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSA6IDApO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCh7IHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IGlzTmFOKGluZGV4KSA/IDAgOiBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICA8IS0tIElubGluZSBFZGl0IE1vZGU6IEZyYW1lIDIxNDcyMjQ5MTAgLSBmbGV4IHJvdywgMTA1NsOXMzYsIGdhcCAxMnB4LCBmbGV4LW5vbmUgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICA8IS0tIExvb3AgVHlwZSBMYWJlbCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZPUiBMT09QIGlubGluZSBlZGl0OiBjcWEtZHluYW1pYy1zZWxlY3QgKHNhbWUgdXNhZ2UgYXMgZGVmYXVsdCBzdG9yaWVzKSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgPCEtLSBGaXJzdCBzZWxlY3Q6IHdpZHRoIDIxNi4yNXB4LCBoZWlnaHQgMzZweCwgZ2FwIDRweCwgb3BhY2l0eSAxIC0tPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJmb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwidGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZW5kU3RlcFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBXSElMRSBMT09QIGlubGluZSBlZGl0IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzV2hpbGVMb29wKClcIj5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiY29uZGl0aW9uU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEVkaXQgSW4gZGVwdGggbGluayAtLT5cbiAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPlxuICAgICAgICBFZGl0IEluIGRlcHRoXG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIlxuICAgICAgICAgICAgZmlsbD1cIiMzRjQzRUVcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IC0tPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgPyAnY3FhLXBsLTEwIGNxYS1wci00JyA6ICdjcWEtcHgtNCcpXCI+XG4gICAgPCEtLSBFeHBhbmQvQ29sbGFwc2UgSWNvbiAtLT5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25Ub2dnbGVFeHBhbmRlZCgpXCIgY2xhc3M9XCJjcWEtcC0wXCI+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCIhZXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxMEw4IDZMNCAxMFwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIExvb3AgSWNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ3doaWxlJ1wiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEuMzM0IDEuMzMzMjVMMTQuMDAwNyAzLjk5OTkyTDExLjMzNCA2LjY2NjU5XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMiA3LjMzMzMzVjYuNjY2NjdDMiA1Ljk1OTQyIDIuMjgwOTUgNS4yODExNSAyLjc4MTA1IDQuNzgxMDVDMy4yODExNSA0LjI4MDk1IDMuOTU5NDIgNCA0LjY2NjY3IDRIMTRcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk00LjY2NjY3IDE0LjY2NjZMMiAxMS45OTk5TDQuNjY2NjcgOS4zMzMyNVwiIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTQgOC42NjY3NVY5LjMzMzQxQzE0IDEwLjA0MDcgMTMuNzE5IDEwLjcxODkgMTMuMjE5IDExLjIxOUMxMi43MTg5IDExLjcxOTEgMTIuMDQwNiAxMi4wMDAxIDExLjMzMzMgMTIuMDAwMUgyXCJcbiAgICAgICAgICBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1ub25lXCI+XG4gICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIEZvciBMb29wIENvbnRyb2xzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yXCI+XG4gICAgICA8IS0tIFRlc3QgRGF0YSBQcm9maWxlIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwidGVzdERhdGFQcm9maWxlXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwidGVzdERhdGFQcm9maWxlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFN0YXJ0IEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwic3RhcnRTdGVwXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwic3RhcnRTdGVwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFN0YXJ0U3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIEVuZCBCdXR0b24gLS0+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY2xhc3MuY3FhLWJnLXByaW1hcnktMTAwXT1cImVuZFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJlbmRTdGVwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldEVuZFN0ZXBMYWJlbCgpIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2hpbGUgTG9vcCBDb25kaXRpb24gKG9ubHkgc2hvdyBpZiBjb25kaXRpb24gZXhpc3RzKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNXaGlsZUxvb3AoKSAmJiBjb25kaXRpb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTFcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgV2hpbGVcbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS05MDAgY3FhLXRleHQtc21cIiBbaW5uZXJIVE1MXT1cImdldENvbmRpdGlvbkRpc3BsYXkoKVwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNxYS1tbC1hdXRvIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XSBjcWEtcm91bmRlZC1sZyBjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY3Rpb24gSWNvbnM6IEVkaXQsIExpbmssIER1cGxpY2F0ZSwgRGVsZXRlIChzaG93IG9uIGhvdmVyKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RlcC1hY3Rpb25zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weC1bN3B4XVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTcgMTEuNjY2NkgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk05LjU1MjA4IDIuMTEyOEM5Ljc4NDMgMS44ODA1OCAxMC4wOTkzIDEuNzUwMTIgMTAuNDI3NyAxLjc1MDEyQzEwLjc1NjEgMS43NTAxMiAxMS4wNzEgMS44ODA1OCAxMS4zMDMzIDIuMTEyOEMxMS41MzU1IDIuMzQ1MDIgMTEuNjY1OSAyLjY1OTk4IDExLjY2NTkgMi45ODgzOEMxMS42NjU5IDMuMzE2NzkgMTEuNTM1NSAzLjYzMTc1IDExLjMwMzMgMy44NjM5N0w0LjI5NzQyIDEwLjg3MDRDNC4xNTg2NCAxMS4wMDkyIDMuOTg3MSAxMS4xMTA3IDMuNzk4NjcgMTEuMTY1NkwyLjEyMzMzIDExLjY1NDRDMi4wNzMxNCAxMS42NjkgMi4wMTk5MyAxMS42Njk5IDEuOTY5MjggMTEuNjU2OUMxLjkxODYzIDExLjY0MzkgMS44NzI0IDExLjYxNzYgMS44MzU0MyAxMS41ODA2QzEuNzk4NDYgMTEuNTQzNyAxLjc3MjEgMTEuNDk3NCAxLjc1OTEzIDExLjQ0NjhDMS43NDYxNSAxMS4zOTYxIDEuNzQ3MDMgMTEuMzQyOSAxLjc2MTY3IDExLjI5MjdMMi4yNTA1IDkuNjE3MzhDMi4zMDU0NiA5LjQyOTE2IDIuNDA2OTggOS4yNTc4MyAyLjU0NTY3IDkuMTE5MjJMOS41NTIwOCAyLjExMjhaXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uTGluaygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkxpbmtcIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk00LjMzMzk4IDdIOS42NjczMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkR1cGxpY2F0ZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTExLjY2NiA0LjY2NjYzSDUuODMyNjhDNS4xODgzNSA0LjY2NjYzIDQuNjY2MDIgNS4xODg5NiA0LjY2NjAyIDUuODMzMjlWMTEuNjY2NkM0LjY2NjAyIDEyLjMxMSA1LjE4ODM1IDEyLjgzMzMgNS44MzI2OCAxMi44MzMzSDExLjY2NkMxMi4zMTAzIDEyLjgzMzMgMTIuODMyNyAxMi4zMTEgMTIuODMyNyAxMS42NjY2VjUuODMzMjlDMTIuODMyNyA1LjE4ODk2IDEyLjMxMDMgNC42NjY2MyAxMS42NjYgNC42NjY2M1pcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMi4zMzI2OCA5LjMzMzI5QzEuNjkxMDIgOS4zMzMyOSAxLjE2NjAyIDguODA4MjkgMS4xNjYwMiA4LjE2NjYzVjIuMzMzMjlDMS4xNjYwMiAxLjY5MTYzIDEuNjkxMDIgMS4xNjY2MyAyLjMzMjY4IDEuMTY2NjNIOC4xNjYwMkM4LjgwNzY4IDEuMTY2NjMgOS4zMzI2OCAxLjY5MTYzIDkuMzMyNjggMi4zMzMyOVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bI2ZmNjQ2N10gaG92ZXI6Y3FhLXRleHQtWyNDNjM1MzVdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTUuODMzOTggNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xNjYwMiA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCB3aXRoIE5lc3RlZCBTdGVwcyAocmVuZGVyZXIgZGlzcGF0Y2hlcyBieSBzdGVwIHR5cGUsIG4tbGV2ZWwgbmVzdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCJleHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIFtzdGVwXT1cInN0ZXBcIiBbaW5kZXhdPVwiaVwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIiBcbiAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGVkaXQpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcChpKVwiXG4gICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgbmVzdGVkLXN0ZXAtZHJvcC1saXN0XCJcbiAgICAgICAgIFtkbmREcm9wem9uZV09XCJbJ3N0ZXAnXVwiXG4gICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgICAgKGRuZERyb3ApPVwib25EbmREcm9wKCRldmVudClcIj5cbiAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJzdGVwLWRyYWctcGxhY2Vob2xkZXItbmVzdGVkIGNxYS1teS0xIGNxYS1taW4taC1bNTBweF0gY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMzRjQzRUVdIGNxYS1yb3VuZGVkIGNxYS1iZy1bcmdiYSg2Myw2NywyMzgsMC4wOCldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC14c1wiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibmVzdGVkLXN0ZXAtZHJhZy1pdGVtXCJcbiAgICAgICAgICAgW2RuZERyYWdnYWJsZV09XCJzdGVwXCJcbiAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgICBkbmRUeXBlPVwic3RlcFwiPlxuICAgICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyIFtzdGVwXT1cInN0ZXBcIiBbaW5kZXhdPVwiaVwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChlZGl0KT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcChpKVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRU5EIE1hcmtlciAtLT5cbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiJ2NxYS1wbC00IGNxYS1weS0xIGNxYS1iZy1bI0RCRUFGRTgwXSBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0nXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICB7eyBnZXRFbmRMYWJlbCgpIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
509
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFJekcsT0FBTyxFQUErRyxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFTckUsTUFBTSxPQUFPLHlCQUF5QjtJQXFGcEMsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFsRjFCLGFBQVEsR0FBb0IsS0FBSyxDQUFDO1FBT2xDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUNwQyxnRkFBZ0Y7UUFDdkUsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQUN0RCxnRUFBZ0U7UUFDdkQsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDLHNDQUFzQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDaEQsa0VBQWtFO1FBQ3pELDhCQUF5QixHQUFtQixFQUFFLENBQUM7UUFDeEQsc0NBQXNDO1FBQzdCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRS9CLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQStDLENBQUM7UUFDakYs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QU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1sb29wLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtTVEVQX1JPV19BQ1RJT05TX1NUWUxFU10sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b25zICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7Y29uZmlnOiBMb29wU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59PigpO1xuICBAT3V0cHV0KCkgdGVzdERhdGFQcm9maWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzdGFydFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGVuZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNvbmRpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbWF4SXRlcmF0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgbmVzdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWc7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBkdXBsaWNhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtb3JlT3B0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIHVwZGF0ZWQgKEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGVkaXQgbW9kZSkgKi9cbiAgQE91dHB1dCgpIHN0ZXBVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCB3aGVuIGEgbmVzdGVkIHN0ZXAgKGUuZy4gbm9ybWFsLXN0ZXApIGVtaXRzIGNsaWNrQWN0aW9uIChlLmcuIGVsZW1lbnQvbGFiZWwgY2xpY2sgZm9yIHBvcHVwKSAqL1xuICBAT3V0cHV0KCkgY2xpY2tBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9PigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IHRoaXMubmVzdGVkU3RlcHMgfSk7XG4gIH1cblxuICAvKiogRXhwb3NlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlIChBbmd1bGFyIHRlbXBsYXRlcyBkb24ndCBoYXZlIFN0cmluZy9OdW1iZXIpICovXG4gIHJlYWRvbmx5IHN0cmluZ0ZuID0gU3RyaW5nO1xuICByZWFkb25seSBudW1iZXJGbiA9IE51bWJlcjtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZHJvcGRvd25zLCBpbnB1dHMsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZm9yIGVkaXQgbW9kZTsgYm91bmQgdG8gY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHBhdHRlcm4gYXMgZGVmYXVsdCBzdG9yaWVzKSAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIChzdGFibGUgcmVmcyB0byBhdm9pZCBjaGFuZ2UtZGV0ZWN0aW9uIGxvb3BzKSAqL1xuICBmb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHN0YXJ0U3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZW5kU3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgY29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBPcHRpb25zIGZvciBMb29wIFN0YXJ0IC8gTG9vcCBFbmQgZHJvcGRvd25zICgxLTEwKSAqL1xuICBsb29wU3RlcE9wdGlvbnM6IG51bWJlcltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXTtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLmxvb3BUeXBlID0gdGhpcy5jb25maWcubG9vcFR5cGU7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmNvbmZpZy5tYXhJdGVyYXRpb25zO1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmNvbmZpZy50ZXN0RGF0YVByb2ZpbGU7XG4gICAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuY29uZmlnLnN0YXJ0U3RlcDtcbiAgICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuY29uZmlnLmVuZFN0ZXA7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gdGhpcy5jb25maWcubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YVByb2ZpbGVPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZURhdGFQcm9maWxlcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0RhdGFQcm9maWxlcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmb3JPcHRpb25UeXBlOiBbbnVsbCBhcyBzdHJpbmcgfCBudWxsXSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogW3RoaXMudGVzdERhdGFQcm9maWxlID8/ICcnXSxcbiAgICAgIHN0YXJ0U3RlcDogW3RoaXMuc3RhcnRTdGVwID8/IG51bGwgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBlbmRTdGVwOiBbdGhpcy5lbmRTdGVwID8/IG51bGwgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBjb25kaXRpb246IFt0aGlzLmNvbmRpdGlvbiA/PyAnJ10sXG4gICAgICBtYXhJdGVyYXRpb25zOiBbdGhpcy5tYXhJdGVyYXRpb25zID8/IDVdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWdzIG9uY2UgKHNhbWUgb3B0aW9uIHNoYXBlIGFzIGRlZmF1bHQgc3RvcmllczogaWQgKyBuYW1lKSAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmxvb3BTdGVwT3B0aW9ucy5tYXAoKG4pID0+ICh7XG4gICAgICBpZDogbixcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgbmFtZTogU3RyaW5nKG4pLFxuICAgICAgbGFiZWw6IFN0cmluZyhuKSxcbiAgICB9KSk7XG4gICAgdGhpcy5mb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZm9yT3B0aW9uVHlwZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICd0ZXN0LWRhdGEnLCB2YWx1ZTogJ3Rlc3QtZGF0YScsIG5hbWU6ICdUZXN0IERhdGEgUHJvZmlsZScsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH0sXG4gICAgICAgIHsgaWQ6ICdmaXhlZCcsIHZhbHVlOiAnZml4ZWQnLCBuYW1lOiAnRml4ZWQgY291bnQnLCBsYWJlbDogJ0ZpeGVkIGNvdW50JyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdzdGFydFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIFN0YXJ0JyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICB9O1xuICAgIHRoaXMuZW5kU3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2VuZFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIEVuZCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gc2VsZWN0IGNvbmZpZyB3aXRoIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0IGNvbmZpZyB3aXRoIGN1cnJlbnQgb3B0aW9ucyBhbmQgY2FsbGJhY2tzICovXG4gIHByaXZhdGUgdXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnVGVzdGRhdGFwcm9maWxlJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW10gKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZCk7XG4gIH1cblxuICAvKiogSGFuZGxlIHNlYXJjaCBmb3IgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgbG9hZCBtb3JlIGRhdGEgcHJvZmlsZXMgKi9cbiAgcHJpdmF0ZSBvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGdldExvb3BUeXBlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRk9SIExPT1AnIDogJ1dISUxFIExPT1AnO1xuICB9XG5cbiAgaXNXaGlsZUxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZSc7XG4gIH1cblxuICBpc0Zvckxvb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InO1xuICB9XG5cbiAgZ2V0RW5kTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRU5EIEZPUicgOiAnRU5EIFdISUxFJztcbiAgfVxuXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0U3RlcCB8fCB0aGlzLm5lc3RlZFN0ZXBzWzBdPy5zdGVwTnVtYmVyIHx8IDE7XG4gICAgY29uc3QgZW5kID0gdGhpcy5lbmRTdGVwIHx8IHRoaXMubmVzdGVkU3RlcHNbdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggLSAxXT8uc3RlcE51bWJlciB8fCB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiBgU3RlcHMgJHtzdGFydH0tJHtlbmR9ICgke2NvdW50fSBzdGVwJHtjb3VudCAhPT0gMSA/ICdzJyA6ICcnfSlgO1xuICB9XG5cbiAgZ2V0U3RhcnRTdGVwTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXApIHtcbiAgICAgIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5zdGFydFN0ZXB9YDtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0ID0gdGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciB8fCAxO1xuICAgIHJldHVybiBgU3RhcnQ6ICR7ZGVmYXVsdFN0YXJ0fWA7XG4gIH1cblxuICBnZXRFbmRTdGVwTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRTdGVwKSB7XG4gICAgICByZXR1cm4gYEVuZDogJHt0aGlzLmVuZFN0ZXB9YDtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdEVuZCA9IHRoaXMubmVzdGVkU3RlcHNbdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggLSAxXT8uc3RlcE51bWJlciB8fCB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gIH1cblxuICBnZXRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHt0aGlzLnRlc3REYXRhUHJvZmlsZX1gO1xuICAgIH1cbiAgICByZXR1cm4gJ1Rlc3QgRGF0YSBwcm9maWxlJztcbiAgfVxuXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb24gfHwgJ2VsZW1lbnQgXCIubm90aWZpY2F0aW9uLWJhZGdlXCIgZXhpc3RzJztcbiAgfVxuXG4gIG9uVG9nZ2xlRXhwYW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOnRoaXMuY29uZmlnLCBleHBhbmRlZDp0aGlzLmV4cGFuZGVkfSk7XG4gIH1cblxuICBvblRlc3REYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB2YWx1ZTtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU3RhcnRTdGVwQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25FbmRTdGVwQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLmVuZFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkNvbmRpdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTWF4SXRlcmF0aW9uc0NoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdmFsdWU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmVzdGVkU3RlcENoYW5nZS5lbWl0KHsgc3RlcCwgaW5kZXggfSk7XG4gIH1cblxuICBvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBib29sZWFuIHwge2NvbmZpZzogVGVzdENhc2VTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0sIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIHN0ZXAtZ3JvdXA6IHtjb25maWcsIGV4cGFuZGVkfVxuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50LmV4cGFuZGVkO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50J3MgY29uZmlnIGlzIGEgc3RlcC1ncm91cCAobm90IHRoZSBjdXJyZW50IHN0ZXApXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbmVzdGVkIHN0ZXAtZ3JvdXAgZXZlbnRzIGJ1YmJsZSB1cCBjb3JyZWN0bHkgZXZlbiB3aGVuIGNvbmRpdGlvbiBzdGVwIGlzIGluc2lkZSBsb29wIHN0ZXBcbiAgICAgIGlmICh0aGlzLmlzU3RlcEdyb3VwKGV2ZW50LmNvbmZpZykpIHtcbiAgICAgICAgLy8gUmUtZW1pdCB0aGUgdG9nZ2xlRXhwYW5kZWQgZXZlbnQgd2l0aCB0aGUgb2JqZWN0IGZvcm1hdCwgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIC8vIENhc3QgdG8gc2F0aXNmeSBUeXBlU2NyaXB0IC0gdGhlIHJlbmRlcmVyIGFjY2VwdHMgVGVzdENhc2VTdGVwQ29uZmlnIHdoaWNoIGluY2x1ZGVzIFN0ZXBHcm91cENvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIGFueSBhcyBMb29wU3RlcENvbmZpZywgZXhwYW5kZWQ6IGV2ZW50LmV4cGFuZGVkfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvb2xlYW4gZm9ybWF0IGZyb20gb3RoZXIgc3RlcCB0eXBlc1xuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50IGFzIGJvb2xlYW47XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uQWRkU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGVTdGVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZVN0ZXAuZW1pdChpbmRleCk7XG4gIH1cblxuICBpc05vcm1hbFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBOb3JtYWxTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2V2ZW50VHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzTG9vcFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBMb29wU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdsb29wVHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzQ29uZGl0aW9uU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIENvbmRpdGlvblN0ZXBDb25maWcge1xuICAgIHJldHVybiAnY29uZGl0aW9uJyBpbiBzdGVwICYmICdicmFuY2hlcycgaW4gc3RlcDtcbiAgfVxuXG4gIGlzU3RlcEdyb3VwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgU3RlcEdyb3VwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2dyb3VwTmFtZScgaW4gc3RlcDtcbiAgfVxuXG4gIG9uQWRkQnJhbmNoKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBBZGQgYSBuZXcgYnJhbmNoIHRvIHRoZSBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBcbiAgICBpZiAoIW5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgbmV3QnJhbmNoOiBDb25kaXRpb25CcmFuY2ggPSB7XG4gICAgICB0eXBlOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdpZicgOiAnZWxzZScsXG4gICAgICBsYWJlbDogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnSUYgVFJVRScgOiAnRUxTRScsIFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGJyYW5jaDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gRGVsZXRlIGEgYnJhbmNoIGZyb20gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmIChuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBjb25zdCBicmFuY2hJbmRleCA9IG5lc3RlZFN0ZXAuYnJhbmNoZXMuaW5kZXhPZihicmFuY2gpO1xuICAgICAgaWYgKGJyYW5jaEluZGV4ID4gLTEpIHtcbiAgICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcy5zcGxpY2UoYnJhbmNoSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk9wZW5FeHRlcm5hbCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0ge1xuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgIH07XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IG51bGwsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnLFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsLFxuICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwID8/IG51bGwsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgfSk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZWRpdC5lbWl0KCk7XG4gIH1cblxuICBvbkVkaXRBcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHYudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdi5zdGFydFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kU3RlcCA9IHYuZW5kU3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2LmNvbmRpdGlvbiA/PyAnJztcbiAgICBjb25zdCBtYXhWYWwgPSB2Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdHlwZW9mIG1heFZhbCA9PT0gJ251bWJlcicgPyBtYXhWYWwgOiAobWF4VmFsICE9IG51bGwgJiYgbWF4VmFsICE9PSAnJyA/IE51bWJlcihtYXhWYWwpIDogdW5kZWZpbmVkKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBkYXRhIHByb2ZpbGUgb3B0aW9uIHRvIGdldCBib3RoIElEIGFuZCBuYW1lXG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZUlkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRlc3REYXRhUHJvZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIFxuICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZm9ybSB2YWx1ZSBtaWdodCBiZSBJRCAobnVtYmVyKSBvciBuYW1lIChzdHJpbmcpXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLmlkID09PSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IG9wdGlvbi5uYW1lID09PSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSB8fCBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKHRlc3REYXRhUHJvZmlsZVZhbHVlKVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBzZWxlY3RlZFByb2ZpbGUuaWQ7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZU5hbWUgPSBzZWxlY3RlZFByb2ZpbGUubmFtZTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIHZhbHVlIGFzLWlzIChtaWdodCBiZSBJRCBvciBuYW1lKVxuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZVZhbHVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggbmV3IHZhbHVlcyAoaW5jbHVkZSB0ZXN0RGF0YVByb2ZpbGVJZCBhcyBhZGRpdGlvbmFsIHByb3BlcnR5KVxuICAgIGNvbnN0IHVwZGF0ZWRDb25maWc6IExvb3BTdGVwQ29uZmlnICYgeyB0ZXN0RGF0YVByb2ZpbGVJZD86IHN0cmluZyB8IG51bWJlciB9ID0ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgdGVzdERhdGFQcm9maWxlSWQ6IHRlc3REYXRhUHJvZmlsZUlkLCAvLyBBZGQgSUQgZm9yIEFQSSBjYWxsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwLFxuICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbixcbiAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyxcbiAgICB9O1xuICAgIFxuICAgIC8vIEVtaXQgaW5kaXZpZHVhbCBjaGFuZ2UgZXZlbnRzXG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdCh0aGlzLnRlc3REYXRhUHJvZmlsZSk7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh0aGlzLnN0YXJ0U3RlcCA/PyAxKTtcbiAgICB0aGlzLmVuZFN0ZXBDaGFuZ2UuZW1pdCh0aGlzLmVuZFN0ZXAgPz8gMSk7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodGhpcy5jb25kaXRpb24pO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zQ2hhbmdlLmVtaXQodGhpcy5tYXhJdGVyYXRpb25zID8/IDUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IHN0ZXAgdXBkYXRlIGV2ZW50IHdpdGggZnVsbCBjb25maWdcbiAgICBjb25zb2xlLmxvZygnTG9vcC1zdGVwOiBFbWl0dGluZyBzdGVwVXBkYXRlIGV2ZW50JywgdXBkYXRlZENvbmZpZyk7XG4gICAgdGhpcy5zdGVwVXBkYXRlLmVtaXQodXBkYXRlZENvbmZpZyk7XG4gICAgXG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdENhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRoaXMuZWRpdFNuYXBzaG90LnRlc3REYXRhUHJvZmlsZTtcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LnN0YXJ0U3RlcDtcbiAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5lbmRTdGVwO1xuICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uO1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHRoaXMuZWRpdFNuYXBzaG90Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdEluRGVwdGgoKTogdm9pZCB7XG4gICAgdGhpcy5tb3JlT3B0aW9ucy5lbWl0KCk7XG4gICAgY29uc3QgaW5kZXggPSB0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnbnVtYmVyJyA/IHRoaXMuc3RlcE51bWJlciA6ICh0eXBlb2YgdGhpcy5zdGVwTnVtYmVyID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHRoaXMuc3RlcE51bWJlciwgMTApIDogMCk7XG4gICAgdGhpcy5lZGl0SW5EZXB0aC5lbWl0KHsgc3RlcDogdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogaXNOYU4oaW5kZXgpID8gMCA6IGluZGV4IH0pO1xuICB9XG5cbiAgb25MaW5rKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICBvbkR1cGxpY2F0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmR1cGxpY2F0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkRlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogRnJhbWUgMjE0NzIyNDkxMCAtIGZsZXggcm93LCAxMDU2w5czNiwgZ2FwIDEycHgsIGZsZXgtbm9uZSAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LWdyb3dcIj5cbiAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRk9SIExPT1AgaW5saW5lIGVkaXQ6IGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSB1c2FnZSBhcyBkZWZhdWx0IHN0b3JpZXMpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJ1wiPlxuICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImZvck9wdGlvblR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJzdGFydFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJlbmRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFdISUxFIExPT1AgaW5saW5lIGVkaXQgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJjb25kaXRpb25TZWxlY3RDb25maWdcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiXG4gICAgICAgICAgICBmaWxsPVwiIzNGNDNFRVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9hPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgIDwhLS0gQ2FuY2VsIC8gQXBwbHkgLS0+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTG9vcCBIZWFkZXIgKG5vcm1hbCB2aWV3IHdoZW4gbm90IGVkaXRpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdGluZ1wiXG4gICAgW2NsYXNzXT1cIidzdGVwLXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMiAnICsgKGlzSW5zaWRlTG9vcCA/ICdjcWEtcGwtMTAgY3FhLXByLTQnIDogJ2NxYS1weC00JylcIj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgQ29udHJvbHMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTJcIj5cbiAgICAgIDwhLS0gVGVzdCBEYXRhIFByb2ZpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJ0ZXN0RGF0YVByb2ZpbGVcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJ0ZXN0RGF0YVByb2ZpbGVcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0VGVzdERhdGFQcm9maWxlTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gU3RhcnQgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJzdGFydFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJzdGFydFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0U3RhcnRTdGVwTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gRW5kIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwiZW5kU3RlcFwiIFtjbGFzcy5jcWEtdGV4dC1wcmltYXJ5XT1cImVuZFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0RW5kU3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTkwMCBjcWEtdGV4dC1zbVwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwcyBTdW1tYXJ5IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgIHt7IGdldFN0ZXBzU3VtbWFyeSgpIH19XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXIpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FZGl0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRWRpdFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxMS42NjY2SDEyLjI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTkuNTUyMDggMi4xMTI4QzkuNzg0MyAxLjg4MDU4IDEwLjA5OTMgMS43NTAxMiAxMC40Mjc3IDEuNzUwMTJDMTAuNzU2MSAxLjc1MDEyIDExLjA3MSAxLjg4MDU4IDExLjMwMzMgMi4xMTI4QzExLjUzNTUgMi4zNDUwMiAxMS42NjU5IDIuNjU5OTggMTEuNjY1OSAyLjk4ODM4QzExLjY2NTkgMy4zMTY3OSAxMS41MzU1IDMuNjMxNzUgMTEuMzAzMyAzLjg2Mzk3TDQuMjk3NDIgMTAuODcwNEM0LjE1ODY0IDExLjAwOTIgMy45ODcxIDExLjExMDcgMy43OTg2NyAxMS4xNjU2TDIuMTIzMzMgMTEuNjU0NEMyLjA3MzE0IDExLjY2OSAyLjAxOTkzIDExLjY2OTkgMS45NjkyOCAxMS42NTY5QzEuOTE4NjMgMTEuNjQzOSAxLjg3MjQgMTEuNjE3NiAxLjgzNTQzIDExLjU4MDZDMS43OTg0NiAxMS41NDM3IDEuNzcyMSAxMS40OTc0IDEuNzU5MTMgMTEuNDQ2OEMxLjc0NjE1IDExLjM5NjEgMS43NDcwMyAxMS4zNDI5IDEuNzYxNjcgMTEuMjkyN0wyLjI1MDUgOS42MTczOEMyLjMwNTQ2IDkuNDI5MTYgMi40MDY5OCA5LjI1NzgzIDIuNTQ1NjcgOS4xMTkyMkw5LjU1MjA4IDIuMTEyOFpcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTUuMDAwNjUgOS45MTY3MUgzLjY2NzMyQzIuNzgzMjYgOS45MTY3MSAxLjkzNTQyIDkuNjA5NDIgMS4zMTAzIDkuMDYyNDRDMC42ODUxNzQgOC41MTU0NSAwLjMzMzk4NCA3Ljc3MzU5IDAuMzMzOTg0IDcuMDAwMDRDMC4zMzM5ODQgNi4yMjY0OSAwLjY4NTE3NCA1LjQ4NDYzIDEuMzEwMyA0LjkzNzY1QzEuOTM1NDIgNC4zOTA2NiAyLjc4MzI2IDQuMDgzMzcgMy42NjczMiA0LjA4MzM3SDUuMDAwNjVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNOSA0LjA4MzM3SDEwLjMzMzNDMTEuMjE3NCA0LjA4MzM3IDEyLjA2NTIgNC4zOTA2NiAxMi42OTA0IDQuOTM3NjVDMTMuMzE1NSA1LjQ4NDYzIDEzLjY2NjcgNi4yMjY0OSAxMy42NjY3IDcuMDAwMDRDMTMuNjY2NyA3Ljc3MzU5IDEzLjMxNTUgOC41MTU0NSAxMi42OTA0IDkuMDYyNDRDMTIuMDY1MiA5LjYwOTQyIDExLjIxNzQgOS45MTY3MSAxMC4zMzMzIDkuOTE2NzFIOVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTEuNjY2IDQuNjY2NjNINS44MzI2OEM1LjE4ODM1IDQuNjY2NjMgNC42NjYwMiA1LjE4ODk2IDQuNjY2MDIgNS44MzMyOVYxMS42NjY2QzQuNjY2MDIgMTIuMzExIDUuMTg4MzUgMTIuODMzMyA1LjgzMjY4IDEyLjgzMzNIMTEuNjY2QzEyLjMxMDMgMTIuODMzMyAxMi44MzI3IDEyLjMxMSAxMi44MzI3IDExLjY2NjZWNS44MzMyOUMxMi44MzI3IDUuMTg4OTYgMTIuMzEwMyA0LjY2NjYzIDExLjY2NiA0LjY2NjYzWlwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yLjMzMjY4IDkuMzMzMjlDMS42OTEwMiA5LjMzMzI5IDEuMTY2MDIgOC44MDgyOSAxLjE2NjAyIDguMTY2NjNWMi4zMzMyOUMxLjE2NjAyIDEuNjkxNjMgMS42OTEwMiAxLjE2NjYzIDIuMzMyNjggMS4xNjY2M0g4LjE2NjAyQzguODA3NjggMS4xNjY2MyA5LjMzMjY4IDEuNjkxNjMgOS4zMzI2OCAyLjMzMzI5XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xLjc1IDMuNUgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMS4wODI3IDMuNVYxMS42NjY3QzExLjA4MjcgMTIuMjUgMTAuNDk5MyAxMi44MzMzIDkuOTE2MDIgMTIuODMzM0g0LjA4MjY4QzMuNDk5MzUgMTIuODMzMyAyLjkxNjAyIDEyLjI1IDIuOTE2MDIgMTEuNjY2N1YzLjVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNNC42NjYwMiAzLjQ5OTk2VjIuMzMzMjlDNC42NjYwMiAxLjc0OTk2IDUuMjQ5MzUgMS4xNjY2MyA1LjgzMjY4IDEuMTY2NjNIOC4xNjYwMkM4Ljc0OTM1IDEuMTY2NjMgOS4zMzI2OCAxLjc0OTk2IDkuMzMyNjggMi4zMzMyOVYzLjQ5OTk2XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNS44MzM5OCA2LjQxNjYzVjkuOTE2NjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IHdpdGggTmVzdGVkIFN0ZXBzIChyZW5kZXJlciBkaXNwYXRjaGVzIGJ5IHN0ZXAgdHlwZSwgbi1sZXZlbCBuZXN0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cImV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiIFxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKGkpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgICAgW2RhdGFQcm9maWxlT3B0aW9uc109XCJkYXRhUHJvZmlsZU9wdGlvbnNcIiBbaGFzTW9yZURhdGFQcm9maWxlc109XCJoYXNNb3JlRGF0YVByb2ZpbGVzXCIgW2lzTG9hZGluZ0RhdGFQcm9maWxlc109XCJpc0xvYWRpbmdEYXRhUHJvZmlsZXNcIlxuICAgICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgICAgKGFkZFN0ZXApPVwib25BZGRTdGVwKClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgICAgKGdyb3VwTmFtZUNoYW5nZSk9XCIkYW55KHN0ZXApLmdyb3VwTmFtZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAob3BlbkV4dGVybmFsKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChlZGl0KT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGxpbmspPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGR1cGxpY2F0ZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcChpKVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgTWFya2VyIC0tPlxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCInY3FhLXBsLTQgY3FhLXB5LTEgY3FhLWJnLVsjREJFQUZFODBdIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSdcIlxuICAgICAgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0JFREJGRjtcIj5cbiAgICAgIHt7IGdldEVuZExhYmVsKCkgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|