@cqa-lib/cqa-ui 1.1.248 → 1.1.250

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.
Files changed (33) hide show
  1. package/esm2020/lib/execution-screen/ai-action-step/ai-action-step.component.mjs +2 -2
  2. package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +2 -2
  3. package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +2 -2
  4. package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +2 -2
  5. package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +2 -2
  6. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +2 -2
  7. package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +2 -2
  8. package/esm2020/lib/execution-screen/execution-step.models.mjs +1 -1
  9. package/esm2020/lib/execution-screen/failed-step/failed-step.component.mjs +2 -2
  10. package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +2 -2
  11. package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +2 -2
  12. package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +6 -6
  13. package/esm2020/lib/execution-screen/recording-banner/recording-banner.component.mjs +30 -0
  14. package/esm2020/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.mjs +112 -0
  15. package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +7 -7
  16. package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +23 -23
  17. package/esm2020/lib/execution-screen/updated-failed-step/updated-failed-step.component.mjs +2 -2
  18. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
  19. package/esm2020/lib/test-case-details/delete-steps/delete-steps.component.mjs +2 -3
  20. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
  21. package/esm2020/lib/ui-kit.module.mjs +11 -1
  22. package/esm2020/public-api.mjs +3 -1
  23. package/fesm2015/cqa-lib-cqa-ui.mjs +189 -52
  24. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  25. package/fesm2020/cqa-lib-cqa-ui.mjs +189 -51
  26. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  27. package/lib/execution-screen/execution-step.models.d.ts +12 -12
  28. package/lib/execution-screen/recording-banner/recording-banner.component.d.ts +13 -0
  29. package/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.d.ts +37 -0
  30. package/lib/ui-kit.module.d.ts +97 -95
  31. package/package.json +1 -1
  32. package/public-api.d.ts +2 -0
  33. package/styles.css +1 -1
@@ -1004,13 +1004,13 @@ export class TestCaseLoopStepComponent {
1004
1004
  /** Default max for Loop Start / End when no profile selected (options 1..10) */
1005
1005
  TestCaseLoopStepComponent.DEFAULT_LOOP_OPTIONS_MAX = 10;
1006
1006
  TestCaseLoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1007
- 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", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", 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", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"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: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"editForm.get('condition')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables (shown when template is selected, same as condition-step) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">{{ variable.label }}</label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-dynamic-select\n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\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 </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 <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\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 (only show Test Data profile / Start / End when values are set) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button *ngIf=\"hasTestDataProfile()\" 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 *ngIf=\"hasStartValue()\" 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 *ngIf=\"hasEndValue()\" 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 <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\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 <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" 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 </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 [selected]=\"$any(step).selected\"\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)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\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($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 <!-- Empty loop: show plus icon on hover when expanded and no steps -->\n <div *ngIf=\"nestedSteps.length === 0\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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", ".loop-step-empty{opacity:0;transition:opacity .1s ease}.loop-step-row:hover .loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i7.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i9.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i8.DatePipe } });
1007
+ 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", isInsideStepGroup: "isInsideStepGroup", isReorder: "isReorder", selected: "selected", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", naturalTextActionsOptions: "naturalTextActionsOptions", setConditionTemplateVariables: "setConditionTemplateVariables", addStepBetweenAbove: "addStepBetweenAbove", addStepBetweenBelow: "addStepBetweenBelow", 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", viewDetails: "viewDetails", editInDepth: "editInDepth", edit: "edit", dndDropInZone: "dndDropInZone", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", stepUpdate: "stepUpdate", clickAction: "clickAction", addStepBetweenClick: "addStepBetweenClick", selectionChange: "selectionChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "viewDetailsTrigger", first: true, predicate: ["viewDetailsTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"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: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"editForm.get('condition')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables (shown when template is selected, same as condition-step) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">{{ variable.label }}</label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-dynamic-select\n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (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 </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 <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\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 (only show Test Data profile / Start / End when values are set) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button *ngIf=\"hasTestDataProfile()\" 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 *ngIf=\"hasStartValue()\" 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 *ngIf=\"hasEndValue()\" 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 <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\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 <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" 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 </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 [selected]=\"$any(step).selected\"\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)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\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($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 <!-- Empty loop: show plus icon on hover when expanded and no steps -->\n <div *ngIf=\"nestedSteps.length === 0\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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", ".loop-step-empty{opacity:0;transition:opacity .1s ease}.loop-step-row:hover .loop-step-empty{opacity:1}.loop-step-empty-add{padding:0;background:transparent;border:0;cursor:pointer;color:#3f43ee;transition:opacity .15s ease}.loop-step-empty-add:hover{opacity:.9}\n"], components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.AutocompleteComponent, selector: "cqa-autocomplete", inputs: ["placeholder", "options", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "optionSelect", "cleared"] }, { type: i4.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i7.TestCaseDetailsRendererComponent, selector: "cqa-test-case-details-renderer", inputs: ["step", "index", "isNested", "isInsideLoop", "isInsideStepGroup", "branch", "isReorder", "selected", "addStepBetweenAbove", "addStepBetweenBelow", "addStepBetween", "dataProfileOptions", "hasMoreDataProfiles", "isLoadingDataProfiles", "naturalTextActionsOptions", "setConditionTemplateVariables"], outputs: ["nestedStepChange", "addStep", "deleteStep", "toggleExpanded", "groupNameChange", "descriptionChange", "reusableChange", "openExternal", "edit", "link", "duplicate", "delete", "viewDetails", "selectionChange", "conditionChange", "branchStepChange", "addStepForBranch", "addStepForLoop", "deleteStepWithBranch", "addBranch", "addElse", "deleteBranch", "testDataProfileChange", "startStepChange", "endStepChange", "maxIterationsChange", "eventTypeChange", "parameterChange", "clickAction", "dndDropInZone", "loadMoreDataProfiles", "searchDataProfiles", "stepUpdate", "addStepBetweenClick", "editInDepth"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i9.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i9.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i8.DatePipe } });
1008
1008
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
1009
1009
  type: Component,
1010
1010
  args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [
1011
1011
  STEP_ROW_ACTIONS_STYLES,
1012
1012
  LOOP_STEP_EMPTY_STYLES,
1013
- ], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"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: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"editForm.get('condition')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables (shown when template is selected, same as condition-step) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">{{ variable.label }}</label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-dynamic-select\n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\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 </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 <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\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 (only show Test Data profile / Start / End when values are set) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button *ngIf=\"hasTestDataProfile()\" 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 *ngIf=\"hasStartValue()\" 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 *ngIf=\"hasEndValue()\" 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 <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\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 <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" 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 </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 [selected]=\"$any(step).selected\"\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)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\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($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 <!-- Empty loop: show plus icon on hover when expanded and no steps -->\n <div *ngIf=\"nestedSteps.length === 0\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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>" }]
1013
+ ], template: "<div class=\"loop-step-row cqa-flex cqa-flex-col\">\n <!-- Inline Edit Mode: stop propagation so dropdown/select interactions don't bubble and collapse the step or start drag -->\n <div *ngIf=\"isEditing\" class=\"cqa-py-2.5 cqa-px-4 cqa-flex cqa-flex-col cqa-gap-3\" (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"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: cqa-autocomplete + template variables (same as condition-step) -->\n <ng-container *ngIf=\"isWhileLoop()\">\n <cqa-autocomplete\n *ngIf=\"editForm\"\n [options]=\"whileConditionAutocompleteOptions\"\n [value]=\"editForm.get('condition')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('condition', $event)\"\n (optionSelect)=\"onConditionSelect($event)\"\n placeholder=\"Select condition\"\n [fullWidth]=\"true\"\n class=\"cqa-w-full cqa-max-w-[216px]\">\n </cqa-autocomplete>\n <!-- Template variables (shown when template is selected, same as condition-step) -->\n <div *ngIf=\"selectedTemplate && templateVariables && templateVariables.length > 0\" class=\"cqa-flex cqa-flex-row cqa-flex-wrap cqa-gap-3\">\n <ng-container *ngFor=\"let variable of templateVariables\">\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-gray-700\">{{ variable.label }}</label>\n <mat-slide-toggle\n [checked]=\"templateVariablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"templateVariablesForm.get(variable.name)?.setValue($event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.type !== 'boolean' && variable.name !== 'custom_code'\">\n <ng-container *ngIf=\"variable.name === 'type' || variable.name === 'scrollTo' || variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-dynamic-select\n [form]=\"templateVariablesForm\"\n [config]=\"getSelectConfigForVariable(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"variable.name !== 'type' && variable.name !== 'scrollTo' && !variable.options\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"min-width: 150px;\">\n <cqa-custom-input\n [placeholder]=\"'Enter ' + variable.label\"\n [value]=\"templateVariablesForm.get(variable.name)?.value || variable.value || ''\"\n [fullWidth]=\"true\"\n (valueChange)=\"templateVariablesForm.get(variable.name)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Edit In depth link -->\n <a href=\"#\" *ngIf=\"isWhileLoop()\" (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 </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 <div class=\"cqa-inline-flex cqa-items-center\">\n <!-- Drag Handle Icon (when isReorder is true) -->\n <div *ngIf=\"isReorder\" class=\"cqa-mr-2 cqa-cursor-move cqa-text-[#6B7280] hover:cqa-text-[#111827]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n <!-- Checkbox (when isReorder is false) -->\n <label *ngIf=\"!isReorder\" class=\"cqa-flex cqa-items-center cqa-cursor-pointer cqa-relative cqa-mr-2\">\n <input type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"onSelectionChange($event)\"\n class=\"cqa-h-4 cqa-w-4 cqa-cursor-pointer cqa-transition-all cqa-appearance-none cqa-rounded shadow hover:cqa-shadow-md cqa-border cqa-border-solid cqa-border-slate-300 cqa-flex-shrink-0\"\n [class.cqa-bg-[#3F43EE]]=\"selected\"\n [class.cqa-border-[#3F43EE]]=\"selected\"\n id=\"check-loop-step\" />\n <span class=\"cqa-absolute cqa-text-white cqa-top-1/2 cqa-left-1/2 cqa--translate-x-1/2 cqa--translate-y-1/2 cqa-pointer-events-none cqa-flex cqa-items-center cqa-justify-center\"\n [class.cqa-opacity-0]=\"!selected\"\n [class.cqa-opacity-100]=\"selected\">\n <svg width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 3.125L4.5 8.625L2 6.125\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </label>\n </div>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-[18px] cqa-min-w-[32px]\">{{ stepNumber }}</span>\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 (only show Test Data profile / Start / End when values are set) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2\">\n <!-- Test Data Profile Button -->\n <button *ngIf=\"hasTestDataProfile()\" 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 *ngIf=\"hasStartValue()\" 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 *ngIf=\"hasEndValue()\" 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 <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-ml-auto\">\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 <!-- View Details Link (show only if description is not empty) -->\n <a *ngIf=\"config.description && config.description.trim() !== ''\" #viewDetailsTrigger href=\"#\" (click)=\"onViewDetails($event)\" class=\"cqa-text-[#3F43EE] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-2 cqa-no-underline cqa-ml-auto\">View Details<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.03809 6.74329L2.62809 7.33329L5.96142 3.99996L2.62809 0.666626L2.03809 1.25663L4.78142 3.99996L2.03809 6.74329Z\" fill=\"#3F43EE\"/></svg></a>\n\n <!-- Created Date (from API) - before action icons, format: 25 Feb 2026 -->\n <span *ngIf=\"config.createdDate\" class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-leading-[15px]\">\n {{ config.createdDate | date:'d MMM yyyy' }}\n </span>\n <!-- Action Icons: Edit, Link, Duplicate, Delete (show on hover; hidden when inside step-group) -->\n <div *ngIf=\"!isInsideStepGroup\" 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 </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 [selected]=\"$any(step).selected\"\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)=\"onNestedEdit($event)\"\n (link)=\"onNestedStepChange(step, i)\" (duplicate)=\"onNestedDuplicate($event, step)\" (delete)=\"onDeleteStep($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 [selected]=\"$any(step).selected\"\n [isNested]=\"true\" [isInsideLoop]=\"true\" [isReorder]=\"isReorder\"\n [addStepBetweenAbove]=\"addStepBetweenAbove\"\n [addStepBetweenBelow]=\"addStepBetweenBelow\"\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($event, i)\"\n (viewDetails)=\"viewDetails.emit($event)\"\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 <!-- Empty loop: show plus icon on hover when expanded and no steps -->\n <div *ngIf=\"nestedSteps.length === 0\" class=\"loop-step-empty cqa-min-h-[52px] cqa-flex cqa-items-center cqa-justify-center cqa-pl-4 cqa-pr-4\">\n <button type=\"button\" (click)=\"onAddStepEmpty(); $event.stopPropagation()\" title=\"Add step\"\n class=\"loop-step-empty-add\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" fill=\"white\" />\n <rect x=\"1\" y=\"1\" width=\"21.1822\" height=\"22\" rx=\"10.5911\" stroke=\"#3F43EE\" stroke-width=\"2\" />\n <path d=\"M8.5 12H15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12 8.5V15.5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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>" }]
1014
1014
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
1015
1015
  type: Input
1016
1016
  }], id: [{
@@ -1107,4 +1107,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1107
1107
  type: ViewChild,
1108
1108
  args: ['viewDetailsTrigger', { static: false }]
1109
1109
  }] } });
1110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sc0JBQXNCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0I5QixDQUFDO0FBVUYsTUFBTSxPQUFPLHlCQUF5QjtJQThHcEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0d2QixhQUFRLEdBQW9CLEtBQUssQ0FBQztRQU9sQyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0ZBQWdGO1FBQ3ZFLHVCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDdEQs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dGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBleHBhbmRlZCBhbmQgbm8gc3RlcHMgKi9cbiAgLmxvb3Atc3RlcC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxuICAubG9vcC1zdGVwLXJvdzpob3ZlciAubG9vcC1zdGVwLWVtcHR5IHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICMzRjQzRUU7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWxvb3Atc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1xuICAgIFNURVBfUk9XX0FDVElPTlNfU1RZTEVTLFxuICAgIExPT1BfU1RFUF9FTVBUWV9TVFlMRVMsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogRnVuY3Rpb24gdG8gcHJvY2VzcyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgQElucHV0KCkgc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogYW55KSA9PiBhbnlbXSA9ICgpID0+IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIHRlc3REYXRhUHJvZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3RhcnRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlbmRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG1heEl0ZXJhdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIG5lc3RlZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIC8qKiBFbWl0cyB2b2lkIHdoZW4gYWRkIGlzIGZyb20gbmVzdGVkIGNvbnRlbnQ7IGVtaXRzIHsgbG9vcFN0ZXBDb25maWcgfSB3aGVuIGVtcHR5LXN0YXRlIGFkZCBpcyBjbGlja2VkIChzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuKS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQgfCB7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZHVwbGljYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFeHBvc2UgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgdGVtcGxhdGUgKEFuZ3VsYXIgdGVtcGxhdGVzIGRvbid0IGhhdmUgU3RyaW5nL051bWJlcikgKi9cbiAgcmVhZG9ubHkgc3RyaW5nRm4gPSBTdHJpbmc7XG4gIHJlYWRvbmx5IG51bWJlckZuID0gTnVtYmVyO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBzaG93cyBpbmxpbmUgZWRpdCBmb3JtIChkcm9wZG93bnMsIGlucHV0cywgQ2FuY2VsL0FwcGx5KSAqL1xuICBpc0VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgKHNhbWUgcGF0dGVybiBhcyBkZWZhdWx0IHN0b3JpZXMpICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzIHRvIGF2b2lkIGNoYW5nZS1kZXRlY3Rpb24gbG9vcHMpICovXG4gIGZvck9wdGlvblR5cGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgc3RhcnRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBlbmRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBjb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIC8qKiBXaGlsZSBsb29wOiBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBvcHRpb25zIChXSElMRV9DT05ESVRJT04gb25seSkgKi9cbiAgd2hpbGVDb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIFNlbGVjdGVkIHRlbXBsYXRlIGZvciB3aGlsZSBjb25kaXRpb24gKHNhbWUgcGF0dGVybiBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgLyoqIFRlbXBsYXRlIHZhcmlhYmxlcyBmb3Igd2hpbGUgY29uZGl0aW9uICovXG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICAvKiogRm9ybSBncm91cCBmb3IgdGVtcGxhdGUgdmFyaWFibGVzICovXG4gIHRlbXBsYXRlVmFyaWFibGVzRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRGVmYXVsdCBtYXggZm9yIExvb3AgU3RhcnQgLyBFbmQgd2hlbiBubyBwcm9maWxlIHNlbGVjdGVkIChvcHRpb25zIDEuLjEwKSAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPT1BfT1BUSU9OU19NQVggPSAxMDtcblxuICBAVmlld0NoaWxkKCd2aWV3RGV0YWlsc1RyaWdnZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgdmlld0RldGFpbHNUcmlnZ2VyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgdmFsdWVzIHdoaWxlIGVkaXRpbmcgKGZvciBDYW5jZWwgcmV2ZXJ0KSAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDoge1xuICAgIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgICBzdGFydFN0ZXA/OiBudW1iZXI7XG4gICAgZW5kU3RlcD86IG51bWJlcjtcbiAgICBjb25kaXRpb24/OiBzdHJpbmc7XG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgICBzZWxlY3RlZFRlbXBsYXRlPzogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU/OiBhbnk7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5sb29wVHlwZSA9IHRoaXMuY29uZmlnLmxvb3BUeXBlO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5jb25maWcubWF4SXRlcmF0aW9ucztcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5jb25maWcudGVzdERhdGFQcm9maWxlO1xuICAgICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmNvbmZpZy5zdGFydFN0ZXA7XG4gICAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmNvbmZpZy5lbmRTdGVwO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuY29uZmlnLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5leHBhbmRlZCA6IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgICB0aGlzLnJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgICAgLy8gRk9SIGxvb3A6IHdoZW4gc3RlcCBjb25maWcgaGFzIGZvckxvb3BUZXN0RGF0YUlkL2Zvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCwgc3luYyBmb3JtIGFuZCByZWZyZXNoIHNlbGVjdCBjb25maWdzIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRGb3JtKSB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFQcm9maWxlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVEYXRhUHJvZmlsZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdEYXRhUHJvZmlsZXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICAgIC8vIFdoZW4gZGF0YSBwcm9maWxlcyBsb2FkIGluIGVkaXQgbW9kZSwgc3luYyBmb3JtIHZhbHVlIHNvIGRyb3Bkb3duIHNob3dzIHNlbGVjdGVkIChmb3JMb29wVGVzdERhdGFJZCBvciB0ZXN0RGF0YVByb2ZpbGUpXG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5lZGl0Rm9ybSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICAgICAgaWYgKGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCB0aGlzLnRlc3REYXRhUHJvZmlsZSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyduYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIG9wdGlvbnMgbG9hZCwgcG9wdWxhdGUgY29uZGl0aW9uICsgdGVtcGxhdGUgZnJvbSBuYXR1cmFsVGV4dEFjdGlvbklkIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgdGhpcy5lZGl0Rm9ybSAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEZXJpdmUgZm9yT3B0aW9uVHlwZSBmb3IgRk9SIGxvb3AgZnJvbSBjb25maWcgc28gZHJvcGRvd24gc2hvd3MgZXhpc3Rpbmcgc2VsZWN0aW9uICovXG4gIHByaXZhdGUgZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaGFzVGVzdERhdGFJZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkICE9IG51bGw7XG4gICAgaWYgKGhhc1Rlc3REYXRhSWQgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHJldHVybiAndGVzdC1kYXRhJztcbiAgICBjb25zdCBoYXNGaXhlZCA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmZvckxvb3BFbmRJbmRleCAhPSBudWxsXG4gICAgICB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCAhPSBudWxsXG4gICAgICB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleCAhPSBudWxsO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsIHx8IHRoaXMuZW5kU3RlcCAhPSBudWxsIHx8IGhhc0ZpeGVkKSByZXR1cm4gJ2ZpeGVkJztcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBUZXN0IERhdGEgUHJvZmlsZSBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BUZXN0RGF0YUlkIGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbikuIFVzZSBvcHRpb24uaWQgd2hlbiBvcHRpb25zIGxvYWRlZCBzbyB0eXBlIG1hdGNoZXMgc2VsZWN0LiAqL1xuICBwcml2YXRlIGdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZEZyb21Db25maWcgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIC8vIFdoZW4gd2UgaGF2ZSBvcHRpb25zLCByZXNvbHZlIGJ5IGlkIHNvIGZvcm0gdmFsdWUgbWF0Y2hlcyBvcHRpb24uaWQgKHN0cmljdCBlcXVhbGl0eSBpbiBkeW5hbWljLXNlbGVjdClcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8uaWQgPT09IGlkRnJvbUNvbmZpZyB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZEZyb21Db25maWcpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgICByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8ubmFtZSA9PT0gdmFsdWUgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcodmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICB9XG4gICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICByZXR1cm4gKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIExvb3AgRW5kIGRyb3Bkb3duIHZhbHVlOiBwcmVmZXIgZm9yTG9vcEVuZEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2UgZW5kU3RlcCAqL1xuICBwcml2YXRlIGdldExvb3BFbmRGb3JtVmFsdWUoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgcmV0dXJuIHRoaXMuZW5kU3RlcCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIC8vIEZvciB3aGlsZSBsb29wOiBpZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQgYW5kIG9wdGlvbnMgYXJlIGFscmVhZHkgbG9hZGVkLCB1c2UgdGhlbSBmb3IgaW5pdGlhbCBjb25kaXRpb24gKyB0ZW1wbGF0ZVxuICAgIGxldCBjb25kaXRpb25WYWx1ZSA9IHRoaXMuY29uZGl0aW9uID8/ICcnO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICBjb25zdCBwb3B1bGF0ZWQgPSB0aGlzLnBvcHVsYXRlV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb25JZCgpO1xuICAgICAgaWYgKHBvcHVsYXRlZD8uY29uZGl0aW9uICE9IG51bGwpIHtcbiAgICAgICAgY29uZGl0aW9uVmFsdWUgPSBwb3B1bGF0ZWQuY29uZGl0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGb3IgRk9SIGxvb3A6IGluaXRpYWwgZm9ybSB2YWx1ZXMgc28gZHJvcGRvd25zIHNob3cgZXhpc3Rpbmcgc2VsZWN0aW9uIChmb3JPcHRpb25UeXBlLCBmb3JMb29wVGVzdERhdGFJZC90ZXN0RGF0YVByb2ZpbGUsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleClcbiAgICBjb25zdCBmb3JPcHRpb25UeXBlID0gdGhpcy5nZXRGb3JPcHRpb25UeXBlRnJvbUNvbmZpZygpO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKTtcbiAgICBjb25zdCBsb29wU3RhcnRWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKSA6ICh0aGlzLnN0YXJ0U3RlcCA/PyBudWxsKTtcbiAgICBjb25zdCBsb29wRW5kVmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpIDogKHRoaXMuZW5kU3RlcCA/PyBudWxsKTtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmb3JPcHRpb25UeXBlOiBbZm9yT3B0aW9uVHlwZSBhcyBzdHJpbmcgfCBudWxsXSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogW3Rlc3REYXRhUHJvZmlsZVZhbHVlXSxcbiAgICAgIHN0YXJ0U3RlcDogW2xvb3BTdGFydFZhbHVlIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgZW5kU3RlcDogW2xvb3BFbmRWYWx1ZSBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGNvbmRpdGlvbjogW2NvbmRpdGlvblZhbHVlXSxcbiAgICAgIG1heEl0ZXJhdGlvbnM6IFt0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNV0sXG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgY29uZGl0aW9uLCBzZWxlY3RlZFRlbXBsYXRlIGFuZCB0ZW1wbGF0ZSB2YXJpYWJsZXMgZnJvbSBjb25maWcubmF0dXJhbFRleHRBY3Rpb25JZCB3aGVuIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS5cbiAgICogUmV0dXJucyB7IGNvbmRpdGlvbiB9IGlmIGEgbWF0Y2ggd2FzIGZvdW5kIHNvIGJ1aWxkRWRpdEZvcm0gY2FuIHNldCBpbml0aWFsIGZvcm0gdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHBvcHVsYXRlV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb25JZCgpOiB7IGNvbmRpdGlvbjogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKCFjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgfHwgIXRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICk7XG4gICAgaWYgKCFtYXRjaGluZ09wdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICBpZiAoIW5hdHVyYWxUZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb25kaXRpb24gPSBuYXR1cmFsVGV4dDtcbiAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICByZXR1cm4geyBjb25kaXRpb246IG5hdHVyYWxUZXh0IH07XG4gIH1cblxuICAvKiogUmVidWlsZCBjb25kaXRpb24gKyB0ZW1wbGF0ZSBzdGF0ZSB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgbG9hZCBvciBjb25maWcgY2hhbmdlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkuICovXG4gIHByaXZhdGUgcmVidWlsZFdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoIWNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCB8fCAhdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICk7XG4gICAgaWYgKCFtYXRjaGluZ09wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uJyk/LnZhbHVlID8/ICcnO1xuICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICE9PSBuYXR1cmFsVGV4dCkge1xuICAgICAgICB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG5hdHVyYWxUZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uID0gbmF0dXJhbFRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICBpZiAoZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWdzIG9uY2UgKHNhbWUgb3B0aW9uIHNoYXBlIGFzIGRlZmF1bHQgc3RvcmllczogaWQgKyBuYW1lKTsgRk9SIGxvb3AgYWRkcyBzZWxlY3RlZFZhbHVlIGZyb20gc3RlcCAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpLm1hcCgobikgPT4gKHtcbiAgICAgIGlkOiBuLFxuICAgICAgdmFsdWU6IG4sXG4gICAgICBuYW1lOiBTdHJpbmcobiksXG4gICAgICBsYWJlbDogU3RyaW5nKG4pLFxuICAgIH0pKTtcbiAgICB0aGlzLmZvck9wdGlvblR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdmb3JPcHRpb25UeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBpZDogJ3Rlc3QtZGF0YScsIHZhbHVlOiAndGVzdC1kYXRhJywgbmFtZTogJ1Rlc3QgRGF0YSBQcm9maWxlJywgbGFiZWw6ICdUZXN0IERhdGEgUHJvZmlsZScgfSxcbiAgICAgICAgeyBpZDogJ2ZpeGVkJywgdmFsdWU6ICdmaXhlZCcsIG5hbWU6ICdGaXhlZCBjb3VudCcsIGxhYmVsOiAnRml4ZWQgY291bnQnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKSA6IG51bGw7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKSA6IG51bGw7XG4gICAgdGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdzdGFydFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIFN0YXJ0JyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdlbmRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBFbmQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgICAgLi4uKGVuZFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogZW5kVmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgY29uZGl0aW9uIHNlbGVjdCBjb25maWcgd2l0aCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvcHRpb25zIChsZWdhY3kgbWF0LXNlbGVjdCkgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogV2hpbGUgbG9vcDogb25seSBzaG93IG9wdGlvbnMgd2l0aCBzdGVwQWN0aW9uVHlwZSA9PT0gXCJXSElMRV9MT09QXCIgKi9cbiAgcHJpdmF0ZSB1cGRhdGVXaGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uLnN0ZXBBY3Rpb25UeXBlID09PSAnV0hJTEVfTE9PUCc7XG4gICAgfSk7XG4gICAgdGhpcy53aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlcmVkT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSB3aGlsZSBjb25kaXRpb24gYXV0b2NvbXBsZXRlIChXSElMRV9MT09QIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9ubHkpICovXG4gIGdldCB3aGlsZUNvbmRpdGlvbkF1dG9jb21wbGV0ZU9wdGlvbnMoKTogKENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSlbXSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMud2hpbGVDb25kaXRpb25TZWxlY3RDb25maWc/Lm9wdGlvbnMgPz8gW107XG4gICAgcmV0dXJuIG9wdHMubWFwKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSBvcHRpb24ubmF0dXJhbFRleHQgPz8gb3B0aW9uLm5hbWUgPz8gb3B0aW9uLnZhbHVlID8/IFN0cmluZyhvcHRpb24uaWQgPz8gJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG5hdHVyYWxUZXh0LFxuICAgICAgICBsYWJlbDogbmF0dXJhbFRleHQsXG4gICAgICAgIHRlbXBsYXRlOiBvcHRpb24udGVtcGxhdGUgfHwgb3B0aW9uLFxuICAgICAgfSBhcyBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH07XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbmRpdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLnRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgfHwgZGVmYXVsdFZhbHVlID09PSAnMSc7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdmFyaWFibGUubmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBzZWxlY3RlZFZhbHVlIChmb3JMb29wVGVzdERhdGFJZCkuIEVuc3VyZSBzZWxlY3RlZCBpZCBpcyBpbiBvcHRpb25zIHNvIG1hdC1zZWxlY3QgY2FuIGRpc3BsYXkgaXQuICovXG4gIHByaXZhdGUgdXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZm9yTG9vcFRlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogdW5kZWZpbmVkO1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcmVzZWxlY3RlZCBpZCBidXQgaXQncyBub3QgaW4gdGhlIGN1cnJlbnQgb3B0aW9ucyBsaXN0IChlLmcuIG9wdGlvbnMgbm90IGxvYWRlZCB5ZXQpLCBhZGQgYSBwbGFjZWhvbGRlciBvcHRpb24gc28gdGhlIGRyb3Bkb3duIGNhbiBzaG93IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgaWRTdHIgPSBTdHJpbmcoZm9yTG9vcFRlc3REYXRhSWQpO1xuICAgICAgY29uc3QgYWxyZWFkeUluTGlzdCA9IG9wdGlvbnMuc29tZSgobzogU2VsZWN0T3B0aW9uKSA9PiBTdHJpbmcoby5pZCA/PyBvLnZhbHVlKSA9PT0gaWRTdHIpO1xuICAgICAgaWYgKCFhbHJlYWR5SW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgfHwgJ1NlbGVjdGVkIHByb2ZpbGUnO1xuICAgICAgICBvcHRpb25zID0gW3sgaWQ6IGZvckxvb3BUZXN0RGF0YUlkLCB2YWx1ZTogZm9yTG9vcFRlc3REYXRhSWQsIG5hbWU6IGRpc3BsYXlOYW1lLCBsYWJlbDogZGlzcGxheU5hbWUgfSwgLi4ub3B0aW9uc107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnVGVzdGRhdGFwcm9maWxlJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBpbml0aWFsRmV0Y2hPbk9wZW46IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIC4uLihzZWxlY3RlZFZhbCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGVkVmFsICE9PSAnJyAmJiB7IHNlbGVjdGVkVmFsdWU6IHNlbGVjdGVkVmFsIH0pLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnkgfHwgJycpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBMb29wIFN0YXJ0IC8gTG9vcCBFbmQgc2VsZWN0IGNvbmZpZ3Mgd2l0aCBzZWxlY3RlZFZhbHVlIChmb3JMb29wU3RhcnRJbmRleCwgZm9yTG9vcEVuZEluZGV4KSBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZCAqL1xuICBwcml2YXRlIHVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgY29uc3Qgc3RlcE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5nZXRMb29wU3RlcE9wdGlvbnMoKS5tYXAoKG4pID0+ICh7XG4gICAgICBpZDogbixcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgbmFtZTogU3RyaW5nKG4pLFxuICAgICAgbGFiZWw6IFN0cmluZyhuKSxcbiAgICB9KSk7XG4gICAgdGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgICAuLi4oc3RhcnRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IHN0YXJ0VmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihlbmRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IGVuZFZhbCB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBhbGwgRk9SIGxvb3Agc2VsZWN0IGNvbmZpZ3MgKHRlc3REYXRhUHJvZmlsZSwgc3RhcnRTdGVwLCBlbmRTdGVwKSB3aXRoIHNlbGVjdGVkVmFsdWUgZnJvbSBzdGVwIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkICovXG4gIHByaXZhdGUgdXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICAvKiogQ29udmVydCBEYXRhUHJvZmlsZU9wdGlvbltdIHRvIFNlbGVjdE9wdGlvbltdICovXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRGF0YSBsZW5ndGggKE4pIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGU7IDAgaWYgbm9uZSBzZWxlY3RlZCBvciBub3QgZm91bmQuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gMDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICBjb25zdCBsZW4gPSAobWF0Y2guZGF0YSAmJiBBcnJheS5pc0FycmF5KG1hdGNoLmRhdGEpID8gbWF0Y2guZGF0YS5sZW5ndGggOiAwKSB8fCAobWF0Y2guZGF0YUxlbmd0aCA/PyAwKTtcbiAgICByZXR1cm4gdHlwZW9mIGxlbiA9PT0gJ251bWJlcicgPyBsZW4gOiAwO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQvRW5kIG9wdGlvbnM6IDEgdG8gTiBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGUncyBkYXRhIGFycmF5IGxlbmd0aDsgZmFsbHMgYmFjayB0byAxLi4xMCBpZiBubyBwcm9maWxlLiAqL1xuICBnZXRMb29wU3RlcE9wdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBjb25zdCBtYXggPSBOID4gMCA/IE4gOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkRFRkFVTFRfTE9PUF9PUFRJT05TX01BWDtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb246IHVwZGF0ZSBkaXNwbGF5LCBjbGFtcCBzdGFydC9lbmQgdG8gbmV3IHByb2ZpbGUgcmFuZ2UsIHJlZnJlc2ggc3RhcnQvZW5kIGRyb3Bkb3ducy4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBpZiAoTiA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIGNvbnN0IG1heFZhbCA9IG9wdGlvbnMubGVuZ3RoID4gMCA/IG9wdGlvbnNbb3B0aW9ucy5sZW5ndGggLSAxXSA6IDE7XG4gICAgbGV0IHN0YXJ0VmFsID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdzdGFydFN0ZXAnKT8udmFsdWUgPz8gdGhpcy5zdGFydFN0ZXA7XG4gICAgbGV0IGVuZFZhbCA9IHRoaXMuZWRpdEZvcm0/LmdldCgnZW5kU3RlcCcpPy52YWx1ZSA/PyB0aGlzLmVuZFN0ZXA7XG4gICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgJiYgc3RhcnRWYWwgPiBtYXhWYWwpIHN0YXJ0VmFsID0gbWF4VmFsO1xuICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgPiBtYXhWYWwpIGVuZFZhbCA9IG1heFZhbDtcbiAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgIT0gbnVsbCAmJiBzdGFydFZhbCA+IGVuZFZhbCkgZW5kVmFsID0gc3RhcnRWYWw7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsKSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk/LnNldFZhbHVlKHN0YXJ0VmFsKTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gZW5kVmFsID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRFbmRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdFTkQgRk9SJyA6ICdFTkQgV0hJTEUnO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBzdGFydCBpbmRleDogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gc3RlcCAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIHN0YXJ0U3RlcCwgZWxzZSBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBwcml2YXRlIGdldERpc3BsYXlTdGFydEluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwICE9IG51bGwpIHJldHVybiB0aGlzLnN0YXJ0U3RlcDtcbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IGVuZCBpbmRleDogcHJlZmVyIGZvckxvb3BFbmRJbmRleCBmcm9tIHN0ZXAgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBlbmRTdGVwLCBlbHNlIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheUVuZEluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgaWYgKHRoaXMuZW5kU3RlcCAhPSBudWxsKSByZXR1cm4gdGhpcy5lbmRTdGVwO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGxhc3Q/LnN0ZXBOdW1iZXIgYXMgbnVtYmVyIHwgdW5kZWZpbmVkID8/IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBwcm9maWxlIG5hbWU6IG1hcCBmb3JMb29wVGVzdERhdGFJZCB0byBwcm9maWxlIG5hbWUgZnJvbSBkYXRhUHJvZmlsZU9wdGlvbnMsIGVsc2UgdXNlIHRlc3REYXRhUHJvZmlsZSAqL1xuICBwcml2YXRlIGdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGlkID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAoaWQgIT0gbnVsbCAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG8gPT4gby5pZCA9PT0gaWQgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoaWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2gubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2VsZWN0ZWQgZGF0YSBwcm9maWxlIChieSBmb3JMb29wVGVzdERhdGFJZCBvciBmb3JtIHZhbHVlKSwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZERhdGFQcm9maWxlKCk6IERhdGFQcm9maWxlT3B0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZUlkID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAocHJvZmlsZUlkID09IG51bGwgfHwgIXRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgIChvOiBEYXRhUHJvZmlsZU9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKSB8fCBvLmlkID09PSBwcm9maWxlSWRcbiAgICApO1xuICAgIHJldHVybiBtYXRjaCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEdldCBkaXNwbGF5IG5hbWUgZm9yIGEgMS1iYXNlZCByb3cgaW5kZXggZnJvbSB0aGUgc2VsZWN0ZWQgcHJvZmlsZSdzIGRhdGEgYXJyYXkgKGRhdGFbaW5kZXgtMV0ubmFtZSkuIFJldHVybnMgbnVsbCBpZiBubyBuYW1lLiAqL1xuICBwcml2YXRlIGdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChvbmVCYXNlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwcm9maWxlID0gdGhpcy5nZXRTZWxlY3RlZERhdGFQcm9maWxlKCk7XG4gICAgaWYgKCFwcm9maWxlPy5kYXRhIHx8ICFBcnJheS5pc0FycmF5KHByb2ZpbGUuZGF0YSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkeCA9IG9uZUJhc2VkSW5kZXggLSAxO1xuICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBwcm9maWxlLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByb3cgPSBwcm9maWxlLmRhdGFbaWR4XTtcbiAgICByZXR1cm4gcm93ICYmIChyb3cubmFtZSAhPSBudWxsID8gU3RyaW5nKHJvdy5uYW1lKSA6IG51bGwpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2V0IChzbyB3ZSBjYW4gc2hvdy9oaWRlIHRoZSBjaGlwKSAqL1xuICBoYXNUZXN0RGF0YVByb2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgc3RhcnQgdmFsdWUgaXMgZXhwbGljaXRseSBzZXQgKGNvbmZpZyBvciBzdGFydFN0ZXAgaW5wdXQpLCBub3QgaW5mZXJyZWQgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgaGFzU3RhcnRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGVuZCB2YWx1ZSBpcyBleHBsaWNpdGx5IHNldCAoY29uZmlnIG9yIGVuZFN0ZXAgaW5wdXQpLCBub3QgaW5mZXJyZWQgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgaGFzRW5kVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmVuZFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RlcHNTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAgc3RlcHMnO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKSA/PyAxO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0RGlzcGxheUVuZEluZGV4KCkgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICByZXR1cm4gYFN0ZXBzICR7c3RhcnR9LSR7ZW5kfSAoJHtjb3VudH0gc3RlcCR7Y291bnQgIT09IDEgPyAncycgOiAnJ30pYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChlbmQpO1xuICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBgRW5kOiAke25hbWV9YCA6IGBFbmQ6ICR7ZW5kfWA7XG4gIH1cblxuICBnZXRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgaWYgKG5hbWUpIHJldHVybiBgVGVzdCBEYXRhIHByb2ZpbGU6ICR7bmFtZX1gO1xuICAgIHJldHVybiAnVGVzdCBEYXRhIHByb2ZpbGUnO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiB8fCAnZWxlbWVudCBcIi5ub3RpZmljYXRpb24tYmFkZ2VcIiBleGlzdHMnO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGZyb20gZW1wdHktc3RhdGUgcGx1cyBvbmx5OyBzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuIChwYXJlbnRJZCA9IGxvb3Agc3RlcCBpZCwgcG9zaXRpb24gPSBwYXJlbnQgKyAxKS4gKi9cbiAgb25BZGRTdGVwRW1wdHkoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoeyBsb29wU3RlcENvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAocGF5bG9hZE9ySW5kZXg6IGFueSwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZHggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBwYXlsb2FkT3JJbmRleDtcbiAgICBjb25zdCBwYXlsb2FkID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHBheWxvYWRPckluZGV4IDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KGlkeCk7XG4gICAgaWYgKHBheWxvYWQ/LnN0ZXApIHRoaXMuZGVsZXRlLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBlZGl0IGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gb3BlbiBlZGl0IG1vZGFsIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZEVkaXQoZXZlbnQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LnN0ZXAgIT0gbnVsbCkgdGhpcy5lZGl0LmVtaXQoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGR1cGxpY2F0ZSBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIGR1cGxpY2F0ZSAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWREdXBsaWNhdGUoZXZlbnQ6IGFueSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgoZXZlbnQgJiYgZXZlbnQuc3RlcCAhPSBudWxsKSA/IGV2ZW50IDogeyBzdGVwIH0gYXMgYW55KTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJywgXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoYnJhbmNoSW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShicmFuY2hJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICAvKiogU3luYyBGT1IgbG9vcCBlZGl0IGZvcm0gc28gZHJvcGRvd25zIHNob3cgZXhpc3RpbmcgY29uZmlnIChmb3JPcHRpb25UeXBlLCBmb3JMb29wVGVzdERhdGFJZC90ZXN0RGF0YVByb2ZpbGUsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCkgKi9cbiAgcHJpdmF0ZSBzeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICBjb25zdCB0ZXN0RGF0YVZhbCA9IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmb3JPcHRpb25UeXBlOiB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCkgPz8gbnVsbCxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFWYWwsXG4gICAgICBzdGFydFN0ZXA6IHN0YXJ0VmFsLFxuICAgICAgZW5kU3RlcDogZW5kVmFsLFxuICAgIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgc2V0IGVhY2ggY29udHJvbCBzbyBtYXQtc2VsZWN0IHBpY2tzIHVwIHRoZSB2YWx1ZSAocGF0Y2hWYWx1ZSBjYW4gYmUgaWdub3JlZCBieSBjaGlsZCBpbiBzb21lIHRpbWluZyBjYXNlcylcbiAgICBjb25zdCB0ZXN0RGF0YUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgY29uc3Qgc3RhcnRDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXJ0U3RlcCcpO1xuICAgIGNvbnN0IGVuZEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5kU3RlcCcpO1xuICAgIGlmICh0ZXN0RGF0YUN0cmwgJiYgdGVzdERhdGFWYWwgIT09IHVuZGVmaW5lZCAmJiB0ZXN0RGF0YVZhbCAhPT0gJycpIHRlc3REYXRhQ3RybC5zZXRWYWx1ZSh0ZXN0RGF0YVZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGlmIChzdGFydEN0cmwgJiYgc3RhcnRWYWwgIT0gbnVsbCkgc3RhcnRDdHJsLnNldFZhbHVlKHN0YXJ0VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKGVuZEN0cmwgJiYgZW5kVmFsICE9IG51bGwpIGVuZEN0cmwuc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0ge1xuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgc2VsZWN0ZWRUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPyBbLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc10gOiBbXSxcbiAgICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA/IHsgLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0udmFsdWUgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIEZPUiBsb29wOiByZWZyZXNoIHNlbGVjdCBjb25maWdzIChzbyBUZXN0IERhdGEgUHJvZmlsZSBvcHRpb25zIGluY2x1ZGUgc2VsZWN0ZWQgaWQgaWYgbmVlZGVkKSB0aGVuIHN5bmMgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgdGhpcy51cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyxcbiAgICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsLFxuICAgICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAgPz8gbnVsbCxcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1LFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFdoaWxlIGxvb3A6IHJlc3RvcmUgc2VsZWN0ZWQgdGVtcGxhdGUgYW5kIHRlbXBsYXRlIHZhcmlhYmxlcyBmcm9tIGNvbmZpZyB3aGVuIG9wZW5pbmcgZWRpdFxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmICh0aGlzLmNvbmRpdGlvbiB8fCAodGhpcy5jb25maWcgYXMgYW55KS50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpKSB7XG4gICAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhEYXRhLmNvbmRpdGlvbiB8fCAnJztcbiAgICAgIGlmIChjb25kaXRpb25TdHIgJiYgKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgKG9wdDogYW55KSA9PiAob3B0Lm5hdHVyYWxUZXh0IHx8IG9wdC5uYW1lIHx8IG9wdC52YWx1ZSkgPT09IGNvbmRpdGlvblN0clxuICAgICAgICApO1xuICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lZGl0LmVtaXQoKTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdi50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2LnN0YXJ0U3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gdi5lbmRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHYuY29uZGl0aW9uID8/ICcnO1xuICAgIGNvbnN0IG1heFZhbCA9IHYubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0eXBlb2YgbWF4VmFsID09PSAnbnVtYmVyJyA/IG1heFZhbCA6IChtYXhWYWwgIT0gbnVsbCAmJiBtYXhWYWwgIT09ICcnID8gTnVtYmVyKG1heFZhbCkgOiB1bmRlZmluZWQpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSBvcHRpb24gdG8gZ2V0IGJvdGggSUQgYW5kIG5hbWVcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgXG4gICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbHVlICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBmb3JtIHZhbHVlIG1pZ2h0IGJlIElEIChudW1iZXIpIG9yIG5hbWUgKHN0cmluZylcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgb3B0aW9uLm5hbWUgPT09IHRlc3REYXRhUHJvZmlsZVZhbHVlIHx8IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcodGVzdERhdGFQcm9maWxlVmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IHNlbGVjdGVkUHJvZmlsZS5pZDtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlTmFtZSA9IHNlbGVjdGVkUHJvZmlsZS5uYW1lO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZU5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgdmFsdWUgYXMtaXMgKG1pZ2h0IGJlIElEIG9yIG5hbWUpXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFdoaWxlIGxvb3A6IGJ1aWxkIHRlbXBsYXRlVmFyaWFibGVzRGF0YSBhbmQgbmF0dXJhbFRleHRBY3Rpb25JZCBmcm9tIHNlbGVjdGVkIHRlbXBsYXRlIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKVxuICAgIGxldCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueTtcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/Lmxlbmd0aCkge1xuICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhID0ge307XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlPy5pZCAhPSBudWxsKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzIChpbmNsdWRlIHRlc3REYXRhUHJvZmlsZUlkLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEsIG5hdHVyYWxUZXh0QWN0aW9uSWQgZm9yIHdoaWxlOyBmb3JMb29wVGVzdERhdGFJZCwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4IGZvciBmb3IpXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZzogTG9vcFN0ZXBDb25maWcgJiB7IHRlc3REYXRhUHJvZmlsZUlkPzogc3RyaW5nIHwgbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXIgfSA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZUlkOiB0ZXN0RGF0YVByb2ZpbGVJZCwgLy8gQWRkIElEIGZvciBBUEkgY2FsbFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge30pLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBuYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgeyBuYXR1cmFsVGV4dEFjdGlvbklkIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiYgeyBmb3JMb29wVGVzdERhdGFJZDogTnVtYmVyKHRlc3REYXRhUHJvZmlsZUlkKSB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLnN0YXJ0U3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcFN0YXJ0SW5kZXg6IHRoaXMuc3RhcnRTdGVwIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZW5kU3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcEVuZEluZGV4OiB0aGlzLmVuZFN0ZXAgfSksXG4gICAgfTtcbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodGhpcy50ZXN0RGF0YVByb2ZpbGUpO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodGhpcy5zdGFydFN0ZXAgPz8gMSk7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodGhpcy5lbmRTdGVwID8/IDEpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29uZGl0aW9uKTtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnXG4gICAgY29uc29sZS5sb2coJ0xvb3Atc3RlcDogRW1pdHRpbmcgc3RlcFVwZGF0ZSBldmVudCcsIHVwZGF0ZWRDb25maWcpO1xuICAgIHRoaXMuc3RlcFVwZGF0ZS5lbWl0KHVwZGF0ZWRDb25maWcpO1xuICAgIFxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZXN0RGF0YVByb2ZpbGU7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5zdGFydFN0ZXA7XG4gICAgdGhpcy5lbmRTdGVwID0gdGhpcy5lZGl0U25hcHNob3QuZW5kU3RlcDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbjtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmVkaXRTbmFwc2hvdC5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuZWRpdFNuYXBzaG90LnNlbGVjdGVkVGVtcGxhdGU7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuZWRpdFNuYXBzaG90LnRlbXBsYXRlVmFyaWFibGVzIHx8IFtdO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ251bWJlcicgPyB0aGlzLnN0ZXBOdW1iZXIgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSA6IDApO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCh7IHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IGlzTmFOKGluZGV4KSA/IDAgOiBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QIERldGFpbHMnIDogJ1dISUxFIExPT1AgRGV0YWlscyc7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxvb3Atc3RlcC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9zZWxlY3QgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgb3Igc3RhcnQgZHJhZyAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCwgc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGUgJiYgdGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiB0ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+e3sgdmFyaWFibGUubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICd0eXBlJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2Nyb2xsVG8nICYmICF2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgJyArIHZhcmlhYmxlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiXG4gICAgICAgICAgICBmaWxsPVwiIzNGNDNFRVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDwhLS0gQ2FuY2VsIC8gQXBwbHkgLS0+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIEhlYWRlciAobm9ybWFsIHZpZXcgd2hlbiBub3QgZWRpdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCJcbiAgICBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UpIC0tPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgQ29udHJvbHMgKG9ubHkgc2hvdyBUZXN0IERhdGEgcHJvZmlsZSAvIFN0YXJ0IC8gRW5kIHdoZW4gdmFsdWVzIGFyZSBzZXQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcicgJiYgKGhhc1Rlc3REYXRhUHJvZmlsZSgpIHx8IGhhc1N0YXJ0VmFsdWUoKSB8fCBoYXNFbmRWYWx1ZSgpKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTJcIj5cbiAgICAgIDwhLS0gVGVzdCBEYXRhIFByb2ZpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cImhhc1Rlc3REYXRhUHJvZmlsZSgpXCIgdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwidGVzdERhdGFQcm9maWxlXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwidGVzdERhdGFQcm9maWxlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFN0YXJ0IEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNTdGFydFZhbHVlKClcIiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJzdGFydFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJzdGFydFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0U3RhcnRTdGVwTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gRW5kIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNFbmRWYWx1ZSgpXCIgdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwiZW5kU3RlcFwiIFtjbGFzcy5jcWEtdGV4dC1wcmltYXJ5XT1cImVuZFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0RW5kU3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTkwMCBjcWEtdGV4dC1zbVwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1tbC1hdXRvXCI+XG4gICAgICA8IS0tIFN0ZXBzIFN1bW1hcnkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgZ2V0U3RlcHNTdW1tYXJ5KCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICAgIDxhICpuZ0lmPVwiY29uZmlnLmRlc2NyaXB0aW9uICYmIGNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgIT09ICcnXCIgI3ZpZXdEZXRhaWxzVHJpZ2dlciBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbm8tdW5kZXJsaW5lIGNxYS1tbC1hdXRvXCI+VmlldyBEZXRhaWxzPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuXG4gICAgICA8IS0tIENyZWF0ZWQgRGF0ZSAoZnJvbSBBUEkpIC0gYmVmb3JlIGFjdGlvbiBpY29ucywgZm9ybWF0OiAyNSBGZWIgMjAyNiAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLmNyZWF0ZWREYXRlXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBjb25maWcuY3JlYXRlZERhdGUgfCBkYXRlOidkIE1NTSB5eXl5JyB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPCEtLSBBY3Rpb24gSWNvbnM6IEVkaXQsIExpbmssIER1cGxpY2F0ZSwgRGVsZXRlIChzaG93IG9uIGhvdmVyOyBoaWRkZW4gd2hlbiBpbnNpZGUgc3RlcC1ncm91cCkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMS42NjYgNC42NjY2M0g1LjgzMjY4QzUuMTg4MzUgNC42NjY2MyA0LjY2NjAyIDUuMTg4OTYgNC42NjYwMiA1LjgzMzI5VjExLjY2NjZDNC42NjYwMiAxMi4zMTEgNS4xODgzNSAxMi44MzMzIDUuODMyNjggMTIuODMzM0gxMS42NjZDMTIuMzEwMyAxMi44MzMzIDEyLjgzMjcgMTIuMzExIDEyLjgzMjcgMTEuNjY2NlY1LjgzMzI5QzEyLjgzMjcgNS4xODg5NiAxMi4zMTAzIDQuNjY2NjMgMTEuNjY2IDQuNjY2NjNaXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTIuMzMyNjggOS4zMzMyOUMxLjY5MTAyIDkuMzMzMjkgMS4xNjYwMiA4LjgwODI5IDEuMTY2MDIgOC4xNjY2M1YyLjMzMzI5QzEuMTY2MDIgMS42OTE2MyAxLjY5MTAyIDEuMTY2NjMgMi4zMzI2OCAxLjE2NjYzSDguMTY2MDJDOC44MDc2OCAxLjE2NjYzIDkuMzMyNjggMS42OTE2MyA5LjMzMjY4IDIuMzMzMjlcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5BYm92ZV09XCJhZGRTdGVwQmV0d2VlbkFib3ZlXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFbXB0eSBsb29wOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibmVzdGVkU3RlcHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEVtcHR5KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiQWRkIHN0ZXBcIlxuICAgICAgICBjbGFzcz1cImxvb3Atc3RlcC1lbXB0eS1hZGRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOC41VjE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRU5EIE1hcmtlciAtLT5cbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiJ2NxYS1wbC00IGNxYS1weS0xIGNxYS1iZy1bI0RCRUFGRTgwXSBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0nXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICB7eyBnZXRFbmRMYWJlbCgpIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
1110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sc0JBQXNCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0I5QixDQUFDO0FBVUYsTUFBTSxPQUFPLHlCQUF5QjtJQThHcEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0d2QixhQUFRLEdBQW9CLEtBQUssQ0FBQztRQU9sQyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0ZBQWdGO1FBQ3ZFLHVCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDdEQs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dGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBleHBhbmRlZCBhbmQgbm8gc3RlcHMgKi9cbiAgLmxvb3Atc3RlcC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxuICAubG9vcC1zdGVwLXJvdzpob3ZlciAubG9vcC1zdGVwLWVtcHR5IHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICMzRjQzRUU7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWxvb3Atc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1xuICAgIFNURVBfUk9XX0FDVElPTlNfU1RZTEVTLFxuICAgIExPT1BfU1RFUF9FTVBUWV9TVFlMRVMsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogRnVuY3Rpb24gdG8gcHJvY2VzcyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgQElucHV0KCkgc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogYW55KSA9PiBhbnlbXSA9ICgpID0+IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIHRlc3REYXRhUHJvZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3RhcnRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlbmRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG1heEl0ZXJhdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIG5lc3RlZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIC8qKiBFbWl0cyB2b2lkIHdoZW4gYWRkIGlzIGZyb20gbmVzdGVkIGNvbnRlbnQ7IGVtaXRzIHsgbG9vcFN0ZXBDb25maWcgfSB3aGVuIGVtcHR5LXN0YXRlIGFkZCBpcyBjbGlja2VkIChzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuKS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQgfCB7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZHVwbGljYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFeHBvc2UgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgdGVtcGxhdGUgKEFuZ3VsYXIgdGVtcGxhdGVzIGRvbid0IGhhdmUgU3RyaW5nL051bWJlcikgKi9cbiAgcmVhZG9ubHkgc3RyaW5nRm4gPSBTdHJpbmc7XG4gIHJlYWRvbmx5IG51bWJlckZuID0gTnVtYmVyO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhlYWRlciBzaG93cyBpbmxpbmUgZWRpdCBmb3JtIChkcm9wZG93bnMsIGlucHV0cywgQ2FuY2VsL0FwcGx5KSAqL1xuICBpc0VkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogRm9ybSBmb3IgZWRpdCBtb2RlOyBib3VuZCB0byBjcWEtZHluYW1pYy1zZWxlY3QgKHNhbWUgcGF0dGVybiBhcyBkZWZhdWx0IHN0b3JpZXMpICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzIHRvIGF2b2lkIGNoYW5nZS1kZXRlY3Rpb24gbG9vcHMpICovXG4gIGZvck9wdGlvblR5cGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgc3RhcnRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBlbmRTdGVwU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBjb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIC8qKiBXaGlsZSBsb29wOiBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBvcHRpb25zIChXSElMRV9DT05ESVRJT04gb25seSkgKi9cbiAgd2hpbGVDb25kaXRpb25TZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIFNlbGVjdGVkIHRlbXBsYXRlIGZvciB3aGlsZSBjb25kaXRpb24gKHNhbWUgcGF0dGVybiBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55ID0gbnVsbDtcbiAgLyoqIFRlbXBsYXRlIHZhcmlhYmxlcyBmb3Igd2hpbGUgY29uZGl0aW9uICovXG4gIHRlbXBsYXRlVmFyaWFibGVzOiBhbnlbXSA9IFtdO1xuICAvKiogRm9ybSBncm91cCBmb3IgdGVtcGxhdGUgdmFyaWFibGVzICovXG4gIHRlbXBsYXRlVmFyaWFibGVzRm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogRGVmYXVsdCBtYXggZm9yIExvb3AgU3RhcnQgLyBFbmQgd2hlbiBubyBwcm9maWxlIHNlbGVjdGVkIChvcHRpb25zIDEuLjEwKSAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPT1BfT1BUSU9OU19NQVggPSAxMDtcblxuICBAVmlld0NoaWxkKCd2aWV3RGV0YWlsc1RyaWdnZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgdmlld0RldGFpbHNUcmlnZ2VyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgdmFsdWVzIHdoaWxlIGVkaXRpbmcgKGZvciBDYW5jZWwgcmV2ZXJ0KSAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDoge1xuICAgIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgICBzdGFydFN0ZXA/OiBudW1iZXI7XG4gICAgZW5kU3RlcD86IG51bWJlcjtcbiAgICBjb25kaXRpb24/OiBzdHJpbmc7XG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgICBzZWxlY3RlZFRlbXBsYXRlPzogYW55O1xuICAgIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gICAgY29uZGl0aW9uVGVtcGxhdGVGb3JtVmFsdWU/OiBhbnk7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5pZCA9IHRoaXMuY29uZmlnLmlkO1xuICAgICAgdGhpcy5sb29wVHlwZSA9IHRoaXMuY29uZmlnLmxvb3BUeXBlO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5jb25maWcuc3RlcE51bWJlcjtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5jb25maWcuY29uZGl0aW9uO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdGhpcy5jb25maWcubWF4SXRlcmF0aW9ucztcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGhpcy5jb25maWcudGVzdERhdGFQcm9maWxlO1xuICAgICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmNvbmZpZy5zdGFydFN0ZXA7XG4gICAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmNvbmZpZy5lbmRTdGVwO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuY29uZmlnLmV4cGFuZGVkICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5leHBhbmRlZCA6IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRFZGl0Rm9ybSgpO1xuICAgIHRoaXMuYnVpbGRTZWxlY3RDb25maWdzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gKHRoaXMuY29uZmlnIGFzIGFueSkuc2VsZWN0ZWQgfHwgZmFsc2U7XG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgICB0aGlzLnJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgICAgLy8gRk9SIGxvb3A6IHdoZW4gc3RlcCBjb25maWcgaGFzIGZvckxvb3BUZXN0RGF0YUlkL2Zvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCwgc3luYyBmb3JtIGFuZCByZWZyZXNoIHNlbGVjdCBjb25maWdzIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkXG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRGb3JtKSB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFQcm9maWxlT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVEYXRhUHJvZmlsZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdEYXRhUHJvZmlsZXMnXSkge1xuICAgICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICAgIC8vIFdoZW4gZGF0YSBwcm9maWxlcyBsb2FkIGluIGVkaXQgbW9kZSwgc3luYyBmb3JtIHZhbHVlIHNvIGRyb3Bkb3duIHNob3dzIHNlbGVjdGVkIChmb3JMb29wVGVzdERhdGFJZCBvciB0ZXN0RGF0YVByb2ZpbGUpXG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5lZGl0Rm9ybSAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICAgICAgaWYgKGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCB0aGlzLnRlc3REYXRhUHJvZmlsZSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyduYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIG9wdGlvbnMgbG9hZCwgcG9wdWxhdGUgY29uZGl0aW9uICsgdGVtcGxhdGUgZnJvbSBuYXR1cmFsVGV4dEFjdGlvbklkIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgdGhpcy5lZGl0Rm9ybSAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEZXJpdmUgZm9yT3B0aW9uVHlwZSBmb3IgRk9SIGxvb3AgZnJvbSBjb25maWcgc28gZHJvcGRvd24gc2hvd3MgZXhpc3Rpbmcgc2VsZWN0aW9uICovXG4gIHByaXZhdGUgZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaGFzVGVzdERhdGFJZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkICE9IG51bGw7XG4gICAgaWYgKGhhc1Rlc3REYXRhSWQgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHJldHVybiAndGVzdC1kYXRhJztcbiAgICBjb25zdCBoYXNGaXhlZCA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmZvckxvb3BFbmRJbmRleCAhPSBudWxsXG4gICAgICB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCAhPSBudWxsXG4gICAgICB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleCAhPSBudWxsO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsIHx8IHRoaXMuZW5kU3RlcCAhPSBudWxsIHx8IGhhc0ZpeGVkKSByZXR1cm4gJ2ZpeGVkJztcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBUZXN0IERhdGEgUHJvZmlsZSBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BUZXN0RGF0YUlkIGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbikuIFVzZSBvcHRpb24uaWQgd2hlbiBvcHRpb25zIGxvYWRlZCBzbyB0eXBlIG1hdGNoZXMgc2VsZWN0LiAqL1xuICBwcml2YXRlIGdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZEZyb21Db25maWcgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIC8vIFdoZW4gd2UgaGF2ZSBvcHRpb25zLCByZXNvbHZlIGJ5IGlkIHNvIGZvcm0gdmFsdWUgbWF0Y2hlcyBvcHRpb24uaWQgKHN0cmljdCBlcXVhbGl0eSBpbiBkeW5hbWljLXNlbGVjdClcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8uaWQgPT09IGlkRnJvbUNvbmZpZyB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyhpZEZyb21Db25maWcpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgICByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+IG8ubmFtZSA9PT0gdmFsdWUgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcodmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLmlkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICB9XG4gICAgaWYgKGlkRnJvbUNvbmZpZyAhPSBudWxsKSByZXR1cm4gaWRGcm9tQ29uZmlnIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICByZXR1cm4gKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2Ugc3RhcnRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIExvb3AgRW5kIGRyb3Bkb3duIHZhbHVlOiBwcmVmZXIgZm9yTG9vcEVuZEluZGV4IGZyb20gY29uZmlnIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2UgZW5kU3RlcCAqL1xuICBwcml2YXRlIGdldExvb3BFbmRGb3JtVmFsdWUoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgcmV0dXJuIHRoaXMuZW5kU3RlcCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXRGb3JtKCk6IHZvaWQge1xuICAgIC8vIEZvciB3aGlsZSBsb29wOiBpZiBjb25maWcgaGFzIG5hdHVyYWxUZXh0QWN0aW9uSWQgYW5kIG9wdGlvbnMgYXJlIGFscmVhZHkgbG9hZGVkLCB1c2UgdGhlbSBmb3IgaW5pdGlhbCBjb25kaXRpb24gKyB0ZW1wbGF0ZVxuICAgIGxldCBjb25kaXRpb25WYWx1ZSA9IHRoaXMuY29uZGl0aW9uID8/ICcnO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICBjb25zdCBwb3B1bGF0ZWQgPSB0aGlzLnBvcHVsYXRlV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb25JZCgpO1xuICAgICAgaWYgKHBvcHVsYXRlZD8uY29uZGl0aW9uICE9IG51bGwpIHtcbiAgICAgICAgY29uZGl0aW9uVmFsdWUgPSBwb3B1bGF0ZWQuY29uZGl0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGb3IgRk9SIGxvb3A6IGluaXRpYWwgZm9ybSB2YWx1ZXMgc28gZHJvcGRvd25zIHNob3cgZXhpc3Rpbmcgc2VsZWN0aW9uIChmb3JPcHRpb25UeXBlLCBmb3JMb29wVGVzdERhdGFJZC90ZXN0RGF0YVByb2ZpbGUsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleClcbiAgICBjb25zdCBmb3JPcHRpb25UeXBlID0gdGhpcy5nZXRGb3JPcHRpb25UeXBlRnJvbUNvbmZpZygpO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogKHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnKTtcbiAgICBjb25zdCBsb29wU3RhcnRWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKSA6ICh0aGlzLnN0YXJ0U3RlcCA/PyBudWxsKTtcbiAgICBjb25zdCBsb29wRW5kVmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpIDogKHRoaXMuZW5kU3RlcCA/PyBudWxsKTtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmb3JPcHRpb25UeXBlOiBbZm9yT3B0aW9uVHlwZSBhcyBzdHJpbmcgfCBudWxsXSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogW3Rlc3REYXRhUHJvZmlsZVZhbHVlXSxcbiAgICAgIHN0YXJ0U3RlcDogW2xvb3BTdGFydFZhbHVlIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgZW5kU3RlcDogW2xvb3BFbmRWYWx1ZSBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGNvbmRpdGlvbjogW2NvbmRpdGlvblZhbHVlXSxcbiAgICAgIG1heEl0ZXJhdGlvbnM6IFt0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNV0sXG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgY29uZGl0aW9uLCBzZWxlY3RlZFRlbXBsYXRlIGFuZCB0ZW1wbGF0ZSB2YXJpYWJsZXMgZnJvbSBjb25maWcubmF0dXJhbFRleHRBY3Rpb25JZCB3aGVuIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS5cbiAgICogUmV0dXJucyB7IGNvbmRpdGlvbiB9IGlmIGEgbWF0Y2ggd2FzIGZvdW5kIHNvIGJ1aWxkRWRpdEZvcm0gY2FuIHNldCBpbml0aWFsIGZvcm0gdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHBvcHVsYXRlV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb25JZCgpOiB7IGNvbmRpdGlvbjogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKCFjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgfHwgIXRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICk7XG4gICAgaWYgKCFtYXRjaGluZ09wdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICBpZiAoIW5hdHVyYWxUZXh0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb25kaXRpb24gPSBuYXR1cmFsVGV4dDtcbiAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICByZXR1cm4geyBjb25kaXRpb246IG5hdHVyYWxUZXh0IH07XG4gIH1cblxuICAvKiogUmVidWlsZCBjb25kaXRpb24gKyB0ZW1wbGF0ZSBzdGF0ZSB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgbG9hZCBvciBjb25maWcgY2hhbmdlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkuICovXG4gIHByaXZhdGUgcmVidWlsZFdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0Rm9ybSB8fCB0aGlzLmxvb3BUeXBlICE9PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoIWNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCB8fCAhdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgKG9wdGlvbjogYW55KSA9PiBTdHJpbmcob3B0aW9uLmlkKSA9PT0gU3RyaW5nKGNvbmZpZ1dpdGhJZC5uYXR1cmFsVGV4dEFjdGlvbklkKVxuICAgICk7XG4gICAgaWYgKCFtYXRjaGluZ09wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uJyk/LnZhbHVlID8/ICcnO1xuICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlICE9PSBuYXR1cmFsVGV4dCkge1xuICAgICAgICB0aGlzLmVkaXRGb3JtLmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG5hdHVyYWxUZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uID0gbmF0dXJhbFRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICBpZiAoZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWdzIG9uY2UgKHNhbWUgb3B0aW9uIHNoYXBlIGFzIGRlZmF1bHQgc3RvcmllczogaWQgKyBuYW1lKTsgRk9SIGxvb3AgYWRkcyBzZWxlY3RlZFZhbHVlIGZyb20gc3RlcCAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpLm1hcCgobikgPT4gKHtcbiAgICAgIGlkOiBuLFxuICAgICAgdmFsdWU6IG4sXG4gICAgICBuYW1lOiBTdHJpbmcobiksXG4gICAgICBsYWJlbDogU3RyaW5nKG4pLFxuICAgIH0pKTtcbiAgICB0aGlzLmZvck9wdGlvblR5cGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdmb3JPcHRpb25UeXBlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBpZDogJ3Rlc3QtZGF0YScsIHZhbHVlOiAndGVzdC1kYXRhJywgbmFtZTogJ1Rlc3QgRGF0YSBQcm9maWxlJywgbGFiZWw6ICdUZXN0IERhdGEgUHJvZmlsZScgfSxcbiAgICAgICAgeyBpZDogJ2ZpeGVkJywgdmFsdWU6ICdmaXhlZCcsIG5hbWU6ICdGaXhlZCBjb3VudCcsIGxhYmVsOiAnRml4ZWQgY291bnQnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKSA6IG51bGw7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKSA6IG51bGw7XG4gICAgdGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdzdGFydFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIFN0YXJ0JyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdlbmRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBFbmQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgICAgLi4uKGVuZFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogZW5kVmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgY29uZGl0aW9uIHNlbGVjdCBjb25maWcgd2l0aCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvcHRpb25zIChsZWdhY3kgbWF0LXNlbGVjdCkgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogV2hpbGUgbG9vcDogb25seSBzaG93IG9wdGlvbnMgd2l0aCBzdGVwQWN0aW9uVHlwZSA9PT0gXCJXSElMRV9MT09QXCIgKi9cbiAgcHJpdmF0ZSB1cGRhdGVXaGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uLnN0ZXBBY3Rpb25UeXBlID09PSAnV0hJTEVfTE9PUCc7XG4gICAgfSk7XG4gICAgdGhpcy53aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlcmVkT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSB3aGlsZSBjb25kaXRpb24gYXV0b2NvbXBsZXRlIChXSElMRV9MT09QIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9ubHkpICovXG4gIGdldCB3aGlsZUNvbmRpdGlvbkF1dG9jb21wbGV0ZU9wdGlvbnMoKTogKENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSlbXSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMud2hpbGVDb25kaXRpb25TZWxlY3RDb25maWc/Lm9wdGlvbnMgPz8gW107XG4gICAgcmV0dXJuIG9wdHMubWFwKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSBvcHRpb24ubmF0dXJhbFRleHQgPz8gb3B0aW9uLm5hbWUgPz8gb3B0aW9uLnZhbHVlID8/IFN0cmluZyhvcHRpb24uaWQgPz8gJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG5hdHVyYWxUZXh0LFxuICAgICAgICBsYWJlbDogbmF0dXJhbFRleHQsXG4gICAgICAgIHRlbXBsYXRlOiBvcHRpb24udGVtcGxhdGUgfHwgb3B0aW9uLFxuICAgICAgfSBhcyBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH07XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbmRpdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLnRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlID09PSAndHJ1ZScgfHwgZGVmYXVsdFZhbHVlID09PSAnMSc7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5hZGRDb250cm9sKHZhcmlhYmxlLm5hbWUsIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdmFyaWFibGUubmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0ZXN0IGRhdGEgcHJvZmlsZSBzZWxlY3QgY29uZmlnIHdpdGggY3VycmVudCBvcHRpb25zIGFuZCBzZWxlY3RlZFZhbHVlIChmb3JMb29wVGVzdERhdGFJZCkuIEVuc3VyZSBzZWxlY3RlZCBpZCBpcyBpbiBvcHRpb25zIHNvIG1hdC1zZWxlY3QgY2FuIGRpc3BsYXkgaXQuICovXG4gIHByaXZhdGUgdXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5jb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZm9yTG9vcFRlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy50ZXN0RGF0YUlkO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpIDogdW5kZWZpbmVkO1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcmVzZWxlY3RlZCBpZCBidXQgaXQncyBub3QgaW4gdGhlIGN1cnJlbnQgb3B0aW9ucyBsaXN0IChlLmcuIG9wdGlvbnMgbm90IGxvYWRlZCB5ZXQpLCBhZGQgYSBwbGFjZWhvbGRlciBvcHRpb24gc28gdGhlIGRyb3Bkb3duIGNhbiBzaG93IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgaWRTdHIgPSBTdHJpbmcoZm9yTG9vcFRlc3REYXRhSWQpO1xuICAgICAgY29uc3QgYWxyZWFkeUluTGlzdCA9IG9wdGlvbnMuc29tZSgobzogU2VsZWN0T3B0aW9uKSA9PiBTdHJpbmcoby5pZCA/PyBvLnZhbHVlKSA9PT0gaWRTdHIpO1xuICAgICAgaWYgKCFhbHJlYWR5SW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdGhpcy50ZXN0RGF0YVByb2ZpbGUgfHwgJ1NlbGVjdGVkIHByb2ZpbGUnO1xuICAgICAgICBvcHRpb25zID0gW3sgaWQ6IGZvckxvb3BUZXN0RGF0YUlkLCB2YWx1ZTogZm9yTG9vcFRlc3REYXRhSWQsIG5hbWU6IGRpc3BsYXlOYW1lLCBsYWJlbDogZGlzcGxheU5hbWUgfSwgLi4ub3B0aW9uc107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnVGVzdGRhdGFwcm9maWxlJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBpbml0aWFsRmV0Y2hPbk9wZW46IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIC4uLihzZWxlY3RlZFZhbCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGVkVmFsICE9PSAnJyAmJiB7IHNlbGVjdGVkVmFsdWU6IHNlbGVjdGVkVmFsIH0pLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnkpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnkgfHwgJycpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBMb29wIFN0YXJ0IC8gTG9vcCBFbmQgc2VsZWN0IGNvbmZpZ3Mgd2l0aCBzZWxlY3RlZFZhbHVlIChmb3JMb29wU3RhcnRJbmRleCwgZm9yTG9vcEVuZEluZGV4KSBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZCAqL1xuICBwcml2YXRlIHVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICBjb25zdCBzdGFydFZhbCA9IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCk7XG4gICAgY29uc3QgZW5kVmFsID0gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCk7XG4gICAgY29uc3Qgc3RlcE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5nZXRMb29wU3RlcE9wdGlvbnMoKS5tYXAoKG4pID0+ICh7XG4gICAgICBpZDogbixcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgbmFtZTogU3RyaW5nKG4pLFxuICAgICAgbGFiZWw6IFN0cmluZyhuKSxcbiAgICB9KSk7XG4gICAgdGhpcy5zdGFydFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgICAuLi4oc3RhcnRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IHN0YXJ0VmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAgLi4udGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihlbmRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IGVuZFZhbCB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBhbGwgRk9SIGxvb3Agc2VsZWN0IGNvbmZpZ3MgKHRlc3REYXRhUHJvZmlsZSwgc3RhcnRTdGVwLCBlbmRTdGVwKSB3aXRoIHNlbGVjdGVkVmFsdWUgZnJvbSBzdGVwIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkICovXG4gIHByaXZhdGUgdXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICAvKiogQ29udmVydCBEYXRhUHJvZmlsZU9wdGlvbltdIHRvIFNlbGVjdE9wdGlvbltdICovXG4gIHByaXZhdGUgY29udmVydERhdGFQcm9maWxlT3B0aW9uc1RvU2VsZWN0T3B0aW9ucyhvcHRpb25zOiBEYXRhUHJvZmlsZU9wdGlvbltdKTogU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIGlkOiBvcHRpb24uaWQsXG4gICAgICB2YWx1ZTogb3B0aW9uLmlkLFxuICAgICAgbmFtZTogb3B0aW9uLm5hbWUsXG4gICAgICBsYWJlbDogb3B0aW9uLm5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRGF0YSBsZW5ndGggKE4pIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGU7IDAgaWYgbm9uZSBzZWxlY3RlZCBvciBub3QgZm91bmQuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gMDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICBjb25zdCBsZW4gPSAobWF0Y2guZGF0YSAmJiBBcnJheS5pc0FycmF5KG1hdGNoLmRhdGEpID8gbWF0Y2guZGF0YS5sZW5ndGggOiAwKSB8fCAobWF0Y2guZGF0YUxlbmd0aCA/PyAwKTtcbiAgICByZXR1cm4gdHlwZW9mIGxlbiA9PT0gJ251bWJlcicgPyBsZW4gOiAwO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQvRW5kIG9wdGlvbnM6IDEgdG8gTiBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGUncyBkYXRhIGFycmF5IGxlbmd0aDsgZmFsbHMgYmFjayB0byAxLi4xMCBpZiBubyBwcm9maWxlLiAqL1xuICBnZXRMb29wU3RlcE9wdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBjb25zdCBtYXggPSBOID4gMCA/IE4gOiBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50LkRFRkFVTFRfTE9PUF9PUFRJT05TX01BWDtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGRhdGEgcHJvZmlsZSBzZWxlY3Rpb246IHVwZGF0ZSBkaXNwbGF5LCBjbGFtcCBzdGFydC9lbmQgdG8gbmV3IHByb2ZpbGUgcmFuZ2UsIHJlZnJlc2ggc3RhcnQvZW5kIGRyb3Bkb3ducy4gKi9cbiAgcHJpdmF0ZSBvbkRhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRlc3REYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IE4gPSB0aGlzLmdldFNlbGVjdGVkUHJvZmlsZURhdGFMZW5ndGgoKTtcbiAgICBpZiAoTiA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpO1xuICAgIGNvbnN0IG1heFZhbCA9IG9wdGlvbnMubGVuZ3RoID4gMCA/IG9wdGlvbnNbb3B0aW9ucy5sZW5ndGggLSAxXSA6IDE7XG4gICAgbGV0IHN0YXJ0VmFsID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdzdGFydFN0ZXAnKT8udmFsdWUgPz8gdGhpcy5zdGFydFN0ZXA7XG4gICAgbGV0IGVuZFZhbCA9IHRoaXMuZWRpdEZvcm0/LmdldCgnZW5kU3RlcCcpPy52YWx1ZSA/PyB0aGlzLmVuZFN0ZXA7XG4gICAgaWYgKHN0YXJ0VmFsICE9IG51bGwgJiYgc3RhcnRWYWwgPiBtYXhWYWwpIHN0YXJ0VmFsID0gbWF4VmFsO1xuICAgIGlmIChlbmRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgPiBtYXhWYWwpIGVuZFZhbCA9IG1heFZhbDtcbiAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiBlbmRWYWwgIT0gbnVsbCAmJiBzdGFydFZhbCA+IGVuZFZhbCkgZW5kVmFsID0gc3RhcnRWYWw7XG4gICAgaWYgKHRoaXMuZWRpdEZvcm0pIHtcbiAgICAgIGlmIChzdGFydFZhbCAhPSBudWxsKSB0aGlzLmVkaXRGb3JtLmdldCgnc3RhcnRTdGVwJyk/LnNldFZhbHVlKHN0YXJ0VmFsKTtcbiAgICAgIGlmIChlbmRWYWwgIT0gbnVsbCkgdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKT8uc2V0VmFsdWUoZW5kVmFsKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFN0ZXAgPSBzdGFydFZhbCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gZW5kVmFsID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kU3RlcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgc2VhcmNoIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25TZWFyY2hEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsb2FkIG1vcmUgZGF0YSBwcm9maWxlcyAqL1xuICBwcml2YXRlIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRFbmRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdFTkQgRk9SJyA6ICdFTkQgV0hJTEUnO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBzdGFydCBpbmRleDogcHJlZmVyIGZvckxvb3BTdGFydEluZGV4IGZyb20gc3RlcCAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIHN0YXJ0U3RlcCwgZWxzZSBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBwcml2YXRlIGdldERpc3BsYXlTdGFydEluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwICE9IG51bGwpIHJldHVybiB0aGlzLnN0YXJ0U3RlcDtcbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBkaXNwbGF5IGVuZCBpbmRleDogcHJlZmVyIGZvckxvb3BFbmRJbmRleCBmcm9tIHN0ZXAgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBlbmRTdGVwLCBlbHNlIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheUVuZEluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgaWYgKHRoaXMuZW5kU3RlcCAhPSBudWxsKSByZXR1cm4gdGhpcy5lbmRTdGVwO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGxhc3Q/LnN0ZXBOdW1iZXIgYXMgbnVtYmVyIHwgdW5kZWZpbmVkID8/IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBwcm9maWxlIG5hbWU6IG1hcCBmb3JMb29wVGVzdERhdGFJZCB0byBwcm9maWxlIG5hbWUgZnJvbSBkYXRhUHJvZmlsZU9wdGlvbnMsIGVsc2UgdXNlIHRlc3REYXRhUHJvZmlsZSAqL1xuICBwcml2YXRlIGdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGlkID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAoaWQgIT0gbnVsbCAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG8gPT4gby5pZCA9PT0gaWQgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoaWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2gubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2VsZWN0ZWQgZGF0YSBwcm9maWxlIChieSBmb3JMb29wVGVzdERhdGFJZCBvciBmb3JtIHZhbHVlKSwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZERhdGFQcm9maWxlKCk6IERhdGFQcm9maWxlT3B0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZUlkID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAocHJvZmlsZUlkID09IG51bGwgfHwgIXRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgIChvOiBEYXRhUHJvZmlsZU9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKSB8fCBvLmlkID09PSBwcm9maWxlSWRcbiAgICApO1xuICAgIHJldHVybiBtYXRjaCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEdldCBkaXNwbGF5IG5hbWUgZm9yIGEgMS1iYXNlZCByb3cgaW5kZXggZnJvbSB0aGUgc2VsZWN0ZWQgcHJvZmlsZSdzIGRhdGEgYXJyYXkgKGRhdGFbaW5kZXgtMV0ubmFtZSkuIFJldHVybnMgbnVsbCBpZiBubyBuYW1lLiAqL1xuICBwcml2YXRlIGdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChvbmVCYXNlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwcm9maWxlID0gdGhpcy5nZXRTZWxlY3RlZERhdGFQcm9maWxlKCk7XG4gICAgaWYgKCFwcm9maWxlPy5kYXRhIHx8ICFBcnJheS5pc0FycmF5KHByb2ZpbGUuZGF0YSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkeCA9IG9uZUJhc2VkSW5kZXggLSAxO1xuICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBwcm9maWxlLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByb3cgPSBwcm9maWxlLmRhdGFbaWR4XTtcbiAgICByZXR1cm4gcm93ICYmIChyb3cubmFtZSAhPSBudWxsID8gU3RyaW5nKHJvdy5uYW1lKSA6IG51bGwpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2V0IChzbyB3ZSBjYW4gc2hvdy9oaWRlIHRoZSBjaGlwKSAqL1xuICBoYXNUZXN0RGF0YVByb2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgc3RhcnQgdmFsdWUgaXMgZXhwbGljaXRseSBzZXQgKGNvbmZpZyBvciBzdGFydFN0ZXAgaW5wdXQpLCBub3QgaW5mZXJyZWQgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgaGFzU3RhcnRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGVuZCB2YWx1ZSBpcyBleHBsaWNpdGx5IHNldCAoY29uZmlnIG9yIGVuZFN0ZXAgaW5wdXQpLCBub3QgaW5mZXJyZWQgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgaGFzRW5kVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmVuZFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RlcHNTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAgc3RlcHMnO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZ2V0RGlzcGxheVN0YXJ0SW5kZXgoKSA/PyAxO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0RGlzcGxheUVuZEluZGV4KCkgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgICByZXR1cm4gYFN0ZXBzICR7c3RhcnR9LSR7ZW5kfSAoJHtjb3VudH0gc3RlcCR7Y291bnQgIT09IDEgPyAncycgOiAnJ30pYDtcbiAgfVxuXG4gIGdldFN0YXJ0U3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCk7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpIHJldHVybiBgU3RhcnQ6ICR7dGhpcy5uZXN0ZWRTdGVwc1swXT8uc3RlcE51bWJlciA/PyAxfWA7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChlbmQpO1xuICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBgRW5kOiAke25hbWV9YCA6IGBFbmQ6ICR7ZW5kfWA7XG4gIH1cblxuICBnZXRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgaWYgKG5hbWUpIHJldHVybiBgVGVzdCBEYXRhIHByb2ZpbGU6ICR7bmFtZX1gO1xuICAgIHJldHVybiAnVGVzdCBEYXRhIHByb2ZpbGUnO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbiB8fCAnZWxlbWVudCBcIi5ub3RpZmljYXRpb24tYmFkZ2VcIiBleGlzdHMnO1xuICB9XG5cbiAgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6dGhpcy5jb25maWcsIGV4cGFuZGVkOnRoaXMuZXhwYW5kZWR9KTtcbiAgfVxuXG4gIG9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHZhbHVlO1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TdGFydFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkVuZFN0ZXBDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kU3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuZW5kU3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ29uZGl0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25NYXhJdGVyYXRpb25zQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZXN0ZWRTdGVwQ2hhbmdlLmVtaXQoeyBzdGVwLCBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoZXZlbnQ6IGJvb2xlYW4gfCB7Y29uZmlnOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGJvdGggYm9vbGVhbiBhbmQgb2JqZWN0IGZvcm1hdHNcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJiBldmVudCAhPT0gbnVsbCAmJiAnZXhwYW5kZWQnIGluIGV2ZW50KSB7XG4gICAgICAvLyBPYmplY3QgZm9ybWF0IGZyb20gc3RlcC1ncm91cDoge2NvbmZpZywgZXhwYW5kZWR9XG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQuZXhwYW5kZWQ7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQncyBjb25maWcgaXMgYSBzdGVwLWdyb3VwIChub3QgdGhlIGN1cnJlbnQgc3RlcClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgc3RlcC1ncm91cCBldmVudHMgYnViYmxlIHVwIGNvcnJlY3RseSBldmVuIHdoZW4gY29uZGl0aW9uIHN0ZXAgaXMgaW5zaWRlIGxvb3Agc3RlcFxuICAgICAgaWYgKHRoaXMuaXNTdGVwR3JvdXAoZXZlbnQuY29uZmlnKSkge1xuICAgICAgICAvLyBSZS1lbWl0IHRoZSB0b2dnbGVFeHBhbmRlZCBldmVudCB3aXRoIHRoZSBvYmplY3QgZm9ybWF0LCBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgLy8gQ2FzdCB0byBzYXRpc2Z5IFR5cGVTY3JpcHQgLSB0aGUgcmVuZGVyZXIgYWNjZXB0cyBUZXN0Q2FzZVN0ZXBDb25maWcgd2hpY2ggaW5jbHVkZXMgU3RlcEdyb3VwQ29uZmlnXG4gICAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOiBldmVudC5jb25maWcgYXMgYW55IGFzIExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogZXZlbnQuZXhwYW5kZWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm9vbGVhbiBmb3JtYXQgZnJvbSBvdGhlciBzdGVwIHR5cGVzXG4gICAgICAoc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gZXZlbnQgYXMgYm9vbGVhbjtcbiAgICB9XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25BZGRTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGZyb20gZW1wdHktc3RhdGUgcGx1cyBvbmx5OyBzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuIChwYXJlbnRJZCA9IGxvb3Agc3RlcCBpZCwgcG9zaXRpb24gPSBwYXJlbnQgKyAxKS4gKi9cbiAgb25BZGRTdGVwRW1wdHkoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoeyBsb29wU3RlcENvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAocGF5bG9hZE9ySW5kZXg6IGFueSwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZHggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBwYXlsb2FkT3JJbmRleDtcbiAgICBjb25zdCBwYXlsb2FkID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHBheWxvYWRPckluZGV4IDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KGlkeCk7XG4gICAgaWYgKHBheWxvYWQ/LnN0ZXApIHRoaXMuZGVsZXRlLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBlZGl0IGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gb3BlbiBlZGl0IG1vZGFsIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZEVkaXQoZXZlbnQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LnN0ZXAgIT0gbnVsbCkgdGhpcy5lZGl0LmVtaXQoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGR1cGxpY2F0ZSBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIGR1cGxpY2F0ZSAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWREdXBsaWNhdGUoZXZlbnQ6IGFueSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgoZXZlbnQgJiYgZXZlbnQuc3RlcCAhPSBudWxsKSA/IGV2ZW50IDogeyBzdGVwIH0gYXMgYW55KTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJywgXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoYnJhbmNoSW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShicmFuY2hJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICAvKiogU3luYyBGT1IgbG9vcCBlZGl0IGZvcm0gc28gZHJvcGRvd25zIHNob3cgZXhpc3RpbmcgY29uZmlnIChmb3JPcHRpb25UeXBlLCBmb3JMb29wVGVzdERhdGFJZC90ZXN0RGF0YVByb2ZpbGUsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCkgKi9cbiAgcHJpdmF0ZSBzeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICBjb25zdCB0ZXN0RGF0YVZhbCA9IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmb3JPcHRpb25UeXBlOiB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCkgPz8gbnVsbCxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFWYWwsXG4gICAgICBzdGFydFN0ZXA6IHN0YXJ0VmFsLFxuICAgICAgZW5kU3RlcDogZW5kVmFsLFxuICAgIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgc2V0IGVhY2ggY29udHJvbCBzbyBtYXQtc2VsZWN0IHBpY2tzIHVwIHRoZSB2YWx1ZSAocGF0Y2hWYWx1ZSBjYW4gYmUgaWdub3JlZCBieSBjaGlsZCBpbiBzb21lIHRpbWluZyBjYXNlcylcbiAgICBjb25zdCB0ZXN0RGF0YUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgY29uc3Qgc3RhcnRDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXJ0U3RlcCcpO1xuICAgIGNvbnN0IGVuZEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5kU3RlcCcpO1xuICAgIGlmICh0ZXN0RGF0YUN0cmwgJiYgdGVzdERhdGFWYWwgIT09IHVuZGVmaW5lZCAmJiB0ZXN0RGF0YVZhbCAhPT0gJycpIHRlc3REYXRhQ3RybC5zZXRWYWx1ZSh0ZXN0RGF0YVZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGlmIChzdGFydEN0cmwgJiYgc3RhcnRWYWwgIT0gbnVsbCkgc3RhcnRDdHJsLnNldFZhbHVlKHN0YXJ0VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKGVuZEN0cmwgJiYgZW5kVmFsICE9IG51bGwpIGVuZEN0cmwuc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0ge1xuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgc2VsZWN0ZWRUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPyBbLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc10gOiBbXSxcbiAgICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA/IHsgLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0udmFsdWUgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIEZPUiBsb29wOiByZWZyZXNoIHNlbGVjdCBjb25maWdzIChzbyBUZXN0IERhdGEgUHJvZmlsZSBvcHRpb25zIGluY2x1ZGUgc2VsZWN0ZWQgaWQgaWYgbmVlZGVkKSB0aGVuIHN5bmMgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgdGhpcy51cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyxcbiAgICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsLFxuICAgICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAgPz8gbnVsbCxcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1LFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFdoaWxlIGxvb3A6IHJlc3RvcmUgc2VsZWN0ZWQgdGVtcGxhdGUgYW5kIHRlbXBsYXRlIHZhcmlhYmxlcyBmcm9tIGNvbmZpZyB3aGVuIG9wZW5pbmcgZWRpdFxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmICh0aGlzLmNvbmRpdGlvbiB8fCAodGhpcy5jb25maWcgYXMgYW55KS50ZW1wbGF0ZVZhcmlhYmxlc0RhdGEpKSB7XG4gICAgICBjb25zdCBjb25maWdXaXRoRGF0YSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblN0ciA9IHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhEYXRhLmNvbmRpdGlvbiB8fCAnJztcbiAgICAgIGlmIChjb25kaXRpb25TdHIgJiYgKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgICAgKG9wdDogYW55KSA9PiAob3B0Lm5hdHVyYWxUZXh0IHx8IG9wdC5uYW1lIHx8IG9wdC52YWx1ZSkgPT09IGNvbmRpdGlvblN0clxuICAgICAgICApO1xuICAgICAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbj8udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lZGl0LmVtaXQoKTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdi50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2LnN0YXJ0U3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gdi5lbmRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHYuY29uZGl0aW9uID8/ICcnO1xuICAgIGNvbnN0IG1heFZhbCA9IHYubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0eXBlb2YgbWF4VmFsID09PSAnbnVtYmVyJyA/IG1heFZhbCA6IChtYXhWYWwgIT0gbnVsbCAmJiBtYXhWYWwgIT09ICcnID8gTnVtYmVyKG1heFZhbCkgOiB1bmRlZmluZWQpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSBvcHRpb24gdG8gZ2V0IGJvdGggSUQgYW5kIG5hbWVcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgXG4gICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbHVlICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBmb3JtIHZhbHVlIG1pZ2h0IGJlIElEIChudW1iZXIpIG9yIG5hbWUgKHN0cmluZylcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgb3B0aW9uLm5hbWUgPT09IHRlc3REYXRhUHJvZmlsZVZhbHVlIHx8IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcodGVzdERhdGFQcm9maWxlVmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IHNlbGVjdGVkUHJvZmlsZS5pZDtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlTmFtZSA9IHNlbGVjdGVkUHJvZmlsZS5uYW1lO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZU5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgdmFsdWUgYXMtaXMgKG1pZ2h0IGJlIElEIG9yIG5hbWUpXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFdoaWxlIGxvb3A6IGJ1aWxkIHRlbXBsYXRlVmFyaWFibGVzRGF0YSBhbmQgbmF0dXJhbFRleHRBY3Rpb25JZCBmcm9tIHNlbGVjdGVkIHRlbXBsYXRlIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKVxuICAgIGxldCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueTtcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/Lmxlbmd0aCkge1xuICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhID0ge307XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlPy5pZCAhPSBudWxsKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzIChpbmNsdWRlIHRlc3REYXRhUHJvZmlsZUlkLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEsIG5hdHVyYWxUZXh0QWN0aW9uSWQgZm9yIHdoaWxlOyBmb3JMb29wVGVzdERhdGFJZCwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4IGZvciBmb3IpXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZzogTG9vcFN0ZXBDb25maWcgJiB7IHRlc3REYXRhUHJvZmlsZUlkPzogc3RyaW5nIHwgbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXIgfSA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZUlkOiB0ZXN0RGF0YVByb2ZpbGVJZCwgLy8gQWRkIElEIGZvciBBUEkgY2FsbFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge30pLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBuYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgeyBuYXR1cmFsVGV4dEFjdGlvbklkIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiYgeyBmb3JMb29wVGVzdERhdGFJZDogTnVtYmVyKHRlc3REYXRhUHJvZmlsZUlkKSB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLnN0YXJ0U3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcFN0YXJ0SW5kZXg6IHRoaXMuc3RhcnRTdGVwIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZW5kU3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcEVuZEluZGV4OiB0aGlzLmVuZFN0ZXAgfSksXG4gICAgfTtcbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodGhpcy50ZXN0RGF0YVByb2ZpbGUpO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodGhpcy5zdGFydFN0ZXAgPz8gMSk7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodGhpcy5lbmRTdGVwID8/IDEpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29uZGl0aW9uKTtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnXG4gICAgY29uc29sZS5sb2coJ0xvb3Atc3RlcDogRW1pdHRpbmcgc3RlcFVwZGF0ZSBldmVudCcsIHVwZGF0ZWRDb25maWcpO1xuICAgIHRoaXMuc3RlcFVwZGF0ZS5lbWl0KHVwZGF0ZWRDb25maWcpO1xuICAgIFxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZXN0RGF0YVByb2ZpbGU7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5zdGFydFN0ZXA7XG4gICAgdGhpcy5lbmRTdGVwID0gdGhpcy5lZGl0U25hcHNob3QuZW5kU3RlcDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbjtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmVkaXRTbmFwc2hvdC5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuZWRpdFNuYXBzaG90LnNlbGVjdGVkVGVtcGxhdGU7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuZWRpdFNuYXBzaG90LnRlbXBsYXRlVmFyaWFibGVzIHx8IFtdO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ251bWJlcicgPyB0aGlzLnN0ZXBOdW1iZXIgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSA6IDApO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCh7IHN0ZXA6IHRoaXMuY29uZmlnIGFzIFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IGlzTmFOKGluZGV4KSA/IDAgOiBpbmRleCB9KTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QIERldGFpbHMnIDogJ1dISUxFIExPT1AgRGV0YWlscyc7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxvb3Atc3RlcC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9zZWxlY3QgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgb3Igc3RhcnQgZHJhZyAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyAoc2hvd24gd2hlbiB0ZW1wbGF0ZSBpcyBzZWxlY3RlZCwgc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGUgJiYgdGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiB0ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+e3sgdmFyaWFibGUubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMTUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICd0eXBlJyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2Nyb2xsVG8nICYmICF2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRW50ZXIgJyArIHZhcmlhYmxlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWUgfHwgdmFyaWFibGUudmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gRWRpdCBJbiBkZXB0aCBsaW5rIC0tPlxuICAgICAgPGEgaHJlZj1cIiNcIiAqbmdJZj1cImlzV2hpbGVMb29wKClcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgIEVkaXQgSW4gZGVwdGhcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yLjAzODA5IDYuNzQzMjlMMi42MjgwOSA3LjMzMzI5TDUuOTYxNDIgMy45OTk5NkwyLjYyODA5IDAuNjY2NjI2TDIuMDM4MDkgMS4yNTY2M0w0Ljc4MTQyIDMuOTk5OTZMMi4wMzgwOSA2Ljc0MzI5WlwiXG4gICAgICAgICAgICBmaWxsPVwiIzNGNDNFRVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDwhLS0gQ2FuY2VsIC8gQXBwbHkgLS0+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0NhbmNlbCdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXRDYW5jZWwoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0nXCIgW3RleHRdPVwiJ0FwcGx5J1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdEFwcGx5KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb29wIEhlYWRlciAobm9ybWFsIHZpZXcgd2hlbiBub3QgZWRpdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNFZGl0aW5nXCJcbiAgICBbY2xhc3NdPVwiJ3N0ZXAtcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0yICcgKyAoaXNJbnNpZGVMb29wID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UpIC0tPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgQ29udHJvbHMgKG9ubHkgc2hvdyBUZXN0IERhdGEgcHJvZmlsZSAvIFN0YXJ0IC8gRW5kIHdoZW4gdmFsdWVzIGFyZSBzZXQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcicgJiYgKGhhc1Rlc3REYXRhUHJvZmlsZSgpIHx8IGhhc1N0YXJ0VmFsdWUoKSB8fCBoYXNFbmRWYWx1ZSgpKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTJcIj5cbiAgICAgIDwhLS0gVGVzdCBEYXRhIFByb2ZpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cImhhc1Rlc3REYXRhUHJvZmlsZSgpXCIgdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwidGVzdERhdGFQcm9maWxlXCIgW2NsYXNzLmNxYS10ZXh0LXByaW1hcnldPVwidGVzdERhdGFQcm9maWxlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMC41IGNxYS1weC0yIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOEE4Q0Y0XSBjcWEtcm91bmRlZCBjcWEtYmctWyNEOEQ5RkNdXCI+XG4gICAgICAgIHt7IGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFN0YXJ0IEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNTdGFydFZhbHVlKClcIiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLmNxYS1iZy1wcmltYXJ5LTEwMF09XCJzdGFydFN0ZXBcIiBbY2xhc3MuY3FhLXRleHQtcHJpbWFyeV09XCJzdGFydFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0U3RhcnRTdGVwTGFiZWwoKSB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gRW5kIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNFbmRWYWx1ZSgpXCIgdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5jcWEtYmctcHJpbWFyeS0xMDBdPVwiZW5kU3RlcFwiIFtjbGFzcy5jcWEtdGV4dC1wcmltYXJ5XT1cImVuZFN0ZXBcIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyM4QThDRjRdIGNxYS1yb3VuZGVkIGNxYS1iZy1bI0Q4RDlGQ11cIj5cbiAgICAgICAge3sgZ2V0RW5kU3RlcExhYmVsKCkgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTkwMCBjcWEtdGV4dC1zbVwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1tbC1hdXRvXCI+XG4gICAgICA8IS0tIFN0ZXBzIFN1bW1hcnkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLWxnIGNxYS1weS0wLjUgY3FhLXB4LTIgY3FhLXRleHQtWyMwQTBBMEFdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgZ2V0U3RlcHNTdW1tYXJ5KCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZpZXcgRGV0YWlscyBMaW5rIChzaG93IG9ubHkgaWYgZGVzY3JpcHRpb24gaXMgbm90IGVtcHR5KSAtLT5cbiAgICAgIDxhICpuZ0lmPVwiY29uZmlnLmRlc2NyaXB0aW9uICYmIGNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgIT09ICcnXCIgI3ZpZXdEZXRhaWxzVHJpZ2dlciBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdEZXRhaWxzKCRldmVudClcIiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbm8tdW5kZXJsaW5lIGNxYS1tbC1hdXRvXCI+VmlldyBEZXRhaWxzPHN2ZyB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCA4IDhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+PC9hPlxuXG4gICAgICA8IS0tIENyZWF0ZWQgRGF0ZSAoZnJvbSBBUEkpIC0gYmVmb3JlIGFjdGlvbiBpY29ucywgZm9ybWF0OiAyNSBGZWIgMjAyNiAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLmNyZWF0ZWREYXRlXCIgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBjb25maWcuY3JlYXRlZERhdGUgfCBkYXRlOidkIE1NTSB5eXl5JyB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPCEtLSBBY3Rpb24gSWNvbnM6IEVkaXQsIExpbmssIER1cGxpY2F0ZSwgRGVsZXRlIChzaG93IG9uIGhvdmVyOyBoaWRkZW4gd2hlbiBpbnNpZGUgc3RlcC1ncm91cCkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5zaWRlU3RlcEdyb3VwXCIgY2xhc3M9XCJzdGVwLWFjdGlvbnMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LVs3cHhdXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkVkaXQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03IDExLjY2NjZIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOS41NTIwOCAyLjExMjhDOS43ODQzIDEuODgwNTggMTAuMDk5MyAxLjc1MDEyIDEwLjQyNzcgMS43NTAxMkMxMC43NTYxIDEuNzUwMTIgMTEuMDcxIDEuODgwNTggMTEuMzAzMyAyLjExMjhDMTEuNTM1NSAyLjM0NTAyIDExLjY2NTkgMi42NTk5OCAxMS42NjU5IDIuOTg4MzhDMTEuNjY1OSAzLjMxNjc5IDExLjUzNTUgMy42MzE3NSAxMS4zMDMzIDMuODYzOTdMNC4yOTc0MiAxMC44NzA0QzQuMTU4NjQgMTEuMDA5MiAzLjk4NzEgMTEuMTEwNyAzLjc5ODY3IDExLjE2NTZMMi4xMjMzMyAxMS42NTQ0QzIuMDczMTQgMTEuNjY5IDIuMDE5OTMgMTEuNjY5OSAxLjk2OTI4IDExLjY1NjlDMS45MTg2MyAxMS42NDM5IDEuODcyNCAxMS42MTc2IDEuODM1NDMgMTEuNTgwNkMxLjc5ODQ2IDExLjU0MzcgMS43NzIxIDExLjQ5NzQgMS43NTkxMyAxMS40NDY4QzEuNzQ2MTUgMTEuMzk2MSAxLjc0NzAzIDExLjM0MjkgMS43NjE2NyAxMS4yOTI3TDIuMjUwNSA5LjYxNzM4QzIuMzA1NDYgOS40MjkxNiAyLjQwNjk4IDkuMjU3ODMgMi41NDU2NyA5LjExOTIyTDkuNTUyMDggMi4xMTI4WlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25MaW5rKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiTGlua1wiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjOTlBMUFmXSBob3ZlcjpjcWEtdGV4dC1bIzE0NDdFNl1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNS4wMDA2NSA5LjkxNjcxSDMuNjY3MzJDMi43ODMyNiA5LjkxNjcxIDEuOTM1NDIgOS42MDk0MiAxLjMxMDMgOS4wNjI0NEMwLjY4NTE3NCA4LjUxNTQ1IDAuMzMzOTg0IDcuNzczNTkgMC4zMzM5ODQgNy4wMDAwNEMwLjMzMzk4NCA2LjIyNjQ5IDAuNjg1MTc0IDUuNDg0NjMgMS4zMTAzIDQuOTM3NjVDMS45MzU0MiA0LjM5MDY2IDIuNzgzMjYgNC4wODMzNyAzLjY2NzMyIDQuMDgzMzdINS4wMDA2NVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05IDQuMDgzMzdIMTAuMzMzM0MxMS4yMTc0IDQuMDgzMzcgMTIuMDY1MiA0LjM5MDY2IDEyLjY5MDQgNC45Mzc2NUMxMy4zMTU1IDUuNDg0NjMgMTMuNjY2NyA2LjIyNjQ5IDEzLjY2NjcgNy4wMDAwNEMxMy42NjY3IDcuNzczNTkgMTMuMzE1NSA4LjUxNTQ1IDEyLjY5MDQgOS4wNjI0NEMxMi4wNjUyIDkuNjA5NDIgMTEuMjE3NCA5LjkxNjcxIDEwLjMzMzMgOS45MTY3MUg5XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuMzMzOTggN0g5LjY2NzMyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRHVwbGljYXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMS42NjYgNC42NjY2M0g1LjgzMjY4QzUuMTg4MzUgNC42NjY2MyA0LjY2NjAyIDUuMTg4OTYgNC42NjYwMiA1LjgzMzI5VjExLjY2NjZDNC42NjYwMiAxMi4zMTEgNS4xODgzNSAxMi44MzMzIDUuODMyNjggMTIuODMzM0gxMS42NjZDMTIuMzEwMyAxMi44MzMzIDEyLjgzMjcgMTIuMzExIDEyLjgzMjcgMTEuNjY2NlY1LjgzMzI5QzEyLjgzMjcgNS4xODg5NiAxMi4zMTAzIDQuNjY2NjMgMTEuNjY2IDQuNjY2NjNaXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTIuMzMyNjggOS4zMzMyOUMxLjY5MTAyIDkuMzMzMjkgMS4xNjYwMiA4LjgwODI5IDEuMTY2MDIgOC4xNjY2M1YyLjMzMzI5QzEuMTY2MDIgMS42OTE2MyAxLjY5MTAyIDEuMTY2NjMgMi4zMzI2OCAxLjE2NjYzSDguMTY2MDJDOC44MDc2OCAxLjE2NjYzIDkuMzMyNjggMS42OTE2MyA5LjMzMjY4IDIuMzMzMjlcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkRlbGV0ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0wIGNxYS10ZXh0LVsjZmY2NDY3XSBob3ZlcjpjcWEtdGV4dC1bI0M2MzUzNV1cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS43NSAzLjVIMTIuMjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTEuMDgyNyAzLjVWMTEuNjY2N0MxMS4wODI3IDEyLjI1IDEwLjQ5OTMgMTIuODMzMyA5LjkxNjAyIDEyLjgzMzNINC4wODI2OEMzLjQ5OTM1IDEyLjgzMzMgMi45MTYwMiAxMi4yNSAyLjkxNjAyIDExLjY2NjdWMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTQuNjY2MDIgMy40OTk5NlYyLjMzMzI5QzQuNjY2MDIgMS43NDk5NiA1LjI0OTM1IDEuMTY2NjMgNS44MzI2OCAxLjE2NjYzSDguMTY2MDJDOC43NDkzNSAxLjE2NjYzIDkuMzMyNjggMS43NDk5NiA5LjMzMjY4IDIuMzMzMjlWMy40OTk5NlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjgzMzk4IDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDYuNDE2NjNWOS45MTY2M1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgd2l0aCBOZXN0ZWQgU3RlcHMgKHJlbmRlcmVyIGRpc3BhdGNoZXMgYnkgc3RlcCB0eXBlLCBuLWxldmVsIG5lc3RpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgIFtpc05lc3RlZF09XCJ0cnVlXCIgW2lzSW5zaWRlTG9vcF09XCJ0cnVlXCIgW2lzUmVvcmRlcl09XCJpc1Jlb3JkZXJcIlxuICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgIFtuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXT1cIm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNcIlxuICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChkZWxldGVTdGVwKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQpXCJcbiAgICAgICAgKHRvZ2dsZUV4cGFuZGVkKT1cIm9uTmVzdGVkVG9nZ2xlRXhwYW5kZWQoJGV2ZW50LCBzdGVwLCBpKVwiXG4gICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmRlc2NyaXB0aW9uID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocmV1c2FibGVDaGFuZ2UpPVwiJGFueShzdGVwKS5yZXVzYWJsZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZEVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWREdXBsaWNhdGUoJGV2ZW50LCBzdGVwKVwiIChkZWxldGUpPVwib25EZWxldGVTdGVwKCRldmVudCwgaSlcIlxuICAgICAgICAodmlld0RldGFpbHMpPVwidmlld0RldGFpbHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGJyYW5jaFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGFkZEJyYW5jaCk9XCJvbk5lc3RlZENvbmRpdGlvbkFkZEJyYW5jaCgkYW55KHN0ZXApLCBpKVwiXG4gICAgICAgIChkZWxldGVCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2goJGFueShzdGVwKSwgJGV2ZW50LCBpKVwiXG4gICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzdGFydFN0ZXBDaGFuZ2UpPVwiJGFueShzdGVwKS5zdGFydFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChlbmRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZW5kU3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZXZlbnRUeXBlQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZXZlbnRUeXBlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAocGFyYW1ldGVyQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIG5lc3RlZC1zdGVwLWRyb3AtbGlzdFwiXG4gICAgICAgICBbZG5kRHJvcHpvbmVdPVwiWydzdGVwJ11cIlxuICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAgIChkbmREcm9wKT1cIm9uRG5kRHJvcCgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGRuZFBsYWNlaG9sZGVyUmVmIGNsYXNzPVwic3RlcC1kcmFnLXBsYWNlaG9sZGVyLW5lc3RlZCBjcWEtbXktMSBjcWEtbWluLWgtWzUwcHhdIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjM0Y0M0VFXSBjcWEtcm91bmRlZCBjcWEtYmctW3JnYmEoNjMsNjcsMjM4LDAuMDgpXSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQteHNcIj5Ecm9wIGhlcmU8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN0ZXAgb2YgbmVzdGVkU3RlcHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm5lc3RlZC1zdGVwLWRyYWctaXRlbVwiXG4gICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwic3RlcFwiXG4gICAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgICAgZG5kVHlwZT1cInN0ZXBcIj5cbiAgICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciBbc3RlcF09XCJzdGVwXCIgW2luZGV4XT1cImlcIlxuICAgICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgICBbaXNOZXN0ZWRdPVwidHJ1ZVwiIFtpc0luc2lkZUxvb3BdPVwidHJ1ZVwiIFtpc1Jlb3JkZXJdPVwiaXNSZW9yZGVyXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5BYm92ZV09XCJhZGRTdGVwQmV0d2VlbkFib3ZlXCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5CZWxvd109XCJhZGRTdGVwQmV0d2VlbkJlbG93XCJcbiAgICAgICAgICBbYWRkU3RlcEJldHdlZW5dPVwiYWRkU3RlcEJldHdlZW5cIlxuICAgICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgICBbbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc109XCJuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zXCJcbiAgICAgICAgICAobmVzdGVkU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2UoJGV2ZW50LnN0ZXAsICRldmVudC5pbmRleClcIlxuICAgICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFbXB0eSBsb29wOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibmVzdGVkU3RlcHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEVtcHR5KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiQWRkIHN0ZXBcIlxuICAgICAgICBjbGFzcz1cImxvb3Atc3RlcC1lbXB0eS1hZGRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMjEuMTgyMlwiIGhlaWdodD1cIjIyXCIgcng9XCIxMC41OTExXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk04LjUgMTJIMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOC41VjE1LjVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRU5EIE1hcmtlciAtLT5cbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiJ2NxYS1wbC00IGNxYS1weS0xIGNxYS1iZy1bI0RCRUFGRTgwXSBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0nXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICB7eyBnZXRFbmRMYWJlbCgpIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19