@cqa-lib/cqa-ui 1.1.278 → 1.1.279

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.
@@ -6,12 +6,10 @@ import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
7
  import * as i2 from "../../dynamic-select/dynamic-select-field.component";
8
8
  import * as i3 from "../../autocomplete/autocomplete.component";
9
- import * as i4 from "@angular/material/slide-toggle";
10
- import * as i5 from "../../custom-input/custom-input.component";
11
- import * as i6 from "../../button/button.component";
12
- import * as i7 from "../test-case-details-renderer/test-case-details-renderer.component";
13
- import * as i8 from "@angular/common";
14
- import * as i9 from "ngx-drag-drop";
9
+ import * as i4 from "../../button/button.component";
10
+ import * as i5 from "../test-case-details-renderer/test-case-details-renderer.component";
11
+ import * as i6 from "@angular/common";
12
+ import * as i7 from "ngx-drag-drop";
15
13
  const LOOP_STEP_EMPTY_STYLES = `
16
14
  /* Empty loop: show plus icon on hover when expanded and no steps */
17
15
  .loop-step-empty {
@@ -761,6 +759,18 @@ export class TestCaseLoopStepComponent {
761
759
  }
762
760
  return withWhile;
763
761
  }
762
+ /** Event key-value pairs for display (e.g. selector, element) - same as condition step getBranchEventDetailsForDisplay */
763
+ getLoopEventDetailsForDisplay() {
764
+ const event = this.config?.event;
765
+ if (!event || typeof event !== 'object')
766
+ return [];
767
+ return Object.entries(event)
768
+ .filter(([key]) => key !== 'customEvent')
769
+ .map(([key, value]) => ({
770
+ key,
771
+ value: value != null ? String(value) : ''
772
+ }));
773
+ }
764
774
  onToggleExpanded() {
765
775
  this.expanded = !this.expanded;
766
776
  this.toggleExpanded.emit({ config: this.config, expanded: this.expanded });
@@ -1098,13 +1108,13 @@ export class TestCaseLoopStepComponent {
1098
1108
  /** Default max for Loop Start / End when no profile selected (options 1..10) */
1099
1109
  TestCaseLoopStepComponent.DEFAULT_LOOP_OPTIONS_MAX = 10;
1100
1110
  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 });
1101
- 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]=\"whileConditionDisplayValue\"\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 && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? '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 Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\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-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></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 <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (mousedown)=\"$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 (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\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 } });
1111
+ 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]=\"whileConditionDisplayValue\"\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 hidden in while loop - use Edit In depth to configure -->\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 && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? '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 Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\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 <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (mousedown)=\"$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 (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\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.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i5.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: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i7.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i7.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }], pipes: { "date": i6.DatePipe } });
1102
1112
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseLoopStepComponent, decorators: [{
1103
1113
  type: Component,
1104
1114
  args: [{ selector: 'cqa-test-case-loop-step', host: { class: 'cqa-ui-root' }, styles: [
1105
1115
  STEP_ROW_ACTIONS_STYLES,
1106
1116
  LOOP_STEP_EMPTY_STYLES,
1107
- ], 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]=\"whileConditionDisplayValue\"\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 && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? '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 Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\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-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></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 <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (mousedown)=\"$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 (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1117
+ ], 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]=\"whileConditionDisplayValue\"\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 hidden in while loop - use Edit In depth to configure -->\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 && isInsideStepGroup ? 'cqa-pl-20 cqa-pr-4' : (isInsideLoop || isInsideStepGroup) ? '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 Display (same styling as condition step, HTML badges via innerHTML) -->\n <div *ngIf=\"loopType === 'for' && (hasTestDataProfile() || hasStartValue() || hasEndValue())\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getForLoopDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\n </div>\n\n <!-- While Loop Condition (only show if condition exists) - same styling as condition step -->\n <div *ngIf=\"isWhileLoop() && condition\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-ml-2 cqa-flex-1 cqa-flex-wrap\">\n <span class=\"cqa-text-[#111827] cqa-text-[14px] cqa-leading-[18px] cqa-action-format\" [innerHTML]=\"getConditionDisplay()\" (click)=\"onLoopActionClick($event)\"></span>\n <ng-container *ngIf=\"getLoopEventDetailsForDisplay().length > 0\">\n <span *ngFor=\"let item of getLoopEventDetailsForDisplay()\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-0.5 cqa-px-2 cqa-rounded cqa-text-[12px] cqa-leading-[15px] cqa-bg-[#F3F4F6] cqa-text-[#374151] cqa-border cqa-border-solid cqa-border-[#E5E7EB]\" (click)=\"onLoopActionClick($event)\">\n <span class=\"cqa-font-medium cqa-text-[#6B7280]\">{{ item.key }}:</span>\n <span class=\"cqa-text-[#111827]\">{{ item.value }}</span>\n </span>\n </ng-container>\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 <!-- START Marker (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getStartLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (addStepForLoop)=\"onAddStepForLoopFromNested($event)\" (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()\" (mousedown)=\"$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 (centered with decorative lines) -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-1 cqa-px-4 cqa-bg-[#DBEAFE80]\" style=\"border-top: 1px solid #BEDBFF;\">\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n <span class=\"cqa-text-[#1C398E] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap\">{{ getEndLabel() }}</span>\n <span class=\"cqa-flex-1 cqa-self-stretch cqa-border-t cqa-border-dashed cqa-border-[#1C398E] cqa-opacity-40\" style=\"min-width: 20px;\"></span>\n </div>\n </div>\n</div>" }]
1108
1118
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
1109
1119
  type: Input
1110
1120
  }], id: [{
@@ -1201,4 +1211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1201
1211
  type: ViewChild,
1202
1212
  args: ['viewDetailsTrigger', { static: false }]
1203
1213
  }] } });
1204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBS3JFLE1BQU0sc0JBQXNCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0I5QixDQUFDO0FBVUYsTUFBTSxPQUFPLHlCQUF5QjtJQW1IcEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEh2QixhQUFRLEdBQW9CLEtBQUssQ0FBQztRQU9sQyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0ZBQWdGO1FBQ3ZFLHVCQUFrQixHQUF3QixFQUFFLENBQUM7UUFDdEQs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QU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkF3QzZDLGtCQUFrQjtzQkFBckUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSAnbmd4LWRyYWctZHJvcCc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb29wU3RlcENvbmZpZywgVGVzdENhc2VTdGVwQ29uZmlnLCBOb3JtYWxTdGVwQ29uZmlnLCBDb25kaXRpb25TdGVwQ29uZmlnLCBTdGVwR3JvdXBDb25maWcsIENvbmRpdGlvbkJyYW5jaCwgU3RlcFR5cGVzIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfUk9XX0FDVElPTlNfU1RZTEVTIH0gZnJvbSAnLi4vc3RlcC1yb3ctYWN0aW9ucy5zdHlsZXMnO1xuaW1wb3J0IHsgRGF0YVByb2ZpbGVPcHRpb24gfSBmcm9tICcuLi8uLi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdEZXRhaWxzUGF5bG9hZCB9IGZyb20gJy4uL3N0ZXAtZGV0YWlscy1tb2RhbC9zdGVwLWRldGFpbHMtbW9kYWwtZGF0YSc7XG5pbXBvcnQgeyBDcWFBdXRvY29tcGxldGVPcHRpb24gfSBmcm9tICcuLi8uLi9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLm1vZGVsJztcblxuY29uc3QgTE9PUF9TVEVQX0VNUFRZX1NUWUxFUyA9IGBcbiAgLyogRW1wdHkgbG9vcDogc2hvdyBwbHVzIGljb24gb24gaG92ZXIgd2hlbiBleHBhbmRlZCBhbmQgbm8gc3RlcHMgKi9cbiAgLmxvb3Atc3RlcC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxuICAubG9vcC1zdGVwLXJvdzpob3ZlciAubG9vcC1zdGVwLWVtcHR5IHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICMzRjQzRUU7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlO1xuICB9XG4gIC5sb29wLXN0ZXAtZW1wdHktYWRkOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gIH1cbmA7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWxvb3Atc3RlcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIHN0eWxlczogW1xuICAgIFNURVBfUk9XX0FDVElPTlNfU1RZTEVTLFxuICAgIExPT1BfU1RFUF9FTVBUWV9TVFlMRVMsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IExvb3BTdGVwQ29uZmlnO1xuICBASW5wdXQoKSBpZCE6IHN0cmluZztcbiAgQElucHV0KCkgbG9vcFR5cGU6ICdmb3InIHwgJ3doaWxlJyA9ICdmb3InO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyITogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBjb25kaXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlc3REYXRhUHJvZmlsZT86IHN0cmluZztcbiAgQElucHV0KCkgc3RhcnRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBlbmRTdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKSBuZXN0ZWRTdGVwczogVGVzdENhc2VTdGVwQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc05lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0luc2lkZUxvb3A6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVTdGVwR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZW9yZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuICAvKiogSW5kaWNhdGVzIGlmIG1vcmUgZGF0YSBwcm9maWxlcyBhcmUgYXZhaWxhYmxlIGZvciBsb2FkaW5nICovXG4gIEBJbnB1dCgpIGhhc01vcmVEYXRhUHJvZmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExvYWRpbmcgc3RhdGUgZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPcHRpb25zIGZvciBuYXR1cmFsIHRleHQgYWN0aW9ucyAoZm9yIHdoaWxlIGxvb3AgY29uZGl0aW9uKSAqL1xuICBASW5wdXQoKSBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvKiogRnVuY3Rpb24gdG8gcHJvY2VzcyB0ZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgKi9cbiAgQElucHV0KCkgc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogYW55KSA9PiBhbnlbXSA9ICgpID0+IFtdO1xuICAvKiogU2hvdyBcIkFkZCBTdGVwIEJldHdlZW5cIiBidXR0b24gYWJvdmUgbmVzdGVkIHN0ZXBzICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBCZXR3ZWVuQWJvdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGJlbG93IG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkJlbG93OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYWRkU3RlcEJldHdlZW5BYm92ZSBhbmQgYWRkU3RlcEJldHdlZW5CZWxvdyBpbnN0ZWFkLiBJZiBzZXQsIGFwcGxpZXMgdG8gYm90aCBidXR0b25zLiAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbmZpZzogTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBib29sZWFufT4oKTtcbiAgQE91dHB1dCgpIHRlc3REYXRhUHJvZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3RhcnRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlbmRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb25kaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG1heEl0ZXJhdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIG5lc3RlZFN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIC8qKiBFbWl0cyB2b2lkIHdoZW4gYWRkIGlzIGZyb20gbmVzdGVkIGNvbnRlbnQ7IGVtaXRzIHsgbG9vcFN0ZXBDb25maWcgfSB3aGVuIGVtcHR5LXN0YXRlIGFkZCBpcyBjbGlja2VkIChzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuKS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQgfCB7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZHVwbGljYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbW9yZU9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXI8Vmlld0RldGFpbHNQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgZWRpdEluRGVwdGggPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyOyB0ZW1wbGF0ZU92ZXJyaWRlPzogYW55IH0+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZG5kRHJvcEluWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogRG5kRHJvcEV2ZW50OyB0YXJnZXRMaXN0OiBUZXN0Q2FzZVN0ZXBDb25maWdbXSB9PigpO1xuICAvKiogRW1pdCB3aGVuIG1vcmUgZGF0YSBwcm9maWxlcyBuZWVkIHRvIGJlIGxvYWRlZCAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBkYXRhIHByb2ZpbGUgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaERhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgdXBkYXRlZCAoQXBwbHkgYnV0dG9uIGNsaWNrZWQgaW4gZWRpdCBtb2RlKSAqL1xuICBAT3V0cHV0KCkgc3RlcFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcFN0ZXBDb25maWc+KCk7XG4gIC8qKiBSZS1lbWl0IHdoZW4gYSBuZXN0ZWQgc3RlcCAoZS5nLiBub3JtYWwtc3RlcCkgZW1pdHMgY2xpY2tBY3Rpb24gKGUuZy4gZWxlbWVudC9sYWJlbCBjbGljayBmb3IgcG9wdXApICovXG4gIEBPdXRwdXQoKSBjbGlja0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnIH0+KCk7XG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBCZXR3ZWVuQ2xpY2sgZnJvbSBuZXN0ZWQgcmVuZGVyZXJzICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwQmV0d2VlbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7c3RlcDogVGVzdENhc2VTdGVwQ29uZmlnLCBpbmRleDogbnVtYmVyLCBwb3NpdGlvbjogJ0FCT1ZFJyB8ICdCRUxPVyd9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uRG5kRHJvcChldmVudDogRG5kRHJvcEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kbmREcm9wSW5ab25lLmVtaXQoeyBldmVudCwgdGFyZ2V0TGlzdDogdGhpcy5uZXN0ZWRTdGVwcyB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0IGNsaWNrQWN0aW9uIHdoZW4gdXNlciBjbGlja3Mgb24gbG9vcCBkaXNwbGF5IGJhZGdlcyAoZWxlbWVudCwgdGVzdF9kYXRhLCBldGMuKSBzbyBwYXJlbnQgY2FuIG9wZW4gZWRpdCBtb2RhbHMgKi9cbiAgb25Mb29wQWN0aW9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrQWN0aW9uLmVtaXQoeyBldmVudCwgc3RlcDogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICAvKiogRXhwb3NlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlIChBbmd1bGFyIHRlbXBsYXRlcyBkb24ndCBoYXZlIFN0cmluZy9OdW1iZXIpICovXG4gIHJlYWRvbmx5IHN0cmluZ0ZuID0gU3RyaW5nO1xuICByZWFkb25seSBudW1iZXJGbiA9IE51bWJlcjtcblxuICAvKiogV2hlbiB0cnVlLCBoZWFkZXIgc2hvd3MgaW5saW5lIGVkaXQgZm9ybSAoZHJvcGRvd25zLCBpbnB1dHMsIENhbmNlbC9BcHBseSkgKi9cbiAgaXNFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZm9yIGVkaXQgbW9kZTsgYm91bmQgdG8gY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHBhdHRlcm4gYXMgZGVmYXVsdCBzdG9yaWVzKSAqL1xuICBlZGl0Rm9ybSE6IEZvcm1Hcm91cDtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIChzdGFibGUgcmVmcyB0byBhdm9pZCBjaGFuZ2UtZGV0ZWN0aW9uIGxvb3BzKSAqL1xuICBmb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIHN0YXJ0U3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgZW5kU3RlcFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgY29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICAvKiogV2hpbGUgbG9vcDogY29uZmlnIGZvciBhdXRvY29tcGxldGUgb3B0aW9ucyAoV0hJTEVfQ09ORElUSU9OIG9ubHkpICovXG4gIHdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTZWxlY3RlZCB0ZW1wbGF0ZSBmb3Igd2hpbGUgY29uZGl0aW9uIChzYW1lIHBhdHRlcm4gYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIHNlbGVjdGVkVGVtcGxhdGU6IGFueSA9IG51bGw7XG4gIC8qKiBUZW1wbGF0ZSB2YXJpYWJsZXMgZm9yIHdoaWxlIGNvbmRpdGlvbiAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgLyoqIEZvcm0gZ3JvdXAgZm9yIHRlbXBsYXRlIHZhcmlhYmxlcyAqL1xuICB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIERlZmF1bHQgbWF4IGZvciBMb29wIFN0YXJ0IC8gRW5kIHdoZW4gbm8gcHJvZmlsZSBzZWxlY3RlZCAob3B0aW9ucyAxLi4xMCkgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT09QX09QVElPTlNfTUFYID0gMTA7XG5cbiAgQFZpZXdDaGlsZCgndmlld0RldGFpbHNUcmlnZ2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdEZXRhaWxzVHJpZ2dlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKiBMb2NhbCBjb3B5IG9mIHZhbHVlcyB3aGlsZSBlZGl0aW5nIChmb3IgQ2FuY2VsIHJldmVydCkgKi9cbiAgcHJpdmF0ZSBlZGl0U25hcHNob3Q6IHtcbiAgICB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gICAgc3RhcnRTdGVwPzogbnVtYmVyO1xuICAgIGVuZFN0ZXA/OiBudW1iZXI7XG4gICAgY29uZGl0aW9uPzogc3RyaW5nO1xuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRUZW1wbGF0ZT86IGFueTtcbiAgICB0ZW1wbGF0ZVZhcmlhYmxlcz86IGFueVtdO1xuICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlPzogYW55O1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZDtcbiAgICAgIHRoaXMubG9vcFR5cGUgPSB0aGlzLmNvbmZpZy5sb29wVHlwZTtcbiAgICAgIHRoaXMuc3RlcE51bWJlciA9IHRoaXMuY29uZmlnLnN0ZXBOdW1iZXI7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuY29uZmlnLmNvbmRpdGlvbjtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHRoaXMuY29uZmlnLm1heEl0ZXJhdGlvbnM7XG4gICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRoaXMuY29uZmlnLnRlc3REYXRhUHJvZmlsZTtcbiAgICAgIHRoaXMuc3RhcnRTdGVwID0gdGhpcy5jb25maWcuc3RhcnRTdGVwO1xuICAgICAgdGhpcy5lbmRTdGVwID0gdGhpcy5jb25maWcuZW5kU3RlcDtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmNvbmZpZy5leHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZXhwYW5kZWQgOiB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkRWRpdEZvcm0oKTtcbiAgICB0aGlzLmJ1aWxkU2VsZWN0Q29uZmlncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb25maWcnXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnNlbGVjdGVkIHx8IGZhbHNlO1xuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIEZPUiBsb29wOiB3aGVuIHN0ZXAgY29uZmlnIGhhcyBmb3JMb29wVGVzdERhdGFJZC9mb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgsIHN5bmMgZm9ybSBhbmQgcmVmcmVzaCBzZWxlY3QgY29uZmlncyBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Rm9ybSkgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhUHJvZmlsZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgICAvLyBXaGVuIGRhdGEgcHJvZmlsZXMgbG9hZCBpbiBlZGl0IG1vZGUsIHN5bmMgZm9ybSB2YWx1ZSBzbyBkcm9wZG93biBzaG93cyBzZWxlY3RlZCAoZm9yTG9vcFRlc3REYXRhSWQgb3IgdGVzdERhdGFQcm9maWxlKVxuICAgICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgICAgIGlmIChjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgdGhpcy50ZXN0RGF0YVByb2ZpbGUpIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBvcHRpb25zIGxvYWQsIHBvcHVsYXRlIGNvbmRpdGlvbiArIHRlbXBsYXRlIGZyb20gbmF0dXJhbFRleHRBY3Rpb25JZCAoc2FtZSBhcyBjb25kaXRpb24tc3RlcClcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMuZWRpdEZvcm0gJiYgdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVyaXZlIGZvck9wdGlvblR5cGUgZm9yIEZPUiBsb29wIGZyb20gY29uZmlnIHNvIGRyb3Bkb3duIHNob3dzIGV4aXN0aW5nIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGhhc1Rlc3REYXRhSWQgPSBjZmc/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZCAhPSBudWxsO1xuICAgIGlmIChoYXNUZXN0RGF0YUlkIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSByZXR1cm4gJ3Rlc3QtZGF0YSc7XG4gICAgY29uc3QgaGFzRml4ZWQgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wRW5kSW5kZXggIT0gbnVsbFxuICAgICAgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXggIT0gbnVsbCB8fCBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXggIT0gbnVsbDtcbiAgICBpZiAodGhpcy5zdGFydFN0ZXAgIT0gbnVsbCB8fCB0aGlzLmVuZFN0ZXAgIT0gbnVsbCB8fCBoYXNGaXhlZCkgcmV0dXJuICdmaXhlZCc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGVzdCBEYXRhIFByb2ZpbGUgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wVGVzdERhdGFJZCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLiBVc2Ugb3B0aW9uLmlkIHdoZW4gb3B0aW9ucyBsb2FkZWQgc28gdHlwZSBtYXRjaGVzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBnZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgaWRGcm9tQ29uZmlnID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wVGVzdERhdGFJZCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICAvLyBXaGVuIHdlIGhhdmUgb3B0aW9ucywgcmVzb2x2ZSBieSBpZCBzbyBmb3JtIHZhbHVlIG1hdGNoZXMgb3B0aW9uLmlkIChzdHJpY3QgZXF1YWxpdHkgaW4gZHluYW1pYy1zZWxlY3QpXG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLmlkID09PSBpZEZyb21Db25maWcgfHwgU3RyaW5nKG8uaWQpID09PSBTdHJpbmcoaWRGcm9tQ29uZmlnKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgICAgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVzdERhdGFQcm9maWxlID8/ICcnO1xuICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgICAgbyA9PiBvLm5hbWUgPT09IHZhbHVlIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaC5pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICAgIGlmIChpZEZyb21Db25maWcgIT0gbnVsbCkgcmV0dXJuIGlkRnJvbUNvbmZpZyBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgcmV0dXJuICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJykgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICB9XG5cbiAgLyoqIExvb3AgU3RhcnQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIHN0YXJ0U3RlcCAqL1xuICBwcml2YXRlIGdldExvb3BTdGFydEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFN0YXJ0SW5kZXggPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnN0YXJ0SW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBMb29wIEVuZCBkcm9wZG93biB2YWx1ZTogcHJlZmVyIGZvckxvb3BFbmRJbmRleCBmcm9tIGNvbmZpZyAob3IgZGF0YU1hcEpzb24vZGF0YU1hcEJlYW4pLCBlbHNlIGVuZFN0ZXAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wRW5kRm9ybVZhbHVlKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIHJldHVybiB0aGlzLmVuZFN0ZXAgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyBGb3Igd2hpbGUgbG9vcDogaWYgY29uZmlnIGhhcyBuYXR1cmFsVGV4dEFjdGlvbklkIGFuZCBvcHRpb25zIGFyZSBhbHJlYWR5IGxvYWRlZCwgdXNlIHRoZW0gZm9yIGluaXRpYWwgY29uZGl0aW9uICsgdGVtcGxhdGVcbiAgICBsZXQgY29uZGl0aW9uVmFsdWUgPSB0aGlzLmNvbmRpdGlvbiA/PyAnJztcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgY29uc3QgcG9wdWxhdGVkID0gdGhpcy5wb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTtcbiAgICAgIGlmIChwb3B1bGF0ZWQ/LmNvbmRpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNvbmRpdGlvblZhbHVlID0gcG9wdWxhdGVkLmNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIEZPUiBsb29wOiBpbml0aWFsIGZvcm0gdmFsdWVzIHNvIGRyb3Bkb3ducyBzaG93IGV4aXN0aW5nIHNlbGVjdGlvbiAoZm9yT3B0aW9uVHlwZSwgZm9yTG9vcFRlc3REYXRhSWQvdGVzdERhdGFQcm9maWxlLCBmb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgpXG4gICAgY29uc3QgZm9yT3B0aW9uVHlwZSA9IHRoaXMuZ2V0Rm9yT3B0aW9uVHlwZUZyb21Db25maWcoKTtcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVGb3JtVmFsdWUoKSA6ICh0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyk7XG4gICAgY29uc3QgbG9vcFN0YXJ0VmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiAodGhpcy5zdGFydFN0ZXAgPz8gbnVsbCk7XG4gICAgY29uc3QgbG9vcEVuZFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKSA6ICh0aGlzLmVuZFN0ZXAgPz8gbnVsbCk7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogW2Zvck9wdGlvblR5cGUgYXMgc3RyaW5nIHwgbnVsbF0sXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IFt0ZXN0RGF0YVByb2ZpbGVWYWx1ZV0sXG4gICAgICBzdGFydFN0ZXA6IFtsb29wU3RhcnRWYWx1ZSBhcyBudW1iZXIgfCBudWxsXSxcbiAgICAgIGVuZFN0ZXA6IFtsb29wRW5kVmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBjb25kaXRpb246IFtjb25kaXRpb25WYWx1ZV0sXG4gICAgICBtYXhJdGVyYXRpb25zOiBbdGhpcy5tYXhJdGVyYXRpb25zID8/IDVdLFxuICAgIH0pO1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlIGNvbmRpdGlvbiwgc2VsZWN0ZWRUZW1wbGF0ZSBhbmQgdGVtcGxhdGUgdmFyaWFibGVzIGZyb20gY29uZmlnLm5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBvcHRpb25zIGFyZSBhdmFpbGFibGUuXG4gICAqIFJldHVybnMgeyBjb25kaXRpb24gfSBpZiBhIG1hdGNoIHdhcyBmb3VuZCBzbyBidWlsZEVkaXRGb3JtIGNhbiBzZXQgaW5pdGlhbCBmb3JtIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBwb3B1bGF0ZVdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uSWQoKTogeyBjb25kaXRpb246IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG1hdGNoaW5nT3B0aW9uLm5hdHVyYWxUZXh0ID8/IG1hdGNoaW5nT3B0aW9uLm5hbWUgPz8gbWF0Y2hpbmdPcHRpb24udmFsdWUgPz8gJyc7XG4gICAgaWYgKCFuYXR1cmFsVGV4dCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZGl0aW9uID0gbmF0dXJhbFRleHQ7XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHsgY29uZGl0aW9uOiBuYXR1cmFsVGV4dCB9O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgY29uZGl0aW9uICsgdGVtcGxhdGUgc3RhdGUgd2hlbiBuYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGxvYWQgb3IgY29uZmlnIGNoYW5nZXMgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApLiAqL1xuICBwcml2YXRlIHJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdXaXRoSWQgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKCFjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgfHwgIXRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICApO1xuICAgIGlmICghbWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmIChuYXR1cmFsVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICAgIGlmICghY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAhPT0gbmF0dXJhbFRleHQpIHtcbiAgICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShuYXR1cmFsVGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIH1cbiAgICBjb25zdCBmdWxsVGVtcGxhdGUgPSBtYXRjaGluZ09wdGlvbi50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZT8udmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBzZWxlY3QgY29uZmlncyBvbmNlIChzYW1lIG9wdGlvbiBzaGFwZSBhcyBkZWZhdWx0IHN0b3JpZXM6IGlkICsgbmFtZSk7IEZPUiBsb29wIGFkZHMgc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgKi9cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5nZXRMb29wU3RlcE9wdGlvbnMoKS5tYXAoKG4pID0+ICh7XG4gICAgICBpZDogbixcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgbmFtZTogU3RyaW5nKG4pLFxuICAgICAgbGFiZWw6IFN0cmluZyhuKSxcbiAgICB9KSk7XG4gICAgdGhpcy5mb3JPcHRpb25UeXBlU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZm9yT3B0aW9uVHlwZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICd0ZXN0LWRhdGEnLCB2YWx1ZTogJ3Rlc3QtZGF0YScsIG5hbWU6ICdUZXN0IERhdGEgUHJvZmlsZScsIGxhYmVsOiAnVGVzdCBEYXRhIFByb2ZpbGUnIH0sXG4gICAgICAgIHsgaWQ6ICdmaXhlZCcsIHZhbHVlOiAnZml4ZWQnLCBuYW1lOiAnRml4ZWQgY291bnQnLCBsYWJlbDogJ0ZpeGVkIGNvdW50JyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcFN0YXJ0Rm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiBudWxsO1xuICAgIHRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnc3RhcnRTdGVwJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTG9vcCBTdGFydCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgICAuLi4oc3RhcnRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IHN0YXJ0VmFsIH0pLFxuICAgIH07XG4gICAgdGhpcy5lbmRTdGVwU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnZW5kU3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgRW5kJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihlbmRWYWwgIT0gbnVsbCAmJiB7IHNlbGVjdGVkVmFsdWU6IGVuZFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGNvbmRpdGlvbiBzZWxlY3QgY29uZmlnIHdpdGggbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb3B0aW9ucyAobGVnYWN5IG1hdC1zZWxlY3QpICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdLFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVXaGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGxvb3A6IG9ubHkgc2hvdyBvcHRpb25zIHdpdGggc3RlcEFjdGlvblR5cGUgPT09IFwiV0hJTEVfTE9PUFwiICovXG4gIHByaXZhdGUgdXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmlsdGVyKChvcHRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbi5zdGVwQWN0aW9uVHlwZSA9PT0gJ1dISUxFX0xPT1AnO1xuICAgIH0pO1xuICAgIHRoaXMud2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdjb25kaXRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29uZGl0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBvcHRpb25zOiBmaWx0ZXJlZE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgd2hpbGUgY29uZGl0aW9uIGF1dG9jb21wbGV0ZSAoV0hJTEVfTE9PUCBuYXR1cmFsIHRleHQgYWN0aW9ucyBvbmx5KSAqL1xuICBnZXQgd2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zKCk6IChDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pW10ge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnPy5vcHRpb25zID8/IFtdO1xuICAgIHJldHVybiBvcHRzLm1hcCgob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gb3B0aW9uLm5hdHVyYWxUZXh0ID8/IG9wdGlvbi5uYW1lID8/IG9wdGlvbi52YWx1ZSA/PyBTdHJpbmcob3B0aW9uLmlkID8/ICcnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgbGFiZWw6IG5hdHVyYWxUZXh0LFxuICAgICAgICB0ZW1wbGF0ZTogb3B0aW9uLnRlbXBsYXRlIHx8IG9wdGlvbixcbiAgICAgIH0gYXMgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIERpc3BsYXkgdmFsdWUgZm9yIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGU6IHNob3cgbmF0dXJhbCB0ZXh0IGZyb20gb3B0aW9uIG1hdGNoaW5nIG5hdHVyYWxUZXh0QWN0aW9uSWQgd2hlbiBhdmFpbGFibGUgKGluY2x1ZGluZyB3aGVuIGZvcm0gaXMgZW1wdHkgb24gb3BlbiksIGVsc2UgZm9ybSB2YWx1ZS4gV2hlbiB1c2VyIGhhcyBzZWxlY3RlZCBhIGRpZmZlcmVudCBvcHRpb24sIHNob3cgZm9ybSB2YWx1ZS4gKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uRGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGlzRm9ybUh0bWwgPSBmb3JtVmFsdWUgJiYgKFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc8JykgfHwgU3RyaW5nKGZvcm1WYWx1ZSkuaW5jbHVkZXMoJz4nKSk7XG4gICAgaWYgKGNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgIChvcHRpb246IGFueSkgPT4gU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyhjb25maWdXaXRoSWQubmF0dXJhbFRleHRBY3Rpb25JZClcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgICAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgICAgICBjb25zdCBuYXR1cmFsVGV4dFN0ciA9IFN0cmluZyhuYXR1cmFsVGV4dCk7XG4gICAgICAgICAgLy8gU2hvdyBzZWxlY3RlZDogd2hlbiBmb3JtIGlzIGVtcHR5IChpbml0aWFsIG9wZW4pLCBvciBmb3JtIG1hdGNoZXMgdGhpcyBvcHRpb24sIG9yIGZvcm0gaGFzIEhUTUwuIE9ubHkgdXNlIGZvcm0gdmFsdWUgd2hlbiB1c2VyIHBpY2tlZCBhIGRpZmZlcmVudCBvcHRpb24uXG4gICAgICAgICAgaWYgKCFmb3JtVmFsdWUgfHwgZm9ybVZhbHVlID09PSBuYXR1cmFsVGV4dFN0ciB8fCBpc0Zvcm1IdG1sKSByZXR1cm4gbmF0dXJhbFRleHRTdHI7XG4gICAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNGb3JtSHRtbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBmb3JtVmFsdWU7XG4gIH1cblxuICBvbkNvbmRpdGlvblNlbGVjdChvcHRpb246IENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm0/LmdldCgnY29uZGl0aW9uJyk/LnNldFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IG9wdGlvbi50ZW1wbGF0ZTtcbiAgICBsZXQgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdUZW1wbGF0ZTtcbiAgICBpZiAoIWZ1bGxUZW1wbGF0ZSB8fCAhZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgICAob3B0OiBhbnkpID0+IG9wdC5uYXR1cmFsVGV4dCA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC5uYW1lID09PSBvcHRpb24udmFsdWUgfHwgb3B0LnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIH1cbiAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIC8vIEF1dG8tb3BlbiBFZGl0IEluIGRlcHRoIHdoZW4gdXNlciBzZWxlY3RzIGEgY29uZGl0aW9uIGZyb20gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAvLyBQYXNzIGZ1bGxUZW1wbGF0ZSBzbyB0aGUgbW9kYWwgc2hvd3MgdGhlIG5ld2x5IHNlbGVjdGVkIHRlbXBsYXRlLCBub3QgdGhlIG9sZCBzdGVwIHRlbXBsYXRlLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVkaXRJbkRlcHRoKGZ1bGxUZW1wbGF0ZSksIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0pIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgY29uc3QgY29uZmlnV2l0aERhdGEgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgZXhpc3RpbmdEYXRhID0gY29uZmlnV2l0aERhdGEudGVtcGxhdGVWYXJpYWJsZXNEYXRhIHx8IHt9O1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAoZXhpc3RpbmdEYXRhLmhhc093blByb3BlcnR5KHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGV4aXN0aW5nRGF0YVt2YXJpYWJsZS5uYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1xuICAgICAgICAgID8gKHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDEpXG4gICAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICcxJztcbiAgICAgIH1cbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmFkZENvbnRyb2wodmFyaWFibGUubmFtZSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUodmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiB2YXJpYWJsZS5uYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgd2l0aCBjdXJyZW50IG9wdGlvbnMgYW5kIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BUZXN0RGF0YUlkKS4gRW5zdXJlIHNlbGVjdGVkIGlkIGlzIGluIG9wdGlvbnMgc28gbWF0LXNlbGVjdCBjYW4gZGlzcGxheSBpdC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JMb29wVGVzdERhdGFJZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiB1bmRlZmluZWQ7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIHByZXNlbGVjdGVkIGlkIGJ1dCBpdCdzIG5vdCBpbiB0aGUgY3VycmVudCBvcHRpb25zIGxpc3QgKGUuZy4gb3B0aW9ucyBub3QgbG9hZGVkIHlldCksIGFkZCBhIHBsYWNlaG9sZGVyIG9wdGlvbiBzbyB0aGUgZHJvcGRvd24gY2FuIHNob3cgdGhlIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiBmb3JMb29wVGVzdERhdGFJZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpZFN0ciA9IFN0cmluZyhmb3JMb29wVGVzdERhdGFJZCk7XG4gICAgICBjb25zdCBhbHJlYWR5SW5MaXN0ID0gb3B0aW9ucy5zb21lKChvOiBTZWxlY3RPcHRpb24pID0+IFN0cmluZyhvLmlkID8/IG8udmFsdWUpID09PSBpZFN0cik7XG4gICAgICBpZiAoIWFscmVhZHlJbkxpc3QpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB0aGlzLnRlc3REYXRhUHJvZmlsZSB8fCAnU2VsZWN0ZWQgcHJvZmlsZSc7XG4gICAgICAgIG9wdGlvbnMgPSBbeyBpZDogZm9yTG9vcFRlc3REYXRhSWQsIHZhbHVlOiBmb3JMb29wVGVzdERhdGFJZCwgbmFtZTogZGlzcGxheU5hbWUsIGxhYmVsOiBkaXNwbGF5TmFtZSB9LCAuLi5vcHRpb25zXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdUZXN0ZGF0YXByb2ZpbGUnLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZURhdGFQcm9maWxlcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdEYXRhUHJvZmlsZXMsXG4gICAgICBvcHRpb25zLFxuICAgICAgLi4uKHNlbGVjdGVkVmFsICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRWYWwgIT09ICcnICYmIHsgc2VsZWN0ZWRWYWx1ZTogc2VsZWN0ZWRWYWwgfSksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMub25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeSB8fCAnJyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIExvb3AgU3RhcnQgLyBMb29wIEVuZCBzZWxlY3QgY29uZmlncyB3aXRoIHNlbGVjdGVkVmFsdWUgKGZvckxvb3BTdGFydEluZGV4LCBmb3JMb29wRW5kSW5kZXgpIHNvIGRyb3Bkb3ducyBzaG93IHNlbGVjdGVkICovXG4gIHByaXZhdGUgdXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBzdGVwT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLmdldExvb3BTdGVwT3B0aW9ucygpLm1hcCgobikgPT4gKHtcbiAgICAgIGlkOiBuLFxuICAgICAgdmFsdWU6IG4sXG4gICAgICBuYW1lOiBTdHJpbmcobiksXG4gICAgICBsYWJlbDogU3RyaW5nKG4pLFxuICAgIH0pKTtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuc3RhcnRTdGVwU2VsZWN0Q29uZmlnLFxuICAgICAgb3B0aW9uczogc3RlcE9wdGlvbnMubWFwKChvKSA9PiAoeyAuLi5vIH0pKSxcbiAgICAgIC4uLihzdGFydFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogc3RhcnRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmVuZFN0ZXBTZWxlY3RDb25maWcsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgICAgLi4uKGVuZFZhbCAhPSBudWxsICYmIHsgc2VsZWN0ZWRWYWx1ZTogZW5kVmFsIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVXBkYXRlIGFsbCBGT1IgbG9vcCBzZWxlY3QgY29uZmlncyAodGVzdERhdGFQcm9maWxlLCBzdGFydFN0ZXAsIGVuZFN0ZXApIHdpdGggc2VsZWN0ZWRWYWx1ZSBmcm9tIHN0ZXAgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWQgKi9cbiAgcHJpdmF0ZSB1cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb3BUeXBlICE9PSAnZm9yJykgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlVGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKCk7XG4gICAgdGhpcy51cGRhdGVTdGFydEVuZFN0ZXBTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IERhdGFQcm9maWxlT3B0aW9uW10gdG8gU2VsZWN0T3B0aW9uW10gKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVByb2ZpbGVPcHRpb25zVG9TZWxlY3RPcHRpb25zKG9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10pOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgIHZhbHVlOiBvcHRpb24uaWQsXG4gICAgICBuYW1lOiBvcHRpb24ubmFtZSxcbiAgICAgIGxhYmVsOiBvcHRpb24ubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBEYXRhIGxlbmd0aCAoTikgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZTsgMCBpZiBub25lIHNlbGVjdGVkIG9yIG5vdCBmb3VuZC4gKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFByb2ZpbGVEYXRhTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgY29uc3QgcHJvZmlsZUlkID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gKHRoaXMuY29uZmlnIGFzIGFueSk/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8udGVzdERhdGFJZDtcbiAgICBpZiAocHJvZmlsZUlkID09IG51bGwgfHwgIXRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHJldHVybiAwO1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgIChvOiBEYXRhUHJvZmlsZU9wdGlvbikgPT4gU3RyaW5nKG8uaWQpID09PSBTdHJpbmcocHJvZmlsZUlkKSB8fCBvLmlkID09PSBwcm9maWxlSWRcbiAgICApO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiAwO1xuICAgIGNvbnN0IGxlbiA9IChtYXRjaC5kYXRhICYmIEFycmF5LmlzQXJyYXkobWF0Y2guZGF0YSkgPyBtYXRjaC5kYXRhLmxlbmd0aCA6IDApIHx8IChtYXRjaC5kYXRhTGVuZ3RoID8/IDApO1xuICAgIHJldHVybiB0eXBlb2YgbGVuID09PSAnbnVtYmVyJyA/IGxlbiA6IDA7XG4gIH1cblxuICAvKiogTG9vcCBTdGFydC9FbmQgb3B0aW9uczogMSB0byBOIGJhc2VkIG9uIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSdzIGRhdGEgYXJyYXkgbGVuZ3RoOyBmYWxscyBiYWNrIHRvIDEuLjEwIGlmIG5vIHByb2ZpbGUuICovXG4gIGdldExvb3BTdGVwT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgTiA9IHRoaXMuZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpO1xuICAgIGNvbnN0IG1heCA9IE4gPiAwID8gTiA6IFRlc3RDYXNlTG9vcFN0ZXBDb21wb25lbnQuREVGQVVMVF9MT09QX09QVElPTlNfTUFYO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgZGF0YSBwcm9maWxlIHNlbGVjdGlvbjogdXBkYXRlIGRpc3BsYXksIGNsYW1wIHN0YXJ0L2VuZCB0byBuZXcgcHJvZmlsZSByYW5nZSwgcmVmcmVzaCBzdGFydC9lbmQgZHJvcGRvd25zLiAqL1xuICBwcml2YXRlIG9uRGF0YVByb2ZpbGVDaGFuZ2UocHJvZmlsZUlkOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVGVzdERhdGFQcm9maWxlQ2hhbmdlKHByb2ZpbGVJZCk7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgY29uc3QgTiA9IHRoaXMuZ2V0U2VsZWN0ZWRQcm9maWxlRGF0YUxlbmd0aCgpO1xuICAgIGlmIChOID09PSAwKSByZXR1cm47XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0TG9vcFN0ZXBPcHRpb25zKCk7XG4gICAgY29uc3QgbWF4VmFsID0gb3B0aW9ucy5sZW5ndGggPiAwID8gb3B0aW9uc1tvcHRpb25zLmxlbmd0aCAtIDFdIDogMTtcbiAgICBsZXQgc3RhcnRWYWwgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ3N0YXJ0U3RlcCcpPy52YWx1ZSA/PyB0aGlzLnN0YXJ0U3RlcDtcbiAgICBsZXQgZW5kVmFsID0gdGhpcy5lZGl0Rm9ybT8uZ2V0KCdlbmRTdGVwJyk/LnZhbHVlID8/IHRoaXMuZW5kU3RlcDtcbiAgICBpZiAoc3RhcnRWYWwgIT0gbnVsbCAmJiBzdGFydFZhbCA+IG1heFZhbCkgc3RhcnRWYWwgPSBtYXhWYWw7XG4gICAgaWYgKGVuZFZhbCAhPSBudWxsICYmIGVuZFZhbCA+IG1heFZhbCkgZW5kVmFsID0gbWF4VmFsO1xuICAgIGlmIChzdGFydFZhbCAhPSBudWxsICYmIGVuZFZhbCAhPSBudWxsICYmIHN0YXJ0VmFsID4gZW5kVmFsKSBlbmRWYWwgPSBzdGFydFZhbDtcbiAgICBpZiAodGhpcy5lZGl0Rm9ybSkge1xuICAgICAgaWYgKHN0YXJ0VmFsICE9IG51bGwpIHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGFydFN0ZXAnKT8uc2V0VmFsdWUoc3RhcnRWYWwpO1xuICAgICAgaWYgKGVuZFZhbCAhPSBudWxsKSB0aGlzLmVkaXRGb3JtLmdldCgnZW5kU3RlcCcpPy5zZXRWYWx1ZShlbmRWYWwpO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHN0YXJ0VmFsID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZFN0ZXAgPSBlbmRWYWwgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmRTdGVwU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBzZWFyY2ggZm9yIGRhdGEgcHJvZmlsZXMgKi9cbiAgcHJpdmF0ZSBvblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSk7XG4gIH1cblxuICAvKiogSGFuZGxlIGxvYWQgbW9yZSBkYXRhIHByb2ZpbGVzICovXG4gIHByaXZhdGUgb25Mb2FkTW9yZURhdGFQcm9maWxlcyhxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIG9uRWRpdEZvcm1GaWVsZENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXRMb29wVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QJyA6ICdXSElMRSBMT09QJztcbiAgfVxuXG4gIGlzV2hpbGVMb29wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnO1xuICB9XG5cbiAgaXNGb3JMb29wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJztcbiAgfVxuXG4gIGdldFN0YXJ0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnU1RBUlQgRk9SJyA6ICdTVEFSVCBXSElMRSc7XG4gIH1cblxuICBnZXRFbmRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/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/PyAxfWA7XG4gICAgLy8gSWYgc3RhcnQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJTdGFydFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJTdGFydFwiXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuICdTdGFydCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KHN0YXJ0KTtcbiAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gYFN0YXJ0OiAke25hbWV9YCA6IGBTdGFydDogJHtzdGFydH1gO1xuICB9XG5cbiAgZ2V0RW5kU3RlcExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXREaXNwbGF5RW5kSW5kZXgoKTtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLm5lc3RlZFN0ZXBzW3RoaXMubmVzdGVkU3RlcHMubGVuZ3RoIC0gMV0/LnN0ZXBOdW1iZXIgPz8gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYEVuZDogJHtkZWZhdWx0RW5kfWA7XG4gICAgfVxuICAgIC8vIElmIGVuZCBpcyAtMSwgdXNlciBzZWxlY3RlZCBcIkVuZFwiIG9wdGlvbiwganVzdCByZXR1cm4gXCJFbmRcIlxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJ0VuZCc7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGF0YVJvd05hbWVGb3JPbmVCYXNlZEluZGV4KGVuZCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBFbmQ6ICR7bmFtZX1gIDogYEVuZDogJHtlbmR9YDtcbiAgfVxuXG4gIGdldFRlc3REYXRhUHJvZmlsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICBpZiAobmFtZSkgcmV0dXJuIGBUZXN0IERhdGEgcHJvZmlsZTogJHtuYW1lfWA7XG4gICAgcmV0dXJuICdUZXN0IERhdGEgcHJvZmlsZSc7XG4gIH1cblxuICAvKiogQ29tYmluZWQgZGlzcGxheSBmb3IgZm9yIGxvb3Agd2l0aCBIVE1MIGJhZGdlcyAtIHN1cHBvcnRzIHRlc3RfZGF0YSBiYWRnZXMgbGlrZSBjb25kaXRpb24gc3RlcDsgZGF0YS1rZXkvZGF0YS1ldmVudC1rZXkgZW5hYmxlIGNsaWNrLXRvLWVkaXQgKi9cbiAgZ2V0Rm9yTG9vcERpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKGNmZz8uZm9yTG9vcERpc3BsYXlIdG1sKSByZXR1cm4gY2ZnLmZvckxvb3BEaXNwbGF5SHRtbDtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNUZXN0RGF0YVByb2ZpbGUoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheVRlc3REYXRhUHJvZmlsZU5hbWUoKTtcbiAgICAgIHBhcnRzLnB1c2goYFRlc3QgRGF0YSBwcm9maWxlOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwidGVzdERhdGFQcm9maWxlXCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwobmFtZSl9PC9zcGFuPmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTdGFydFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldFN0YXJ0U3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXlN0YXJ0OlxccyovLCAnJyk7XG4gICAgICBwYXJ0cy5wdXNoKGBTdGFydDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BTdGFydEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRW5kVmFsdWUoKSkge1xuICAgICAgY29uc3QgZnVsbCA9IHRoaXMuZ2V0RW5kU3RlcExhYmVsKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZ1bGwucmVwbGFjZSgvXkVuZDpcXHMqLywgJycpO1xuICAgICAgcGFydHMucHVzaChgRW5kOiA8c3BhbiBkYXRhLWtleT1cInRlc3QtZGF0YVwiIGRhdGEtZXZlbnQta2V5PVwiZm9yTG9vcEVuZEluZGV4XCIgY2xhc3M9XCJ0ZXN0X2RhdGFcIj4ke3RoaXMuZXNjYXBlRm9yTG9vcEh0bWwodmFsdWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUZvckxvb3BIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8qKiBGdWxsIGRpc3BsYXkgZm9yIHdoaWxlIGxvb3A6IFwiV2hpbGUgZWxlbWVudCBcIi5zZWxlY3RvclwiIGV4aXN0cyAobWF4IE4gaXRlcmF0aW9ucylcIiAtIHN1cHBvcnRzIEhUTUwgYmFkZ2VzIHZpYSBpbm5lckhUTUwgKi9cbiAgZ2V0Q29uZGl0aW9uRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmNvbmRpdGlvbiB8fCAnZWxlbWVudCBcIi5ub3RpZmljYXRpb24tYmFkZ2VcIiBleGlzdHMnO1xuICAgIGNvbnN0IHdpdGhXaGlsZSA9IGJhc2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCd3aGlsZSAnKSA/IGJhc2UgOiBgV2hpbGUgJHtiYXNlfWA7XG4gICAgY29uc3QgaGFzTWF4SXRlcmF0aW9ucyA9IC9cXChtYXhcXHMrXFxkK1xccytpdGVyYXRpb25zXFwpL2kudGVzdCh3aXRoV2hpbGUpO1xuICAgIGlmICghaGFzTWF4SXRlcmF0aW9ucyAmJiB0aGlzLm1heEl0ZXJhdGlvbnMgIT0gbnVsbCAmJiB0aGlzLm1heEl0ZXJhdGlvbnMgPiAwKSB7XG4gICAgICByZXR1cm4gYCR7d2l0aFdoaWxlfSAobWF4ICR7dGhpcy5tYXhJdGVyYXRpb25zfSBpdGVyYXRpb25zKWA7XG4gICAgfVxuICAgIHJldHVybiB3aXRoV2hpbGU7XG4gIH1cblxuICBvblRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzp0aGlzLmNvbmZpZywgZXhwYW5kZWQ6dGhpcy5leHBhbmRlZH0pO1xuICB9XG5cbiAgb25UZXN0RGF0YVByb2ZpbGVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdmFsdWU7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblN0YXJ0U3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXJ0U3RlcENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uRW5kU3RlcENoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbmRTdGVwID0gdmFsdWU7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Db25kaXRpb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29uZGl0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5jb25kaXRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbk1heEl0ZXJhdGlvbnNDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTmVzdGVkU3RlcENoYW5nZShzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5lc3RlZFN0ZXBDaGFuZ2UuZW1pdCh7IHN0ZXAsIGluZGV4IH0pO1xuICB9XG5cbiAgb25OZXN0ZWRUb2dnbGVFeHBhbmRlZChldmVudDogYm9vbGVhbiB8IHtjb25maWc6IFRlc3RDYXNlU3RlcENvbmZpZywgZXhwYW5kZWQ6IGJvb2xlYW59LCBzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgYm90aCBib29sZWFuIGFuZCBvYmplY3QgZm9ybWF0c1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnICYmIGV2ZW50ICE9PSBudWxsICYmICdleHBhbmRlZCcgaW4gZXZlbnQpIHtcbiAgICAgIC8vIE9iamVjdCBmb3JtYXQgZnJvbSBzdGVwLWdyb3VwOiB7Y29uZmlnLCBleHBhbmRlZH1cbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudC5leHBhbmRlZDtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCdzIGNvbmZpZyBpcyBhIHN0ZXAtZ3JvdXAgKG5vdCB0aGUgY3VycmVudCBzdGVwKVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5lc3RlZCBzdGVwLWdyb3VwIGV2ZW50cyBidWJibGUgdXAgY29ycmVjdGx5IGV2ZW4gd2hlbiBjb25kaXRpb24gc3RlcCBpcyBpbnNpZGUgbG9vcCBzdGVwXG4gICAgICBpZiAodGhpcy5pc1N0ZXBHcm91cChldmVudC5jb25maWcpKSB7XG4gICAgICAgIC8vIFJlLWVtaXQgdGhlIHRvZ2dsZUV4cGFuZGVkIGV2ZW50IHdpdGggdGhlIG9iamVjdCBmb3JtYXQsIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICAvLyBDYXN0IHRvIHNhdGlzZnkgVHlwZVNjcmlwdCAtIHRoZSByZW5kZXJlciBhY2NlcHRzIFRlc3RDYXNlU3RlcENvbmZpZyB3aGljaCBpbmNsdWRlcyBTdGVwR3JvdXBDb25maWdcbiAgICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZC5lbWl0KHtjb25maWc6IGV2ZW50LmNvbmZpZyBhcyBhbnkgYXMgTG9vcFN0ZXBDb25maWcsIGV4cGFuZGVkOiBldmVudC5leHBhbmRlZH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb29sZWFuIGZvcm1hdCBmcm9tIG90aGVyIHN0ZXAgdHlwZXNcbiAgICAgIChzdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBldmVudCBhcyBib29sZWFuO1xuICAgIH1cbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbkFkZFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGFkZFN0ZXBGb3JMb29wIGZyb20gbmVzdGVkIGxvb3Agc28gTi1sZXZlbCBuZXN0aW5nIHdvcmtzIChlbXB0eS1zdGF0ZSBhZGQgc3RlcCkuICovXG4gIG9uQWRkU3RlcEZvckxvb3BGcm9tTmVzdGVkKGV2ZW50OiB7IGxvb3BTdGVwQ29uZmlnOiBMb29wU3RlcENvbmZpZyB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5sb29wU3RlcENvbmZpZykge1xuICAgICAgdGhpcy5hZGRTdGVwLmVtaXQoeyBsb29wU3RlcENvbmZpZzogZXZlbnQubG9vcFN0ZXBDb25maWcgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkU3RlcC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCBmcm9tIGVtcHR5LXN0YXRlIHBsdXMgb25seTsgc2FtZSBiZWhhdmlvdXIgYXMgYWRkLXN0ZXAtYmV0d2VlbiAocGFyZW50SWQgPSBsb29wIHN0ZXAgaWQsIHBvc2l0aW9uID0gcGFyZW50ICsgMSkuICovXG4gIG9uQWRkU3RlcEVtcHR5KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3RlcC5lbWl0KHsgbG9vcFN0ZXBDb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICB9XG5cbiAgb25EZWxldGVTdGVwKHBheWxvYWRPckluZGV4OiBhbnksIGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogcGF5bG9hZE9ySW5kZXg7XG4gICAgY29uc3QgcGF5bG9hZCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBwYXlsb2FkT3JJbmRleCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlbGV0ZVN0ZXAuZW1pdChpZHgpO1xuICAgIGlmIChwYXlsb2FkPy5zdGVwKSB0aGlzLmRlbGV0ZS5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgZWRpdCBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIG9wZW4gZWRpdCBtb2RhbCAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWRFZGl0KGV2ZW50OiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5zdGVwICE9IG51bGwpIHRoaXMuZWRpdC5lbWl0KGV2ZW50IGFzIGFueSk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBkdXBsaWNhdGUgZnJvbSBuZXN0ZWQgc3RlcCBzbyB0aGUgcG9ydGFsIGNhbiBkdXBsaWNhdGUgKHNhbWUgYXMgcm9vdCBsZXZlbCkuICovXG4gIG9uTmVzdGVkRHVwbGljYXRlKGV2ZW50OiBhbnksIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKGV2ZW50ICYmIGV2ZW50LnN0ZXAgIT0gbnVsbCkgPyBldmVudCA6IHsgc3RlcCB9IGFzIGFueSk7XG4gIH1cblxuICBpc05vcm1hbFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBOb3JtYWxTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2V2ZW50VHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzTG9vcFN0ZXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBMb29wU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdsb29wVHlwZScgaW4gc3RlcDtcbiAgfVxuXG4gIGlzQ29uZGl0aW9uU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIENvbmRpdGlvblN0ZXBDb25maWcge1xuICAgIHJldHVybiAnY29uZGl0aW9uJyBpbiBzdGVwICYmICdicmFuY2hlcycgaW4gc3RlcDtcbiAgfVxuXG4gIGlzU3RlcEdyb3VwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgU3RlcEdyb3VwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2dyb3VwTmFtZScgaW4gc3RlcDtcbiAgfVxuXG4gIG9uQWRkQnJhbmNoKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25EZWxldGVCcmFuY2goYnJhbmNoOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBjb25kaXRpb24gc3RlcHNcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBBZGQgYSBuZXcgYnJhbmNoIHRvIHRoZSBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBcbiAgICBpZiAoIW5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgbmV3QnJhbmNoOiBDb25kaXRpb25CcmFuY2ggPSB7XG4gICAgICB0eXBlOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdpZicgOiAnZWxzZScsXG4gICAgICBsYWJlbDogbmVzdGVkU3RlcC5icmFuY2hlcy5sZW5ndGggPT09IDAgPyAnSUYgVFJVRScgOiAnRUxTRScsIFxuICAgICAgc3RlcFR5cGU6IFN0ZXBUeXBlcy5DT05ESVRJT05fSUYsXG4gICAgICBuZXN0ZWRTdGVwczogW11cbiAgICB9O1xuICAgIG5lc3RlZFN0ZXAuYnJhbmNoZXMucHVzaChuZXdCcmFuY2gpO1xuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKG5lc3RlZFN0ZXA6IENvbmRpdGlvblN0ZXBDb25maWcsIGJyYW5jaDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gRGVsZXRlIGEgYnJhbmNoIGZyb20gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmIChuZXN0ZWRTdGVwLmJyYW5jaGVzKSB7XG4gICAgICBjb25zdCBicmFuY2hJbmRleCA9IG5lc3RlZFN0ZXAuYnJhbmNoZXMuaW5kZXhPZihicmFuY2gpO1xuICAgICAgaWYgKGJyYW5jaEluZGV4ID4gLTEpIHtcbiAgICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcy5zcGxpY2UoYnJhbmNoSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uTmVzdGVkU3RlcENoYW5nZShuZXN0ZWRTdGVwLCBpbmRleCk7XG4gIH1cblxuICBvbk9wZW5FeHRlcm5hbCgpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgLyoqIFN5bmMgRk9SIGxvb3AgZWRpdCBmb3JtIHNvIGRyb3Bkb3ducyBzaG93IGV4aXN0aW5nIGNvbmZpZyAoZm9yT3B0aW9uVHlwZSwgZm9yTG9vcFRlc3REYXRhSWQvdGVzdERhdGFQcm9maWxlLCBmb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXgpICovXG4gIHByaXZhdGUgc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtIHx8IHRoaXMubG9vcFR5cGUgIT09ICdmb3InKSByZXR1cm47XG4gICAgY29uc3QgdGVzdERhdGFWYWwgPSB0aGlzLmdldFRlc3REYXRhUHJvZmlsZUZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5nZXRMb29wU3RhcnRGb3JtVmFsdWUoKTtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmdldExvb3BFbmRGb3JtVmFsdWUoKTtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgZm9yT3B0aW9uVHlwZTogdGhpcy5nZXRGb3JPcHRpb25UeXBlRnJvbUNvbmZpZygpID8/IG51bGwsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRlc3REYXRhVmFsLFxuICAgICAgc3RhcnRTdGVwOiBzdGFydFZhbCxcbiAgICAgIGVuZFN0ZXA6IGVuZFZhbCxcbiAgICB9KTtcbiAgICAvLyBFeHBsaWNpdGx5IHNldCBlYWNoIGNvbnRyb2wgc28gbWF0LXNlbGVjdCBwaWNrcyB1cCB0aGUgdmFsdWUgKHBhdGNoVmFsdWUgY2FuIGJlIGlnbm9yZWQgYnkgY2hpbGQgaW4gc29tZSB0aW1pbmcgY2FzZXMpXG4gICAgY29uc3QgdGVzdERhdGFDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpO1xuICAgIGNvbnN0IHN0YXJ0Q3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGFydFN0ZXAnKTtcbiAgICBjb25zdCBlbmRDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2VuZFN0ZXAnKTtcbiAgICBpZiAodGVzdERhdGFDdHJsICYmIHRlc3REYXRhVmFsICE9PSB1bmRlZmluZWQgJiYgdGVzdERhdGFWYWwgIT09ICcnKSB0ZXN0RGF0YUN0cmwuc2V0VmFsdWUodGVzdERhdGFWYWwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoc3RhcnRDdHJsICYmIHN0YXJ0VmFsICE9IG51bGwpIHN0YXJ0Q3RybC5zZXRWYWx1ZShzdGFydFZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGlmIChlbmRDdHJsICYmIGVuZFZhbCAhPSBudWxsKSBlbmRDdHJsLnNldFZhbHVlKGVuZFZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHtcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwLFxuICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbixcbiAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyxcbiAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSxcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID8gWy4uLnRoaXMudGVtcGxhdGVWYXJpYWJsZXNdIDogW10sXG4gICAgICBjb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZTogdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gPyB7IC4uLnRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLnZhbHVlIH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAvLyBGT1IgbG9vcDogcmVmcmVzaCBzZWxlY3QgY29uZmlncyAoc28gVGVzdCBEYXRhIFByb2ZpbGUgb3B0aW9ucyBpbmNsdWRlIHNlbGVjdGVkIGlkIGlmIG5lZWRlZCkgdGhlbiBzeW5jIGZvcm0gc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWRcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgIHRoaXMudXBkYXRlRm9yTG9vcFNlbGVjdENvbmZpZ3NTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZTogdGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycsXG4gICAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAgPz8gbnVsbCxcbiAgICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwID8/IG51bGwsXG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICAvLyBXaGVuIG5hdHVyYWxUZXh0QWN0aW9uSWQgZXhpc3RzLCBwb3B1bGF0ZSBjb25kaXRpb24gYW5kIHNlbGVjdGVkIHRlbXBsYXRlIGZyb20gb3B0aW9ucyBzbyBhdXRvY29tcGxldGUgc2hvd3Mgc2VsZWN0ZWQgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICAgIGlmIChjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmRpdGlvbiB8fCBjb25maWdXaXRoSWQ/LnRlbXBsYXRlVmFyaWFibGVzRGF0YSkge1xuICAgICAgICAvLyBGYWxsYmFjazogbWF0Y2ggYnkgY29uZGl0aW9uIHRleHQgd2hlbiBuYXR1cmFsVGV4dEFjdGlvbklkIG5vdCBzZXRcbiAgICAgICAgY29uc3QgY29uZGl0aW9uU3RyID0gdGhpcy5jb25kaXRpb24gfHwgY29uZmlnV2l0aElkPy5jb25kaXRpb24gfHwgJyc7XG4gICAgICAgIGlmIChjb25kaXRpb25TdHIgJiYgKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBhcyBhbnlbXSkuZmluZChcbiAgICAgICAgICAgIChvcHQ6IGFueSkgPT4gKG9wdC5uYXR1cmFsVGV4dCB8fCBvcHQubmFtZSB8fCBvcHQudmFsdWUpID09PSBjb25kaXRpb25TdHJcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uPy50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICAgICAgICBpZiAoZnVsbFRlbXBsYXRlICYmIGZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICAgICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uID8/ICcnLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMgPz8gNSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lZGl0LmVtaXQoKTtcbiAgfVxuXG4gIG9uRWRpdEFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdi50ZXN0RGF0YVByb2ZpbGUgPz8gJyc7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB2LnN0YXJ0U3RlcCA/PyB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRTdGVwID0gdi5lbmRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHYuY29uZGl0aW9uID8/ICcnO1xuICAgIGNvbnN0IG1heFZhbCA9IHYubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0eXBlb2YgbWF4VmFsID09PSAnbnVtYmVyJyA/IG1heFZhbCA6IChtYXhWYWwgIT0gbnVsbCAmJiBtYXhWYWwgIT09ICcnID8gTnVtYmVyKG1heFZhbCkgOiB1bmRlZmluZWQpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSBvcHRpb24gdG8gZ2V0IGJvdGggSUQgYW5kIG5hbWVcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdGVzdERhdGFQcm9maWxlTmFtZTogc3RyaW5nID0gJyc7XG4gICAgXG4gICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbHVlICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBmb3JtIHZhbHVlIG1pZ2h0IGJlIElEIChudW1iZXIpIG9yIG5hbWUgKHN0cmluZylcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IE51bWJlcih0ZXN0RGF0YVByb2ZpbGVWYWx1ZSkgfHwgb3B0aW9uLm5hbWUgPT09IHRlc3REYXRhUHJvZmlsZVZhbHVlIHx8IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcodGVzdERhdGFQcm9maWxlVmFsdWUpXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkUHJvZmlsZSkge1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVJZCA9IHNlbGVjdGVkUHJvZmlsZS5pZDtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlTmFtZSA9IHNlbGVjdGVkUHJvZmlsZS5uYW1lO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRlc3REYXRhUHJvZmlsZU5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgdmFsdWUgYXMtaXMgKG1pZ2h0IGJlIElEIG9yIG5hbWUpXG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlVmFsdWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFdoaWxlIGxvb3A6IGJ1aWxkIHRlbXBsYXRlVmFyaWFibGVzRGF0YSBhbmQgbmF0dXJhbFRleHRBY3Rpb25JZCBmcm9tIHNlbGVjdGVkIHRlbXBsYXRlIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKVxuICAgIGxldCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE6IGFueTtcbiAgICBsZXQgbmF0dXJhbFRleHRBY3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXM/Lmxlbmd0aCkge1xuICAgICAgdGVtcGxhdGVWYXJpYWJsZXNEYXRhID0ge307XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGFbdmFyaWFibGUubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRlbXBsYXRlPy5pZCAhPSBudWxsKSB7XG4gICAgICAgIG5hdHVyYWxUZXh0QWN0aW9uSWQgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBuZXcgdmFsdWVzIChpbmNsdWRlIHRlc3REYXRhUHJvZmlsZUlkLCB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEsIG5hdHVyYWxUZXh0QWN0aW9uSWQgZm9yIHdoaWxlOyBmb3JMb29wVGVzdERhdGFJZCwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4IGZvciBmb3IpXG4gICAgY29uc3QgdXBkYXRlZENvbmZpZzogTG9vcFN0ZXBDb25maWcgJiB7IHRlc3REYXRhUHJvZmlsZUlkPzogc3RyaW5nIHwgbnVtYmVyOyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGE/OiBhbnk7IG5hdHVyYWxUZXh0QWN0aW9uSWQ/OiBudW1iZXIgfSA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHRlc3REYXRhUHJvZmlsZUlkOiB0ZXN0RGF0YVByb2ZpbGVJZCwgLy8gQWRkIElEIGZvciBBUEkgY2FsbFxuICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCxcbiAgICAgIGVuZFN0ZXA6IHRoaXMuZW5kU3RlcCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICBtYXhJdGVyYXRpb25zOiB0aGlzLm1heEl0ZXJhdGlvbnMsXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBPYmplY3Qua2V5cyh0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfHwge30pLmxlbmd0aCA+IDAgJiYgeyB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiBuYXR1cmFsVGV4dEFjdGlvbklkICE9IG51bGwgJiYgeyBuYXR1cmFsVGV4dEFjdGlvbklkIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwgJiYgeyBmb3JMb29wVGVzdERhdGFJZDogTnVtYmVyKHRlc3REYXRhUHJvZmlsZUlkKSB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLnN0YXJ0U3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcFN0YXJ0SW5kZXg6IHRoaXMuc3RhcnRTdGVwIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuZW5kU3RlcCAhPSBudWxsICYmIHsgZm9yTG9vcEVuZEluZGV4OiB0aGlzLmVuZFN0ZXAgfSksXG4gICAgfTtcbiAgICBcbiAgICAvLyBFbWl0IGluZGl2aWR1YWwgY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMudGVzdERhdGFQcm9maWxlQ2hhbmdlLmVtaXQodGhpcy50ZXN0RGF0YVByb2ZpbGUpO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodGhpcy5zdGFydFN0ZXAgPz8gMSk7XG4gICAgdGhpcy5lbmRTdGVwQ2hhbmdlLmVtaXQodGhpcy5lbmRTdGVwID8/IDEpO1xuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29uZGl0aW9uKTtcbiAgICAgIHRoaXMubWF4SXRlcmF0aW9uc0NoYW5nZS5lbWl0KHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW1pdCBzdGVwIHVwZGF0ZSBldmVudCB3aXRoIGZ1bGwgY29uZmlnXG4gICAgY29uc29sZS5sb2coJ0xvb3Atc3RlcDogRW1pdHRpbmcgc3RlcFVwZGF0ZSBldmVudCcsIHVwZGF0ZWRDb25maWcpO1xuICAgIHRoaXMuc3RlcFVwZGF0ZS5lbWl0KHVwZGF0ZWRDb25maWcpO1xuICAgIFxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmVkaXRTbmFwc2hvdC50ZXN0RGF0YVByb2ZpbGU7XG4gICAgdGhpcy5zdGFydFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5zdGFydFN0ZXA7XG4gICAgdGhpcy5lbmRTdGVwID0gdGhpcy5lZGl0U25hcHNob3QuZW5kU3RlcDtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvbjtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmVkaXRTbmFwc2hvdC5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuZWRpdFNuYXBzaG90LnNlbGVjdGVkVGVtcGxhdGU7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuZWRpdFNuYXBzaG90LnRlbXBsYXRlVmFyaWFibGVzIHx8IFtdO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSAmJiB0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVkaXRTbmFwc2hvdC5jb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkVkaXRJbkRlcHRoKHRlbXBsYXRlT3ZlcnJpZGU/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdudW1iZXInID8gdGhpcy5zdGVwTnVtYmVyIDogKHR5cGVvZiB0aGlzLnN0ZXBOdW1iZXIgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodGhpcy5zdGVwTnVtYmVyLCAxMCkgOiAwKTtcbiAgICBjb25zdCBwYXlsb2FkOiB7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlcjsgdGVtcGxhdGVPdmVycmlkZT86IGFueSB9ID0ge1xuICAgICAgc3RlcDogdGhpcy5jb25maWcgYXMgVGVzdENhc2VTdGVwQ29uZmlnLFxuICAgICAgaW5kZXg6IGlzTmFOKGluZGV4KSA/IDAgOiBpbmRleCxcbiAgICB9O1xuICAgIGlmICh0ZW1wbGF0ZU92ZXJyaWRlKSB7XG4gICAgICBwYXlsb2FkLnRlbXBsYXRlT3ZlcnJpZGUgPSB0ZW1wbGF0ZU92ZXJyaWRlO1xuICAgIH1cbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBvbkxpbmsoKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgc3RlcCBncm91cHNcbiAgfVxuXG4gIG9uRHVwbGljYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZHVwbGljYXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICB9XG5cbiAgb25Nb3JlT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLm1vcmVPcHRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0RldGFpbHMoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5jb25maWcuZGVzY3JpcHRpb24gfHwgdGhpcy5jb25maWcuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1IgTE9PUCBEZXRhaWxzJyA6ICdXSElMRSBMT09QIERldGFpbHMnO1xuICAgICAgdGhpcy52aWV3RGV0YWlscy5lbWl0KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5jb25maWcuZGVzY3JpcHRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsb29wLXN0ZXAtcm93IGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICA8IS0tIElubGluZSBFZGl0IE1vZGU6IHN0b3AgcHJvcGFnYXRpb24gc28gZHJvcGRvd24vc2VsZWN0IGludGVyYWN0aW9ucyBkb24ndCBidWJibGUgYW5kIGNvbGxhcHNlIHRoZSBzdGVwIG9yIHN0YXJ0IGRyYWcgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0VkaXRpbmdcIiBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtZ3Jvd1wiPlxuICAgICAgICA8IS0tIExvb3AgVHlwZSBMYWJlbCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgICAge3sgZ2V0TG9vcFR5cGVMYWJlbCgpIH19XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRk9SIExPT1AgaW5saW5lIGVkaXQ6IGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSB1c2FnZSBhcyBkZWZhdWx0IHN0b3JpZXMpIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InXCI+XG4gICAgICAgICAgPCEtLSBGaXJzdCBzZWxlY3Q6IHdpZHRoIDIxNi4yNXB4LCBoZWlnaHQgMzZweCwgZ2FwIDRweCwgb3BhY2l0eSAxIC0tPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImZvck9wdGlvblR5cGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwidGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cInN0YXJ0U3RlcFNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJlbmRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFdISUxFIExPT1AgaW5saW5lIGVkaXQ6IGNxYS1hdXRvY29tcGxldGUgKyB0ZW1wbGF0ZSB2YXJpYWJsZXMgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiPlxuICAgICAgICAgIDxjcWEtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cIndoaWxlQ29uZGl0aW9uQXV0b2NvbXBsZXRlT3B0aW9uc1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2hpbGVDb25kaXRpb25EaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnY29uZGl0aW9uJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAob3B0aW9uU2VsZWN0KT1cIm9uQ29uZGl0aW9uU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj5cbiAgICAgICAgICA8L2NxYS1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPCEtLSBUZW1wbGF0ZSB2YXJpYWJsZXMgKHNob3duIHdoZW4gdGVtcGxhdGUgaXMgc2VsZWN0ZWQsIHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlICYmIHRlbXBsYXRlVmFyaWFibGVzICYmIHRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXJvdyBjcWEtZmxleC13cmFwIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXNcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMFwiPnt7IHZhcmlhYmxlLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbicgJiYgdmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lID09PSAndHlwZScgfHwgdmFyaWFibGUubmFtZSA9PT0gJ3Njcm9sbFRvJyB8fCB2YXJpYWJsZS5vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwidGVtcGxhdGVWYXJpYWJsZXNGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZ0ZvclZhcmlhYmxlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAndHlwZScgJiYgdmFyaWFibGUubmFtZSAhPT0gJ3Njcm9sbFRvJyAmJiAhdmFyaWFibGUub3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwibWluLXdpZHRoOiAxNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyICcgKyB2YXJpYWJsZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlbXBsYXRlVmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGUubmFtZSk/LnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEVkaXQgSW4gZGVwdGggbGluayAtLT5cbiAgICAgIDxhIGhyZWY9XCIjXCIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCIgKGNsaWNrKT1cIm9uRWRpdEluRGVwdGgoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLW5vLXVuZGVybGluZVwiPlxuICAgICAgICBFZGl0IEluIGRlcHRoXG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgOCA4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIlxuICAgICAgICAgICAgZmlsbD1cIiMzRjQzRUVcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICA8IS0tIENhbmNlbCAvIEFwcGx5IC0tPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0Q2FuY2VsKClcIj48L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdJ1wiIFt0ZXh0XT1cIidBcHBseSdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXRBcHBseSgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTG9vcCBIZWFkZXIgKG5vcm1hbCB2aWV3IHdoZW4gbm90IGVkaXRpbmcpIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdGluZ1wiXG4gICAgW2NsYXNzXT1cIidzdGVwLXJvdyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMiAnICsgKGlzSW5zaWRlTG9vcCAmJiBpc0luc2lkZVN0ZXBHcm91cCA/ICdjcWEtcGwtMjAgY3FhLXByLTQnIDogKGlzSW5zaWRlTG9vcCB8fCBpc0luc2lkZVN0ZXBHcm91cCkgPyAnY3FhLXBsLTEwIGNxYS1wci00JyA6ICdjcWEtcHgtNCcpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgPCEtLSBEcmFnIEhhbmRsZSBJY29uICh3aGVuIGlzUmVvcmRlciBpcyB0cnVlKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyXCIgY2xhc3M9XCJjcWEtbXItMiBjcWEtY3Vyc29yLW1vdmUgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENoZWNrYm94ICh3aGVuIGlzUmVvcmRlciBpcyBmYWxzZSkgLS0+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXJlbGF0aXZlIGNxYS1tci0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaC00IGNxYS13LTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtYXBwZWFyYW5jZS1ub25lIGNxYS1yb3VuZGVkIHNoYWRvdyBob3ZlcjpjcWEtc2hhZG93LW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXNsYXRlLTMwMCBjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYmctWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1ib3JkZXItWyMzRjQzRUVdXT1cInNlbGVjdGVkXCJcbiAgICAgICAgaWQ9XCJjaGVjay1sb29wLXN0ZXBcIiAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRleHQtd2hpdGUgY3FhLXRvcC0xLzIgY3FhLWxlZnQtMS8yIGNxYS0tdHJhbnNsYXRlLXgtMS8yIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTBdPVwiIXNlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTEwMF09XCJzZWxlY3RlZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTIgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwIDMuMTI1TDQuNSA4LjYyNUwyIDYuMTI1XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1taW4tdy1bMzJweF1cIj57eyBzdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgIDwhLS0gRXhwYW5kL0NvbGxhcHNlIEljb24gLS0+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiIGNsYXNzPVwiY3FhLXAtMFwiPlxuICAgICAgPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTIgMTBMOCA2TDQgMTBcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBMb29wIEljb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnZm9yJ1wiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEuMzM0IDEuMzMzMjVMMTQuMDAwNyAzLjk5OTkyTDExLjMzNCA2LjY2NjU5XCIgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMiA3LjMzMzMzVjYuNjY2NjdDMiA1Ljk1OTQyIDIuMjgwOTUgNS4yODExNSAyLjc4MTA1IDQuNzgxMDVDMy4yODExNSA0LjI4MDk1IDMuOTU5NDIgNCA0LjY2NjY3IDRIMTRcIlxuICAgICAgICAgIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk00LjY2NjY3IDE0LjY2NjZMMiAxMS45OTk5TDQuNjY2NjcgOS4zMzMyNVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTQgOC42NjY3NVY5LjMzMzQxQzE0IDEwLjA0MDcgMTMuNzE5IDEwLjcxODkgMTMuMjE5IDExLjIxOUMxMi43MTg5IDExLjcxOTEgMTIuMDQwNiAxMi4wMDAxIDExLjMzMzMgMTIuMDAwMUgyXCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICd3aGlsZSdcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvb3AgVHlwZSBMYWJlbCAtLT5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctbm9uZVwiPlxuICAgICAge3sgZ2V0TG9vcFR5cGVMYWJlbCgpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPCEtLSBGb3IgTG9vcCBEaXNwbGF5IChzYW1lIHN0eWxpbmcgYXMgY29uZGl0aW9uIHN0ZXAsIEhUTUwgYmFkZ2VzIHZpYSBpbm5lckhUTUwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcicgJiYgKGhhc1Rlc3REYXRhUHJvZmlsZSgpIHx8IGhhc1N0YXJ0VmFsdWUoKSB8fCBoYXNFbmRWYWx1ZSgpKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcERpc3BsYXkoKVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXaGlsZSBMb29wIENvbmRpdGlvbiAob25seSBzaG93IGlmIGNvbmRpdGlvbiBleGlzdHMpIC0gc2FtZSBzdHlsaW5nIGFzIGNvbmRpdGlvbiBzdGVwIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1doaWxlTG9vcCgpICYmIGNvbmRpdGlvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1sLTIgY3FhLWZsZXgtMVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29uZGl0aW9uRGlzcGxheSgpXCIgKGNsaWNrKT1cIm9uTG9vcEFjdGlvbkNsaWNrKCRldmVudClcIj48L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBiZWZvcmUgYWN0aW9uIGljb25zLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXI7IGhpZGRlbiB3aGVuIGluc2lkZSBzdGVwLWdyb3VwKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF1cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTEuNjY2NkgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05LjU1MjA4IDIuMTEyOEM5Ljc4NDMgMS44ODA1OCAxMC4wOTkzIDEuNzUwMTIgMTAuNDI3NyAxLjc1MDEyQzEwLjc1NjEgMS43NTAxMiAxMS4wNzEgMS44ODA1OCAxMS4zMDMzIDIuMTEyOEMxMS41MzU1IDIuMzQ1MDIgMTEuNjY1OSAyLjY1OTk4IDExLjY2NTkgMi45ODgzOEMxMS42NjU5IDMuMzE2NzkgMTEuNTM1NSAzLjYzMTc1IDExLjMwMzMgMy44NjM5N0w0LjI5NzQyIDEwLjg3MDRDNC4xNTg2NCAxMS4wMDkyIDMuOTg3MSAxMS4xMTA3IDMuNzk4NjcgMTEuMTY1NkwyLjEyMzMzIDExLjY1NDRDMi4wNzMxNCAxMS42NjkgMi4wMTk5MyAxMS42Njk5IDEuOTY5MjggMTEuNjU2OUMxLjkxODYzIDExLjY0MzkgMS44NzI0IDExLjYxNzYgMS44MzU0MyAxMS41ODA2QzEuNzk4NDYgMTEuNTQzNyAxLjc3MjEgMTEuNDk3NCAxLjc1OTEzIDExLjQ0NjhDMS43NDYxNSAxMS4zOTYxIDEuNzQ3MDMgMTEuMzQyOSAxLjc2MTY3IDExLjI5MjdMMi4yNTA1IDkuNjE3MzhDMi4zMDU0NiA5LjQyOTE2IDIuNDA2OTggOS4yNTc4MyAyLjU0NTY3IDkuMTE5MjJMOS41NTIwOCAyLjExMjhaXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkxpbmsoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJMaW5rXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC4zMzM5OCA3SDkuNjY3MzJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25EdXBsaWNhdGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJEdXBsaWNhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTExLjY2NiA0LjY2NjYzSDUuODMyNjhDNS4xODgzNSA0LjY2NjYzIDQuNjY2MDIgNS4xODg5NiA0LjY2NjAyIDUuODMzMjlWMTEuNjY2NkM0LjY2NjAyIDEyLjMxMSA1LjE4ODM1IDEyLjgzMzMgNS44MzI2OCAxMi44MzMzSDExLjY2NkMxMi4zMTAzIDEyLjgzMzMgMTIuODMyNyAxMi4zMTEgMTIuODMyNyAxMS42NjY2VjUuODMzMjlDMTIuODMyNyA1LjE4ODk2IDEyLjMxMDMgNC42NjY2MyAxMS42NjYgNC42NjY2M1pcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMi4zMzI2OCA5LjMzMzI5QzEuNjkxMDIgOS4zMzMyOSAxLjE2NjAyIDguODA4MjkgMS4xNjYwMiA4LjE2NjYzVjIuMzMzMjlDMS4xNjYwMiAxLjY5MTYzIDEuNjkxMDIgMS4xNjY2MyAyLjMzMjY4IDEuMTY2NjNIOC4xNjYwMkM4LjgwNzY4IDEuMTY2NjMgOS4zMzI2OCAxLjY5MTYzIDkuMzMyNjggMi4zMzMyOVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyNmZjY0NjddIGhvdmVyOmNxYS10ZXh0LVsjQzYzNTM1XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xLjc1IDMuNUgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMS4wODI3IDMuNVYxMS42NjY3QzExLjA4MjcgMTIuMjUgMTAuNDk5MyAxMi44MzMzIDkuOTE2MDIgMTIuODMzM0g0LjA4MjY4QzMuNDk5MzUgMTIuODMzMyAyLjkxNjAyIDEyLjI1IDIuOTE2MDIgMTEuNjY2N1YzLjVcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNC42NjYwMiAzLjQ5OTk2VjIuMzMzMjlDNC42NjYwMiAxLjc0OTk2IDUuMjQ5MzUgMS4xNjY2MyA1LjgzMjY4IDEuMTY2NjNIOC4xNjYwMkM4Ljc0OTM1IDEuMTY2NjMgOS4zMzI2OCAxLjc0OTk2IDkuMzMyNjggMi4zMzMyOVYzLjQ5OTk2XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUuODMzOTggNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCB3aXRoIE5lc3RlZCBTdGVwcyAocmVuZGVyZXIgZGlzcGF0Y2hlcyBieSBzdGVwIHR5cGUsIG4tbGV2ZWwgbmVzdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCJleHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPCEtLSBTVEFSVCBNYXJrZXIgKGNlbnRlcmVkIHdpdGggZGVjb3JhdGl2ZSBsaW5lcykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00IGNxYS1iZy1bI0RCRUFGRTgwXVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRTdGFydExhYmVsKCkgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIFtzdGVwXT1cInN0ZXBcIiBbaW5kZXhdPVwiaVwiXG4gICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGFkZFN0ZXBGb3JMb29wKT1cIm9uQWRkU3RlcEZvckxvb3BGcm9tTmVzdGVkKCRldmVudClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGVkaXQpPVwib25OZXN0ZWRFZGl0KCRldmVudClcIlxuICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBuZXN0ZWQtc3RlcC1kcm9wLWxpc3RcIlxuICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFbXB0eSBsb29wOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibmVzdGVkU3RlcHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEVtcHR5KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJBZGQgc3RlcFwiXG4gICAgICAgIGNsYXNzPVwibG9vcC1zdGVwLWVtcHR5LWFkZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIyXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMkgxNS41XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0RW5kTGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvbG9vcC1zdGVwL2xvb3Atc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2xvb3Atc3RlcC9sb29wLXN0ZXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JFLE9BQU8sRUFBK0csU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEssT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQUtyRSxNQUFNLHNCQUFzQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9COUIsQ0FBQztBQVVGLE1BQU0sT0FBTyx5QkFBeUI7SUFtSHBDLFlBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWxIdkIsYUFBUSxHQUFvQixLQUFLLENBQUM7UUFPbEMsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25DLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBQ3RELGdF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QUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9vcFN0ZXBDb25maWcsIFRlc3RDYXNlU3RlcENvbmZpZywgTm9ybWFsU3RlcENvbmZpZywgQ29uZGl0aW9uU3RlcENvbmZpZywgU3RlcEdyb3VwQ29uZmlnLCBDb25kaXRpb25CcmFuY2gsIFN0ZXBUeXBlcyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyB9IGZyb20gJy4uL3N0ZXAtcm93LWFjdGlvbnMuc3R5bGVzJztcbmltcG9ydCB7IERhdGFQcm9maWxlT3B0aW9uIH0gZnJvbSAnLi4vLi4vc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1sb29wL3N0ZXAtYnVpbGRlci1sb29wLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3RGV0YWlsc1BheWxvYWQgfSBmcm9tICcuLi9zdGVwLWRldGFpbHMtbW9kYWwvc3RlcC1kZXRhaWxzLW1vZGFsLWRhdGEnO1xuaW1wb3J0IHsgQ3FhQXV0b2NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi4vLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5tb2RlbCc7XG5cbmNvbnN0IExPT1BfU1RFUF9FTVBUWV9TVFlMRVMgPSBgXG4gIC8qIEVtcHR5IGxvb3A6IHNob3cgcGx1cyBpY29uIG9uIGhvdmVyIHdoZW4gZXhwYW5kZWQgYW5kIG5vIHN0ZXBzICovXG4gIC5sb29wLXN0ZXAtZW1wdHkge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGVhc2U7XG4gIH1cbiAgLmxvb3Atc3RlcC1yb3c6aG92ZXIgLmxvb3Atc3RlcC1lbXB0eSB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuICAubG9vcC1zdGVwLWVtcHR5LWFkZCB7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAjM0Y0M0VFO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTtcbiAgfVxuICAubG9vcC1zdGVwLWVtcHR5LWFkZDpob3ZlciB7XG4gICAgb3BhY2l0eTogMC45O1xuICB9XG5gO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1sb29wLXN0ZXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBzdHlsZXM6IFtcbiAgICBTVEVQX1JPV19BQ1RJT05TX1NUWUxFUyxcbiAgICBMT09QX1NURVBfRU1QVFlfU1RZTEVTLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZUxvb3BTdGVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBMb29wU3RlcENvbmZpZztcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxvb3BUeXBlOiAnZm9yJyB8ICd3aGlsZScgPSAnZm9yJztcbiAgQElucHV0KCkgc3RlcE51bWJlciE6IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KCkgY29uZGl0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSB0ZXN0RGF0YVByb2ZpbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgZW5kU3RlcD86IG51bWJlcjtcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM6IFRlc3RDYXNlU3RlcENvbmZpZ1tdID0gW107XG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNJbnNpZGVMb29wOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzSW5zaWRlU3RlcEdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRhdGEgcHJvZmlsZSBkcm9wZG93biAtIGFjY2VwdHMgRGF0YVByb2ZpbGVPcHRpb24gb2JqZWN0cyAqL1xuICBASW5wdXQoKSBkYXRhUHJvZmlsZU9wdGlvbnM6IERhdGFQcm9maWxlT3B0aW9uW10gPSBbXTtcbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIGRhdGEgcHJvZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGluZyAqL1xuICBASW5wdXQoKSBoYXNNb3JlRGF0YVByb2ZpbGVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9ucyBmb3IgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgKGZvciB3aGlsZSBsb29wIGNvbmRpdGlvbikgKi9cbiAgQElucHV0KCkgbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIHByb2Nlc3MgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodGVtcGxhdGU6IGFueSkgPT4gYW55W10gPSAoKSA9PiBbXTtcbiAgLyoqIFNob3cgXCJBZGQgU3RlcCBCZXR3ZWVuXCIgYnV0dG9uIGFib3ZlIG5lc3RlZCBzdGVwcyAqL1xuICBASW5wdXQoKSBhZGRTdGVwQmV0d2VlbkFib3ZlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTaG93IFwiQWRkIFN0ZXAgQmV0d2VlblwiIGJ1dHRvbiBiZWxvdyBuZXN0ZWQgc3RlcHMgKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW5CZWxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGFkZFN0ZXBCZXR3ZWVuQWJvdmUgYW5kIGFkZFN0ZXBCZXR3ZWVuQmVsb3cgaW5zdGVhZC4gSWYgc2V0LCBhcHBsaWVzIHRvIGJvdGggYnV0dG9ucy4gKi9cbiAgQElucHV0KCkgYWRkU3RlcEJldHdlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb25maWc6IExvb3BTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0U3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZW5kU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29uZGl0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBtYXhJdGVyYXRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBuZXN0ZWRTdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogRW1pdHMgdm9pZCB3aGVuIGFkZCBpcyBmcm9tIG5lc3RlZCBjb250ZW50OyBlbWl0cyB7IGxvb3BTdGVwQ29uZmlnIH0gd2hlbiBlbXB0eS1zdGF0ZSBhZGQgaXMgY2xpY2tlZCAoc2FtZSBiZWhhdmlvdXIgYXMgYWRkLXN0ZXAtYmV0d2VlbikuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkIHwgeyBsb29wU3RlcENvbmZpZzogTG9vcFN0ZXBDb25maWcgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGR1cGxpY2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlld0RldGFpbHMgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdEZXRhaWxzUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGVkaXRJbkRlcHRoID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZzsgaW5kZXg6IG51bWJlcjsgdGVtcGxhdGVPdmVycmlkZT86IGFueSB9PigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGRuZERyb3BJblpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IERuZERyb3BFdmVudDsgdGFyZ2V0TGlzdDogVGVzdENhc2VTdGVwQ29uZmlnW10gfT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBtb3JlIGRhdGEgcHJvZmlsZXMgbmVlZCB0byBiZSBsb2FkZWQgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlRGF0YVByb2ZpbGVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIHVwZGF0ZWQgKEFwcGx5IGJ1dHRvbiBjbGlja2VkIGluIGVkaXQgbW9kZSkgKi9cbiAgQE91dHB1dCgpIHN0ZXBVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BTdGVwQ29uZmlnPigpO1xuICAvKiogUmUtZW1pdCB3aGVuIGEgbmVzdGVkIHN0ZXAgKGUuZy4gbm9ybWFsLXN0ZXApIGVtaXRzIGNsaWNrQWN0aW9uIChlLmcuIGVsZW1lbnQvbGFiZWwgY2xpY2sgZm9yIHBvcHVwKSAqL1xuICBAT3V0cHV0KCkgY2xpY2tBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyB9PigpO1xuICAvKiogUmUtZW1pdCBhZGRTdGVwQmV0d2VlbkNsaWNrIGZyb20gbmVzdGVkIHJlbmRlcmVycyAqL1xuICBAT3V0cHV0KCkgYWRkU3RlcEJldHdlZW5DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8e3N0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlciwgcG9zaXRpb246ICdBQk9WRScgfCAnQkVMT1cnfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZG5kRHJvcEluWm9uZS5lbWl0KHsgZXZlbnQsIHRhcmdldExpc3Q6IHRoaXMubmVzdGVkU3RlcHMgfSk7XG4gIH1cblxuICAvKiogRW1pdCBjbGlja0FjdGlvbiB3aGVuIHVzZXIgY2xpY2tzIG9uIGxvb3AgZGlzcGxheSBiYWRnZXMgKGVsZW1lbnQsIHRlc3RfZGF0YSwgZXRjLikgc28gcGFyZW50IGNhbiBvcGVuIGVkaXQgbW9kYWxzICovXG4gIG9uTG9vcEFjdGlvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0FjdGlvbi5lbWl0KHsgZXZlbnQsIHN0ZXA6IHRoaXMuY29uZmlnIH0pO1xuICB9XG5cbiAgLyoqIEV4cG9zZSBnbG9iYWwgY29uc3RydWN0b3JzIGZvciB0ZW1wbGF0ZSAoQW5ndWxhciB0ZW1wbGF0ZXMgZG9uJ3QgaGF2ZSBTdHJpbmcvTnVtYmVyKSAqL1xuICByZWFkb25seSBzdHJpbmdGbiA9IFN0cmluZztcbiAgcmVhZG9ubHkgbnVtYmVyRm4gPSBOdW1iZXI7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGVhZGVyIHNob3dzIGlubGluZSBlZGl0IGZvcm0gKGRyb3Bkb3ducywgaW5wdXRzLCBDYW5jZWwvQXBwbHkpICovXG4gIGlzRWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGZvciBlZGl0IG1vZGU7IGJvdW5kIHRvIGNxYS1keW5hbWljLXNlbGVjdCAoc2FtZSBwYXR0ZXJuIGFzIGRlZmF1bHQgc3RvcmllcykgKi9cbiAgZWRpdEZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZnMgdG8gYXZvaWQgY2hhbmdlLWRldGVjdGlvbiBsb29wcykgKi9cbiAgZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBzdGFydFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGVuZFN0ZXBTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgLyoqIFdoaWxlIGxvb3A6IGNvbmZpZyBmb3IgYXV0b2NvbXBsZXRlIG9wdGlvbnMgKFdISUxFX0NPTkRJVElPTiBvbmx5KSAqL1xuICB3aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU2VsZWN0ZWQgdGVtcGxhdGUgZm9yIHdoaWxlIGNvbmRpdGlvbiAoc2FtZSBwYXR0ZXJuIGFzIGNvbmRpdGlvbi1zdGVwKSAqL1xuICBzZWxlY3RlZFRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICAvKiogVGVtcGxhdGUgdmFyaWFibGVzIGZvciB3aGlsZSBjb25kaXRpb24gKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIC8qKiBGb3JtIGdyb3VwIGZvciB0ZW1wbGF0ZSB2YXJpYWJsZXMgKi9cbiAgdGVtcGxhdGVWYXJpYWJsZXNGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBEZWZhdWx0IG1heCBmb3IgTG9vcCBTdGFydCAvIEVuZCB3aGVuIG5vIHByb2ZpbGUgc2VsZWN0ZWQgKG9wdGlvbnMgMS4uMTApICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTE9PUF9PUFRJT05TX01BWCA9IDEwO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdEZXRhaWxzVHJpZ2dlcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWV3RGV0YWlsc1RyaWdnZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogTG9jYWwgY29weSBvZiB2YWx1ZXMgd2hpbGUgZWRpdGluZyAoZm9yIENhbmNlbCByZXZlcnQpICovXG4gIHByaXZhdGUgZWRpdFNuYXBzaG90OiB7XG4gICAgdGVzdERhdGFQcm9maWxlPzogc3RyaW5nO1xuICAgIHN0YXJ0U3RlcD86IG51bWJlcjtcbiAgICBlbmRTdGVwPzogbnVtYmVyO1xuICAgIGNvbmRpdGlvbj86IHN0cmluZztcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHNlbGVjdGVkVGVtcGxhdGU/OiBhbnk7XG4gICAgdGVtcGxhdGVWYXJpYWJsZXM/OiBhbnlbXTtcbiAgICBjb25kaXRpb25UZW1wbGF0ZUZvcm1WYWx1ZT86IGFueTtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQ7XG4gICAgICB0aGlzLmxvb3BUeXBlID0gdGhpcy5jb25maWcubG9vcFR5cGU7XG4gICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLmNvbmZpZy5zdGVwTnVtYmVyO1xuICAgICAgdGhpcy5jb25kaXRpb24gPSB0aGlzLmNvbmZpZy5jb25kaXRpb247XG4gICAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSB0aGlzLmNvbmZpZy5tYXhJdGVyYXRpb25zO1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLmNvbmZpZy50ZXN0RGF0YVByb2ZpbGU7XG4gICAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuY29uZmlnLnN0YXJ0U3RlcDtcbiAgICAgIHRoaXMuZW5kU3RlcCA9IHRoaXMuY29uZmlnLmVuZFN0ZXA7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gdGhpcy5jb25maWcubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB0aGlzLmV4cGFuZGVkID0gdGhpcy5jb25maWcuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmV4cGFuZGVkIDogdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSAodGhpcy5jb25maWcgYXMgYW55KS5zZWxlY3RlZCB8fCBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICAgIHRoaXMucmVidWlsZFdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uKCk7XG4gICAgICB9XG4gICAgICAvLyBGT1IgbG9vcDogd2hlbiBzdGVwIGNvbmZpZyBoYXMgZm9yTG9vcFRlc3REYXRhSWQvZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4LCBzeW5jIGZvcm0gYW5kIHJlZnJlc2ggc2VsZWN0IGNvbmZpZ3Mgc28gZHJvcGRvd25zIHNob3cgc2VsZWN0ZWRcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvckxvb3BTZWxlY3RDb25maWdzU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdEZvcm0pIHRoaXMuc3luY0Zvckxvb3BFZGl0Rm9ybUZyb21Db25maWcoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGF0YVByb2ZpbGVPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZURhdGFQcm9maWxlcyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ0RhdGFQcm9maWxlcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgICAgLy8gV2hlbiBkYXRhIHByb2ZpbGVzIGxvYWQgaW4gZWRpdCBtb2RlLCBzeW5jIGZvcm0gdmFsdWUgc28gZHJvcGRvd24gc2hvd3Mgc2VsZWN0ZWQgKGZvckxvb3BUZXN0RGF0YUlkIG9yIHRlc3REYXRhUHJvZmlsZSlcbiAgICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmVkaXRGb3JtICYmIHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgICAgICBpZiAoY2ZnPy5mb3JMb29wVGVzdERhdGFJZCAhPSBudWxsIHx8IHRoaXMudGVzdERhdGFQcm9maWxlKSB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgICAgIC8vIFdoZW4gb3B0aW9ucyBsb2FkLCBwb3B1bGF0ZSBjb25kaXRpb24gKyB0ZW1wbGF0ZSBmcm9tIG5hdHVyYWxUZXh0QWN0aW9uSWQgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApXG4gICAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJyAmJiB0aGlzLmVkaXRGb3JtICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVidWlsZFdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIERlcml2ZSBmb3JPcHRpb25UeXBlIGZvciBGT1IgbG9vcCBmcm9tIGNvbmZpZyBzbyBkcm9wZG93biBzaG93cyBleGlzdGluZyBzZWxlY3Rpb24gKi9cbiAgcHJpdmF0ZSBnZXRGb3JPcHRpb25UeXBlRnJvbUNvbmZpZygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBoYXNUZXN0RGF0YUlkID0gY2ZnPy5mb3JMb29wVGVzdERhdGFJZCAhPSBudWxsIHx8IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQgIT0gbnVsbDtcbiAgICBpZiAoaGFzVGVzdERhdGFJZCB8fCB0aGlzLnRlc3REYXRhUHJvZmlsZSkgcmV0dXJuICd0ZXN0LWRhdGEnO1xuICAgIGNvbnN0IGhhc0ZpeGVkID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCAhPSBudWxsIHx8IGNmZz8uZm9yTG9vcEVuZEluZGV4ICE9IG51bGxcbiAgICAgIHx8IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ICE9IG51bGxcbiAgICAgIHx8IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4ICE9IG51bGwgfHwgY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LmVuZEluZGV4ICE9IG51bGw7XG4gICAgaWYgKHRoaXMuc3RhcnRTdGVwICE9IG51bGwgfHwgdGhpcy5lbmRTdGVwICE9IG51bGwgfHwgaGFzRml4ZWQpIHJldHVybiAnZml4ZWQnO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFRlc3QgRGF0YSBQcm9maWxlIGRyb3Bkb3duIHZhbHVlOiBwcmVmZXIgZm9yTG9vcFRlc3REYXRhSWQgZnJvbSBjb25maWcgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKS4gVXNlIG9wdGlvbi5pZCB3aGVuIG9wdGlvbnMgbG9hZGVkIHNvIHR5cGUgbWF0Y2hlcyBzZWxlY3QuICovXG4gIHByaXZhdGUgZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGlkRnJvbUNvbmZpZyA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgLy8gV2hlbiB3ZSBoYXZlIG9wdGlvbnMsIHJlc29sdmUgYnkgaWQgc28gZm9ybSB2YWx1ZSBtYXRjaGVzIG9wdGlvbi5pZCAoc3RyaWN0IGVxdWFsaXR5IGluIGR5bmFtaWMtc2VsZWN0KVxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyAmJiB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoaWRGcm9tQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICAgIG8gPT4gby5pZCA9PT0gaWRGcm9tQ29uZmlnIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKGlkRnJvbUNvbmZpZylcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2guaWQ7XG4gICAgICAgIHJldHVybiBpZEZyb21Db25maWcgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgICAgIGlmICh2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICAgIG8gPT4gby5uYW1lID09PSB2YWx1ZSB8fCBTdHJpbmcoby5pZCkgPT09IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2guaWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIH1cbiAgICBpZiAoaWRGcm9tQ29uZmlnICE9IG51bGwpIHJldHVybiBpZEZyb21Db25maWcgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIHJldHVybiAodGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycpIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgfVxuXG4gIC8qKiBMb29wIFN0YXJ0IGRyb3Bkb3duIHZhbHVlOiBwcmVmZXIgZm9yTG9vcFN0YXJ0SW5kZXggZnJvbSBjb25maWcgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBzdGFydFN0ZXAgKi9cbiAgcHJpdmF0ZSBnZXRMb29wU3RhcnRGb3JtVmFsdWUoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiBOdW1iZXIodik7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdGVwID8/IG51bGw7XG4gIH1cblxuICAvKiogTG9vcCBFbmQgZHJvcGRvd24gdmFsdWU6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBjb25maWcgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBlbmRTdGVwICovXG4gIHByaXZhdGUgZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3QgdiA9IGNmZz8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BFbmRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uZW5kSW5kZXg7XG4gICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIE51bWJlcih2KTtcbiAgICByZXR1cm4gdGhpcy5lbmRTdGVwID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWRpdEZvcm0oKTogdm9pZCB7XG4gICAgLy8gRm9yIHdoaWxlIGxvb3A6IGlmIGNvbmZpZyBoYXMgbmF0dXJhbFRleHRBY3Rpb25JZCBhbmQgb3B0aW9ucyBhcmUgYWxyZWFkeSBsb2FkZWQsIHVzZSB0aGVtIGZvciBpbml0aWFsIGNvbmRpdGlvbiArIHRlbXBsYXRlXG4gICAgbGV0IGNvbmRpdGlvblZhbHVlID0gdGhpcy5jb25kaXRpb24gPz8gJyc7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGNvbnN0IHBvcHVsYXRlZCA9IHRoaXMucG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk7XG4gICAgICBpZiAocG9wdWxhdGVkPy5jb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBjb25kaXRpb25WYWx1ZSA9IHBvcHVsYXRlZC5jb25kaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciBGT1IgbG9vcDogaW5pdGlhbCBmb3JtIHZhbHVlcyBzbyBkcm9wZG93bnMgc2hvdyBleGlzdGluZyBzZWxlY3Rpb24gKGZvck9wdGlvblR5cGUsIGZvckxvb3BUZXN0RGF0YUlkL3Rlc3REYXRhUHJvZmlsZSwgZm9yTG9vcFN0YXJ0SW5kZXgvZm9yTG9vcEVuZEluZGV4KVxuICAgIGNvbnN0IGZvck9wdGlvblR5cGUgPSB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsdWUgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCkgOiAodGhpcy50ZXN0RGF0YVByb2ZpbGUgPz8gJycpO1xuICAgIGNvbnN0IGxvb3BTdGFydFZhbHVlID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogKHRoaXMuc3RhcnRTdGVwID8/IG51bGwpO1xuICAgIGNvbnN0IGxvb3BFbmRWYWx1ZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gdGhpcy5nZXRMb29wRW5kRm9ybVZhbHVlKCkgOiAodGhpcy5lbmRTdGVwID8/IG51bGwpO1xuICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZvck9wdGlvblR5cGU6IFtmb3JPcHRpb25UeXBlIGFzIHN0cmluZyB8IG51bGxdLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiBbdGVzdERhdGFQcm9maWxlVmFsdWVdLFxuICAgICAgc3RhcnRTdGVwOiBbbG9vcFN0YXJ0VmFsdWUgYXMgbnVtYmVyIHwgbnVsbF0sXG4gICAgICBlbmRTdGVwOiBbbG9vcEVuZFZhbHVlIGFzIG51bWJlciB8IG51bGxdLFxuICAgICAgY29uZGl0aW9uOiBbY29uZGl0aW9uVmFsdWVdLFxuICAgICAgbWF4SXRlcmF0aW9uczogW3RoaXMubWF4SXRlcmF0aW9ucyA/PyA1XSxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBjb25kaXRpb24sIHNlbGVjdGVkVGVtcGxhdGUgYW5kIHRlbXBsYXRlIHZhcmlhYmxlcyBmcm9tIGNvbmZpZy5uYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gb3B0aW9ucyBhcmUgYXZhaWxhYmxlLlxuICAgKiBSZXR1cm5zIHsgY29uZGl0aW9uIH0gaWYgYSBtYXRjaCB3YXMgZm91bmQgc28gYnVpbGRFZGl0Rm9ybSBjYW4gc2V0IGluaXRpYWwgZm9ybSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgcG9wdWxhdGVXaGlsZUNvbmRpdGlvbkZyb21OYXR1cmFsVGV4dEFjdGlvbklkKCk6IHsgY29uZGl0aW9uOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBpZiAoIWNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCB8fCAhdGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbmF0dXJhbFRleHQgPSBtYXRjaGluZ09wdGlvbi5uYXR1cmFsVGV4dCA/PyBtYXRjaGluZ09wdGlvbi5uYW1lID8/IG1hdGNoaW5nT3B0aW9uLnZhbHVlID8/ICcnO1xuICAgIGlmICghbmF0dXJhbFRleHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbmRpdGlvbiA9IG5hdHVyYWxUZXh0O1xuICAgIGNvbnN0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uLnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IGZ1bGxUZW1wbGF0ZTtcbiAgICBpZiAoZnVsbFRlbXBsYXRlPy52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKGZ1bGxUZW1wbGF0ZSkgfHwgW107XG4gICAgICB0aGlzLmJ1aWxkVGVtcGxhdGVWYXJpYWJsZXNGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHJldHVybiB7IGNvbmRpdGlvbjogbmF0dXJhbFRleHQgfTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIGNvbmRpdGlvbiArIHRlbXBsYXRlIHN0YXRlIHdoZW4gbmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyBsb2FkIG9yIGNvbmZpZyBjaGFuZ2VzIChzYW1lIGFzIGNvbmRpdGlvbi1zdGVwKS4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkV2hpbGVDb25kaXRpb25Gcm9tTmF0dXJhbFRleHRBY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtIHx8IHRoaXMubG9vcFR5cGUgIT09ICd3aGlsZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmICghY29uZmlnV2l0aElkPy5uYXR1cmFsVGV4dEFjdGlvbklkIHx8ICF0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgYXMgYW55W10pLmZpbmQoXG4gICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgKTtcbiAgICBpZiAoIW1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICBpZiAobmF0dXJhbFRleHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8udmFsdWUgPz8gJyc7XG4gICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgIT09IG5hdHVyYWxUZXh0KSB7XG4gICAgICAgIHRoaXMuZWRpdEZvcm0uZ2V0KCdjb25kaXRpb24nKT8uc2V0VmFsdWUobmF0dXJhbFRleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb24gPSBuYXR1cmFsVGV4dDtcbiAgICB9XG4gICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24udGVtcGxhdGUgfHwgbWF0Y2hpbmdPcHRpb247XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgIGlmIChmdWxsVGVtcGxhdGU/LnZhcmlhYmxlcykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBvcHRpb24gc2hhcGUgYXMgZGVmYXVsdCBzdG9yaWVzOiBpZCArIG5hbWUpOyBGT1IgbG9vcCBhZGRzIHNlbGVjdGVkVmFsdWUgZnJvbSBzdGVwICovXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IHRoaXMuZ2V0TG9vcFN0ZXBPcHRpb25zKCkubWFwKChuKSA9PiAoe1xuICAgICAgaWQ6IG4sXG4gICAgICB2YWx1ZTogbixcbiAgICAgIG5hbWU6IFN0cmluZyhuKSxcbiAgICAgIGxhYmVsOiBTdHJpbmcobiksXG4gICAgfSkpO1xuICAgIHRoaXMuZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2Zvck9wdGlvblR5cGUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGlkOiAndGVzdC1kYXRhJywgdmFsdWU6ICd0ZXN0LWRhdGEnLCBuYW1lOiAnVGVzdCBEYXRhIFByb2ZpbGUnLCBsYWJlbDogJ1Rlc3QgRGF0YSBQcm9maWxlJyB9LFxuICAgICAgICB7IGlkOiAnZml4ZWQnLCB2YWx1ZTogJ2ZpeGVkJywgbmFtZTogJ0ZpeGVkIGNvdW50JywgbGFiZWw6ICdGaXhlZCBjb3VudCcgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZVRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZygpO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICBjb25zdCBlbmRWYWwgPSB0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpIDogbnVsbDtcbiAgICB0aGlzLnN0YXJ0U3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3N0YXJ0U3RlcCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ0xvb3AgU3RhcnQnLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBzdGVwT3B0aW9ucy5tYXAoKG8pID0+ICh7IC4uLm8gfSkpLFxuICAgICAgLi4uKHN0YXJ0VmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBzdGFydFZhbCB9KSxcbiAgICB9O1xuICAgIHRoaXMuZW5kU3RlcFNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2VuZFN0ZXAnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdMb29wIEVuZCcsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHN0ZXBPcHRpb25zLm1hcCgobykgPT4gKHsgLi4ubyB9KSksXG4gICAgICAuLi4oZW5kVmFsICE9IG51bGwgJiYgeyBzZWxlY3RlZFZhbHVlOiBlbmRWYWwgfSksXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpO1xuICB9XG5cbiAgLyoqIFVwZGF0ZSBjb25kaXRpb24gc2VsZWN0IGNvbmZpZyB3aXRoIG5hdHVyYWwgdGV4dCBhY3Rpb25zIG9wdGlvbnMgKGxlZ2FjeSBtYXQtc2VsZWN0KSAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvblNlbGVjdENvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvblNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2NvbmRpdGlvbicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb25kaXRpb24nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSxcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlV2hpbGVDb25kaXRpb25TZWxlY3RDb25maWcoKTtcbiAgfVxuXG4gIC8qKiBXaGlsZSBsb29wOiBvbmx5IHNob3cgb3B0aW9ucyB3aXRoIHN0ZXBBY3Rpb25UeXBlID09PSBcIldISUxFX0xPT1BcIiAqL1xuICBwcml2YXRlIHVwZGF0ZVdoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnMgfHwgW10pLmZpbHRlcigob3B0aW9uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24uc3RlcEFjdGlvblR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgICB9KTtcbiAgICB0aGlzLndoaWxlQ29uZGl0aW9uU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAnY29uZGl0aW9uJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IGNvbmRpdGlvbicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgb3B0aW9uczogZmlsdGVyZWRPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICAvKiogT3B0aW9ucyBmb3IgdGhlIHdoaWxlIGNvbmRpdGlvbiBhdXRvY29tcGxldGUgKFdISUxFX0xPT1AgbmF0dXJhbCB0ZXh0IGFjdGlvbnMgb25seSkgKi9cbiAgZ2V0IHdoaWxlQ29uZGl0aW9uQXV0b2NvbXBsZXRlT3B0aW9ucygpOiAoQ3FhQXV0b2NvbXBsZXRlT3B0aW9uICYgeyB0ZW1wbGF0ZT86IGFueSB9KVtdIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy53aGlsZUNvbmRpdGlvblNlbGVjdENvbmZpZz8ub3B0aW9ucyA/PyBbXTtcbiAgICByZXR1cm4gb3B0cy5tYXAoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IG9wdGlvbi5uYXR1cmFsVGV4dCA/PyBvcHRpb24ubmFtZSA/PyBvcHRpb24udmFsdWUgPz8gU3RyaW5nKG9wdGlvbi5pZCA/PyAnJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbmF0dXJhbFRleHQsXG4gICAgICAgIGxhYmVsOiBuYXR1cmFsVGV4dCxcbiAgICAgICAgdGVtcGxhdGU6IG9wdGlvbi50ZW1wbGF0ZSB8fCBvcHRpb24sXG4gICAgICB9IGFzIENxYUF1dG9jb21wbGV0ZU9wdGlvbiAmIHsgdGVtcGxhdGU/OiBhbnkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5IHZhbHVlIGZvciB3aGlsZSBjb25kaXRpb24gYXV0b2NvbXBsZXRlOiBzaG93IG5hdHVyYWwgdGV4dCBmcm9tIG9wdGlvbiBtYXRjaGluZyBuYXR1cmFsVGV4dEFjdGlvbklkIHdoZW4gYXZhaWxhYmxlIChpbmNsdWRpbmcgd2hlbiBmb3JtIGlzIGVtcHR5IG9uIG9wZW4pLCBlbHNlIGZvcm0gdmFsdWUuIFdoZW4gdXNlciBoYXMgc2VsZWN0ZWQgYSBkaWZmZXJlbnQgb3B0aW9uLCBzaG93IGZvcm0gdmFsdWUuICovXG4gIGdldCB3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhJZCA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBpc0Zvcm1IdG1sID0gZm9ybVZhbHVlICYmIChTdHJpbmcoZm9ybVZhbHVlKS5pbmNsdWRlcygnPCcpIHx8IFN0cmluZyhmb3JtVmFsdWUpLmluY2x1ZGVzKCc+JykpO1xuICAgIGlmIChjb25maWdXaXRoSWQ/Lm5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB0aGlzLm5hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgICAob3B0aW9uOiBhbnkpID0+IFN0cmluZyhvcHRpb24uaWQpID09PSBTdHJpbmcoY29uZmlnV2l0aElkLm5hdHVyYWxUZXh0QWN0aW9uSWQpXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gbWF0Y2hpbmdPcHRpb24ubmF0dXJhbFRleHQgPz8gbWF0Y2hpbmdPcHRpb24ubmFtZSA/PyBtYXRjaGluZ09wdGlvbi52YWx1ZSA/PyAnJztcbiAgICAgICAgaWYgKG5hdHVyYWxUZXh0KSB7XG4gICAgICAgICAgY29uc3QgbmF0dXJhbFRleHRTdHIgPSBTdHJpbmcobmF0dXJhbFRleHQpO1xuICAgICAgICAgIC8vIFNob3cgc2VsZWN0ZWQ6IHdoZW4gZm9ybSBpcyBlbXB0eSAoaW5pdGlhbCBvcGVuKSwgb3IgZm9ybSBtYXRjaGVzIHRoaXMgb3B0aW9uLCBvciBmb3JtIGhhcyBIVE1MLiBPbmx5IHVzZSBmb3JtIHZhbHVlIHdoZW4gdXNlciBwaWNrZWQgYSBkaWZmZXJlbnQgb3B0aW9uLlxuICAgICAgICAgIGlmICghZm9ybVZhbHVlIHx8IGZvcm1WYWx1ZSA9PT0gbmF0dXJhbFRleHRTdHIgfHwgaXNGb3JtSHRtbCkgcmV0dXJuIG5hdHVyYWxUZXh0U3RyO1xuICAgICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9ybUh0bWwpIHJldHVybiAnJztcbiAgICByZXR1cm4gZm9ybVZhbHVlO1xuICB9XG5cbiAgb25Db25kaXRpb25TZWxlY3Qob3B0aW9uOiBDcWFBdXRvY29tcGxldGVPcHRpb24gJiB7IHRlbXBsYXRlPzogYW55IH0pOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtPy5nZXQoJ2NvbmRpdGlvbicpPy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIGNvbnN0IG1hdGNoaW5nVGVtcGxhdGUgPSBvcHRpb24udGVtcGxhdGU7XG4gICAgbGV0IGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nVGVtcGxhdGU7XG4gICAgaWYgKCFmdWxsVGVtcGxhdGUgfHwgIWZ1bGxUZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gKHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgICAgKG9wdDogYW55KSA9PiBvcHQubmF0dXJhbFRleHQgPT09IG9wdGlvbi52YWx1ZSB8fCBvcHQubmFtZSA9PT0gb3B0aW9uLnZhbHVlIHx8IG9wdC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlXG4gICAgICApIGFzIGFueTtcbiAgICAgIGZ1bGxUZW1wbGF0ZSA9IG1hdGNoaW5nT3B0aW9uPy50ZW1wbGF0ZSB8fCBtYXRjaGluZ09wdGlvbjtcbiAgICB9XG4gICAgaWYgKGZ1bGxUZW1wbGF0ZSAmJiBmdWxsVGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBmdWxsVGVtcGxhdGU7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhmdWxsVGVtcGxhdGUpIHx8IFtdO1xuICAgICAgdGhpcy5idWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvLyBBdXRvLW9wZW4gRWRpdCBJbiBkZXB0aCB3aGVuIHVzZXIgc2VsZWN0cyBhIGNvbmRpdGlvbiBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgLy8gUGFzcyBmdWxsVGVtcGxhdGUgc28gdGhlIG1vZGFsIHNob3dzIHRoZSBuZXdseSBzZWxlY3RlZCB0ZW1wbGF0ZSwgbm90IHRoZSBvbGQgc3RlcCB0ZW1wbGF0ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub25FZGl0SW5EZXB0aChmdWxsVGVtcGxhdGUpLCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlbXBsYXRlVmFyaWFibGVzRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0ucmVtb3ZlQ29udHJvbChrZXkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ1dpdGhEYXRhID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGNvbmZpZ1dpdGhEYXRhLnRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xuICAgICAgaWYgKGV4aXN0aW5nRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBleGlzdGluZ0RhdGFbdmFyaWFibGUubmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICA/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/ICdGT1IgTE9PUCcgOiAnV0hJTEUgTE9PUCc7XG4gIH1cblxuICBpc1doaWxlTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ3doaWxlJztcbiAgfVxuXG4gIGlzRm9yTG9vcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2Zvcic7XG4gIH1cblxuICBnZXRTdGFydExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ1NUQVJUIEZPUicgOiAnU1RBUlQgV0hJTEUnO1xuICB9XG5cbiAgZ2V0RW5kTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRU5EIEZPUicgOiAnRU5EIFdISUxFJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgc3RhcnQgaW5kZXg6IHByZWZlciBmb3JMb29wU3RhcnRJbmRleCBmcm9tIHN0ZXAgKG9yIGRhdGFNYXBKc29uL2RhdGFNYXBCZWFuKSwgZWxzZSBzdGFydFN0ZXAsIGVsc2UgZnJvbSBuZXN0ZWQgc3RlcHMgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5U3RhcnRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBKc29uPy5mb3JMb29wU3RhcnRJbmRleCA/PyBjZmc/LmRhdGFNYXBCZWFuPy5mb3JfbG9vcD8uc3RhcnRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdGhpcy5zdGFydFN0ZXA7XG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgZGlzcGxheSBlbmQgaW5kZXg6IHByZWZlciBmb3JMb29wRW5kSW5kZXggZnJvbSBzdGVwIChvciBkYXRhTWFwSnNvbi9kYXRhTWFwQmVhbiksIGVsc2UgZW5kU3RlcCwgZWxzZSBmcm9tIG5lc3RlZCBzdGVwcyAqL1xuICBwcml2YXRlIGdldERpc3BsYXlFbmRJbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gTnVtYmVyKHYpO1xuICAgIGlmICh0aGlzLmVuZFN0ZXAgIT0gbnVsbCkgcmV0dXJuIHRoaXMuZW5kU3RlcDtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBsYXN0Py5zdGVwTnVtYmVyIGFzIG51bWJlciB8IHVuZGVmaW5lZCA/PyB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGRpc3BsYXkgcHJvZmlsZSBuYW1lOiBtYXAgZm9yTG9vcFRlc3REYXRhSWQgdG8gcHJvZmlsZSBuYW1lIGZyb20gZGF0YVByb2ZpbGVPcHRpb25zLCBlbHNlIHVzZSB0ZXN0RGF0YVByb2ZpbGUgKi9cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGVzdERhdGFQcm9maWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCBpZCA9IGNmZz8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcFRlc3REYXRhSWQgPz8gY2ZnPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKGlkICE9IG51bGwgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGFQcm9maWxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvID0+IG8uaWQgPT09IGlkIHx8IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKGlkKVxuICAgICAgKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlbGVjdGVkIGRhdGEgcHJvZmlsZSAoYnkgZm9yTG9vcFRlc3REYXRhSWQgb3IgZm9ybSB2YWx1ZSksIG9yIG51bGwuICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpOiBEYXRhUHJvZmlsZU9wdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb2ZpbGVJZCA9IHRoaXMuZWRpdEZvcm0/LmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5mb3JMb29wVGVzdERhdGFJZCA/PyAodGhpcy5jb25maWcgYXMgYW55KT8uZGF0YU1hcEpzb24/LmZvckxvb3BUZXN0RGF0YUlkID8/ICh0aGlzLmNvbmZpZyBhcyBhbnkpPy5kYXRhTWFwQmVhbj8uZm9yX2xvb3A/LnRlc3REYXRhSWQ7XG4gICAgaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8ICF0aGlzLmRhdGFQcm9maWxlT3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQoXG4gICAgICAobzogRGF0YVByb2ZpbGVPcHRpb24pID0+IFN0cmluZyhvLmlkKSA9PT0gU3RyaW5nKHByb2ZpbGVJZCkgfHwgby5pZCA9PT0gcHJvZmlsZUlkXG4gICAgKTtcbiAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBHZXQgZGlzcGxheSBuYW1lIGZvciBhIDEtYmFzZWQgcm93IGluZGV4IGZyb20gdGhlIHNlbGVjdGVkIHByb2ZpbGUncyBkYXRhIGFycmF5IChkYXRhW2luZGV4LTFdLm5hbWUpLiBSZXR1cm5zIG51bGwgaWYgbm8gbmFtZS4gKi9cbiAgcHJpdmF0ZSBnZXREYXRhUm93TmFtZUZvck9uZUJhc2VkSW5kZXgob25lQmFzZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhUHJvZmlsZSgpO1xuICAgIGlmICghcHJvZmlsZT8uZGF0YSB8fCAhQXJyYXkuaXNBcnJheShwcm9maWxlLmRhdGEpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZHggPSBvbmVCYXNlZEluZGV4IC0gMTtcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gcHJvZmlsZS5kYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgcm93ID0gcHJvZmlsZS5kYXRhW2lkeF07XG4gICAgcmV0dXJuIHJvdyAmJiAocm93Lm5hbWUgIT0gbnVsbCA/IFN0cmluZyhyb3cubmFtZSkgOiBudWxsKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRlc3QgZGF0YSBwcm9maWxlIGlzIHNldCAoc28gd2UgY2FuIHNob3cvaGlkZSB0aGUgY2hpcCkgKi9cbiAgaGFzVGVzdERhdGFQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHN0YXJ0IHZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IChjb25maWcgb3Igc3RhcnRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc1N0YXJ0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHYgPSBjZmc/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEpzb24/LmZvckxvb3BTdGFydEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5zdGFydEluZGV4O1xuICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLnN0YXJ0U3RlcCAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogV2hldGhlciBlbmQgdmFsdWUgaXMgZXhwbGljaXRseSBzZXQgKGNvbmZpZyBvciBlbmRTdGVwIGlucHV0KSwgbm90IGluZmVycmVkIGZyb20gbmVzdGVkIHN0ZXBzICovXG4gIGhhc0VuZFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB2ID0gY2ZnPy5mb3JMb29wRW5kSW5kZXggPz8gY2ZnPy5kYXRhTWFwSnNvbj8uZm9yTG9vcEVuZEluZGV4ID8/IGNmZz8uZGF0YU1hcEJlYW4/LmZvcl9sb29wPy5lbmRJbmRleDtcbiAgICBpZiAodiAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5lbmRTdGVwICE9IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFN0ZXBzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcwIHN0ZXBzJztcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmdldERpc3BsYXlTdGFydEluZGV4KCkgPz8gMTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLmdldERpc3BsYXlFbmRJbmRleCgpID8/IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBTdGVwcyAke3N0YXJ0fS0ke2VuZH0gKCR7Y291bnR9IHN0ZXAke2NvdW50ICE9PSAxID8gJ3MnIDogJyd9KWA7XG4gIH1cblxuICBnZXRTdGFydFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5nZXREaXNwbGF5U3RhcnRJbmRleCgpO1xuICAgIGlmIChzdGFydCA9PSBudWxsKSByZXR1cm4gYFN0YXJ0OiAke3RoaXMubmVzdGVkU3RlcHNbMF0/LnN0ZXBOdW1iZXIgPz8gMX1gO1xuICAgIC8vIElmIHN0YXJ0IGlzIC0xLCB1c2VyIHNlbGVjdGVkIFwiU3RhcnRcIiBvcHRpb24sIGp1c3QgcmV0dXJuIFwiU3RhcnRcIlxuICAgIGlmIChzdGFydCA9PT0gLTEpIHJldHVybiAnU3RhcnQnO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChzdGFydCk7XG4gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IGBTdGFydDogJHtuYW1lfWAgOiBgU3RhcnQ6ICR7c3RhcnR9YDtcbiAgfVxuXG4gIGdldEVuZFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0RGlzcGxheUVuZEluZGV4KCk7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBjb25zdCBkZWZhdWx0RW5kID0gdGhpcy5uZXN0ZWRTdGVwc1t0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCAtIDFdPy5zdGVwTnVtYmVyID8/IHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGBFbmQ6ICR7ZGVmYXVsdEVuZH1gO1xuICAgIH1cbiAgICAvLyBJZiBlbmQgaXMgLTEsIHVzZXIgc2VsZWN0ZWQgXCJFbmRcIiBvcHRpb24sIGp1c3QgcmV0dXJuIFwiRW5kXCJcbiAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuICdFbmQnO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFSb3dOYW1lRm9yT25lQmFzZWRJbmRleChlbmQpO1xuICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBgRW5kOiAke25hbWV9YCA6IGBFbmQ6ICR7ZW5kfWA7XG4gIH1cblxuICBnZXRUZXN0RGF0YVByb2ZpbGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgaWYgKG5hbWUpIHJldHVybiBgVGVzdCBEYXRhIHByb2ZpbGU6ICR7bmFtZX1gO1xuICAgIHJldHVybiAnVGVzdCBEYXRhIHByb2ZpbGUnO1xuICB9XG5cbiAgLyoqIENvbWJpbmVkIGRpc3BsYXkgZm9yIGZvciBsb29wIHdpdGggSFRNTCBiYWRnZXMgLSBzdXBwb3J0cyB0ZXN0X2RhdGEgYmFkZ2VzIGxpa2UgY29uZGl0aW9uIHN0ZXA7IGRhdGEta2V5L2RhdGEtZXZlbnQta2V5IGVuYWJsZSBjbGljay10by1lZGl0ICovXG4gIGdldEZvckxvb3BEaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgIGlmIChjZmc/LmZvckxvb3BEaXNwbGF5SHRtbCkgcmV0dXJuIGNmZy5mb3JMb29wRGlzcGxheUh0bWw7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuaGFzVGVzdERhdGFQcm9maWxlKCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERpc3BsYXlUZXN0RGF0YVByb2ZpbGVOYW1lKCk7XG4gICAgICBwYXJ0cy5wdXNoKGBUZXN0IERhdGEgcHJvZmlsZTogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cInRlc3REYXRhUHJvZmlsZVwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKG5hbWUpfTwvc3Bhbj5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRWYWx1ZSgpKSB7XG4gICAgICBjb25zdCBmdWxsID0gdGhpcy5nZXRTdGFydFN0ZXBMYWJlbCgpO1xuICAgICAgY29uc3QgdmFsdWUgPSBmdWxsLnJlcGxhY2UoL15TdGFydDpcXHMqLywgJycpO1xuICAgICAgcGFydHMucHVzaChgU3RhcnQ6IDxzcGFuIGRhdGEta2V5PVwidGVzdC1kYXRhXCIgZGF0YS1ldmVudC1rZXk9XCJmb3JMb29wU3RhcnRJbmRleFwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKHZhbHVlKX08L3NwYW4+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0VuZFZhbHVlKCkpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSB0aGlzLmdldEVuZFN0ZXBMYWJlbCgpO1xuICAgICAgY29uc3QgdmFsdWUgPSBmdWxsLnJlcGxhY2UoL15FbmQ6XFxzKi8sICcnKTtcbiAgICAgIHBhcnRzLnB1c2goYEVuZDogPHNwYW4gZGF0YS1rZXk9XCJ0ZXN0LWRhdGFcIiBkYXRhLWV2ZW50LWtleT1cImZvckxvb3BFbmRJbmRleFwiIGNsYXNzPVwidGVzdF9kYXRhXCI+JHt0aGlzLmVzY2FwZUZvckxvb3BIdG1sKHZhbHVlKX08L3NwYW4+YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVGb3JMb29wSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvKiogRnVsbCBkaXNwbGF5IGZvciB3aGlsZSBsb29wOiBcIldoaWxlIGVsZW1lbnQgXCIuc2VsZWN0b3JcIiBleGlzdHMgKG1heCBOIGl0ZXJhdGlvbnMpXCIgLSBzdXBwb3J0cyBIVE1MIGJhZGdlcyB2aWEgaW5uZXJIVE1MICovXG4gIGdldENvbmRpdGlvbkRpc3BsYXkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5jb25kaXRpb24gfHwgJ2VsZW1lbnQgXCIubm90aWZpY2F0aW9uLWJhZGdlXCIgZXhpc3RzJztcbiAgICBjb25zdCB3aXRoV2hpbGUgPSBiYXNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnd2hpbGUgJykgPyBiYXNlIDogYFdoaWxlICR7YmFzZX1gO1xuICAgIGNvbnN0IGhhc01heEl0ZXJhdGlvbnMgPSAvXFwobWF4XFxzK1xcZCtcXHMraXRlcmF0aW9uc1xcKS9pLnRlc3Qod2l0aFdoaWxlKTtcbiAgICBpZiAoIWhhc01heEl0ZXJhdGlvbnMgJiYgdGhpcy5tYXhJdGVyYXRpb25zICE9IG51bGwgJiYgdGhpcy5tYXhJdGVyYXRpb25zID4gMCkge1xuICAgICAgcmV0dXJuIGAke3dpdGhXaGlsZX0gKG1heCAke3RoaXMubWF4SXRlcmF0aW9uc30gaXRlcmF0aW9ucylgO1xuICAgIH1cbiAgICByZXR1cm4gd2l0aFdoaWxlO1xuICB9XG5cbiAgLyoqIEV2ZW50IGtleS12YWx1ZSBwYWlycyBmb3IgZGlzcGxheSAoZS5nLiBzZWxlY3RvciwgZWxlbWVudCkgLSBzYW1lIGFzIGNvbmRpdGlvbiBzdGVwIGdldEJyYW5jaEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkgKi9cbiAgZ2V0TG9vcEV2ZW50RGV0YWlsc0ZvckRpc3BsYXkoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5jb25maWc/LmV2ZW50O1xuICAgIGlmICghZXZlbnQgfHwgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhldmVudClcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09ICdjdXN0b21FdmVudCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpIDogJydcbiAgICAgIH0pKTtcbiAgfVxuXG4gIG9uVG9nZ2xlRXhwYW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh7Y29uZmlnOnRoaXMuY29uZmlnLCBleHBhbmRlZDp0aGlzLmV4cGFuZGVkfSk7XG4gIH1cblxuICBvblRlc3REYXRhUHJvZmlsZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB2YWx1ZTtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU3RhcnRTdGVwQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3RhcnRTdGVwQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25FbmRTdGVwQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFN0ZXAgPSB2YWx1ZTtcbiAgICB0aGlzLmVuZFN0ZXBDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkNvbmRpdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmRpdGlvbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uTWF4SXRlcmF0aW9uc0NoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gdmFsdWU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmVzdGVkU3RlcENoYW5nZS5lbWl0KHsgc3RlcCwgaW5kZXggfSk7XG4gIH1cblxuICBvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBib29sZWFuIHwge2NvbmZpZzogVGVzdENhc2VTdGVwQ29uZmlnLCBleHBhbmRlZDogYm9vbGVhbn0sIHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBib3RoIGJvb2xlYW4gYW5kIG9iamVjdCBmb3JtYXRzXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgZXZlbnQgIT09IG51bGwgJiYgJ2V4cGFuZGVkJyBpbiBldmVudCkge1xuICAgICAgLy8gT2JqZWN0IGZvcm1hdCBmcm9tIHN0ZXAtZ3JvdXA6IHtjb25maWcsIGV4cGFuZGVkfVxuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50LmV4cGFuZGVkO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50J3MgY29uZmlnIGlzIGEgc3RlcC1ncm91cCAobm90IHRoZSBjdXJyZW50IHN0ZXApXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbmVzdGVkIHN0ZXAtZ3JvdXAgZXZlbnRzIGJ1YmJsZSB1cCBjb3JyZWN0bHkgZXZlbiB3aGVuIGNvbmRpdGlvbiBzdGVwIGlzIGluc2lkZSBsb29wIHN0ZXBcbiAgICAgIGlmICh0aGlzLmlzU3RlcEdyb3VwKGV2ZW50LmNvbmZpZykpIHtcbiAgICAgICAgLy8gUmUtZW1pdCB0aGUgdG9nZ2xlRXhwYW5kZWQgZXZlbnQgd2l0aCB0aGUgb2JqZWN0IGZvcm1hdCwgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIC8vIENhc3QgdG8gc2F0aXNmeSBUeXBlU2NyaXB0IC0gdGhlIHJlbmRlcmVyIGFjY2VwdHMgVGVzdENhc2VTdGVwQ29uZmlnIHdoaWNoIGluY2x1ZGVzIFN0ZXBHcm91cENvbmZpZ1xuICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQoe2NvbmZpZzogZXZlbnQuY29uZmlnIGFzIGFueSBhcyBMb29wU3RlcENvbmZpZywgZXhwYW5kZWQ6IGV2ZW50LmV4cGFuZGVkfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvb2xlYW4gZm9ybWF0IGZyb20gb3RoZXIgc3RlcCB0eXBlc1xuICAgICAgKHN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV2ZW50IGFzIGJvb2xlYW47XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uQWRkU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFN0ZXAuZW1pdCgpO1xuICB9XG5cbiAgLyoqIFJlLWVtaXQgYWRkU3RlcEZvckxvb3AgZnJvbSBuZXN0ZWQgbG9vcCBzbyBOLWxldmVsIG5lc3Rpbmcgd29ya3MgKGVtcHR5LXN0YXRlIGFkZCBzdGVwKS4gKi9cbiAgb25BZGRTdGVwRm9yTG9vcEZyb21OZXN0ZWQoZXZlbnQ6IHsgbG9vcFN0ZXBDb25maWc6IExvb3BTdGVwQ29uZmlnIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/Lmxvb3BTdGVwQ29uZmlnKSB7XG4gICAgICB0aGlzLmFkZFN0ZXAuZW1pdCh7IGxvb3BTdGVwQ29uZmlnOiBldmVudC5sb29wU3RlcENvbmZpZyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRTdGVwLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIGZyb20gZW1wdHktc3RhdGUgcGx1cyBvbmx5OyBzYW1lIGJlaGF2aW91ciBhcyBhZGQtc3RlcC1iZXR3ZWVuIChwYXJlbnRJZCA9IGxvb3Agc3RlcCBpZCwgcG9zaXRpb24gPSBwYXJlbnQgKyAxKS4gKi9cbiAgb25BZGRTdGVwRW1wdHkoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRTdGVwLmVtaXQoeyBsb29wU3RlcENvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gIH1cblxuICBvbkRlbGV0ZVN0ZXAocGF5bG9hZE9ySW5kZXg6IGFueSwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZHggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBwYXlsb2FkT3JJbmRleDtcbiAgICBjb25zdCBwYXlsb2FkID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHBheWxvYWRPckluZGV4IDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVsZXRlU3RlcC5lbWl0KGlkeCk7XG4gICAgaWYgKHBheWxvYWQ/LnN0ZXApIHRoaXMuZGVsZXRlLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICAvKiogUmUtZW1pdCBlZGl0IGZyb20gbmVzdGVkIHN0ZXAgc28gdGhlIHBvcnRhbCBjYW4gb3BlbiBlZGl0IG1vZGFsIChzYW1lIGFzIHJvb3QgbGV2ZWwpLiAqL1xuICBvbk5lc3RlZEVkaXQoZXZlbnQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LnN0ZXAgIT0gbnVsbCkgdGhpcy5lZGl0LmVtaXQoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIC8qKiBSZS1lbWl0IGR1cGxpY2F0ZSBmcm9tIG5lc3RlZCBzdGVwIHNvIHRoZSBwb3J0YWwgY2FuIGR1cGxpY2F0ZSAoc2FtZSBhcyByb290IGxldmVsKS4gKi9cbiAgb25OZXN0ZWREdXBsaWNhdGUoZXZlbnQ6IGFueSwgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgoZXZlbnQgJiYgZXZlbnQuc3RlcCAhPSBudWxsKSA/IGV2ZW50IDogeyBzdGVwIH0gYXMgYW55KTtcbiAgfVxuXG4gIGlzTm9ybWFsU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIE5vcm1hbFN0ZXBDb25maWcge1xuICAgIHJldHVybiAnZXZlbnRUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNMb29wU3RlcChzdGVwOiBUZXN0Q2FzZVN0ZXBDb25maWcpOiBzdGVwIGlzIExvb3BTdGVwQ29uZmlnIHtcbiAgICByZXR1cm4gJ2xvb3BUeXBlJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNDb25kaXRpb25TdGVwKHN0ZXA6IFRlc3RDYXNlU3RlcENvbmZpZyk6IHN0ZXAgaXMgQ29uZGl0aW9uU3RlcENvbmZpZyB7XG4gICAgcmV0dXJuICdjb25kaXRpb24nIGluIHN0ZXAgJiYgJ2JyYW5jaGVzJyBpbiBzdGVwO1xuICB9XG5cbiAgaXNTdGVwR3JvdXAoc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnKTogc3RlcCBpcyBTdGVwR3JvdXBDb25maWcge1xuICAgIHJldHVybiAnZ3JvdXBOYW1lJyBpbiBzdGVwO1xuICB9XG5cbiAgb25BZGRCcmFuY2goKTogdm9pZCB7XG4gICAgLy8gTm90IHVzZWQgaW4gbG9vcCBzdGVwLCBidXQgbmVlZGVkIGZvciByZWN1cnNpdmUgY29uZGl0aW9uIHN0ZXBzXG4gIH1cblxuICBvbkRlbGV0ZUJyYW5jaChicmFuY2g6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIGNvbmRpdGlvbiBzdGVwc1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEFkZCBhIG5ldyBicmFuY2ggdG8gdGhlIG5lc3RlZCBjb25kaXRpb24gc3RlcFxuICAgIGlmICghbmVzdGVkU3RlcC5icmFuY2hlcykge1xuICAgICAgbmVzdGVkU3RlcC5icmFuY2hlcyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBuZXdCcmFuY2g6IENvbmRpdGlvbkJyYW5jaCA9IHtcbiAgICAgIHR5cGU6IG5lc3RlZFN0ZXAuYnJhbmNoZXMubGVuZ3RoID09PSAwID8gJ2lmJyA6ICdlbHNlJyxcbiAgICAgIGxhYmVsOiBuZXN0ZWRTdGVwLmJyYW5jaGVzLmxlbmd0aCA9PT0gMCA/ICdJRiBUUlVFJyA6ICdFTFNFJywgXG4gICAgICBzdGVwVHlwZTogU3RlcFR5cGVzLkNPTkRJVElPTl9JRixcbiAgICAgIG5lc3RlZFN0ZXBzOiBbXVxuICAgIH07XG4gICAgbmVzdGVkU3RlcC5icmFuY2hlcy5wdXNoKG5ld0JyYW5jaCk7XG4gICAgdGhpcy5vbk5lc3RlZFN0ZXBDaGFuZ2UobmVzdGVkU3RlcCwgaW5kZXgpO1xuICB9XG5cbiAgb25OZXN0ZWRDb25kaXRpb25EZWxldGVCcmFuY2gobmVzdGVkU3RlcDogQ29uZGl0aW9uU3RlcENvbmZpZywgYnJhbmNoOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBEZWxldGUgYSBicmFuY2ggZnJvbSB0aGUgbmVzdGVkIGNvbmRpdGlvbiBzdGVwXG4gICAgaWYgKG5lc3RlZFN0ZXAuYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaEluZGV4ID0gbmVzdGVkU3RlcC5icmFuY2hlcy5pbmRleE9mKGJyYW5jaCk7XG4gICAgICBpZiAoYnJhbmNoSW5kZXggPiAtMSkge1xuICAgICAgICBuZXN0ZWRTdGVwLmJyYW5jaGVzLnNwbGljZShicmFuY2hJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25OZXN0ZWRTdGVwQ2hhbmdlKG5lc3RlZFN0ZXAsIGluZGV4KTtcbiAgfVxuXG4gIG9uT3BlbkV4dGVybmFsKCk6IHZvaWQge1xuICAgIC8vIE5vdCB1c2VkIGluIGxvb3Agc3RlcCwgYnV0IG5lZWRlZCBmb3IgcmVjdXJzaXZlIHN0ZXAgZ3JvdXBzXG4gIH1cblxuICAvKiogU3luYyBGT1IgbG9vcCBlZGl0IGZvcm0gc28gZHJvcGRvd25zIHNob3cgZXhpc3RpbmcgY29uZmlnIChmb3JPcHRpb25UeXBlLCBmb3JMb29wVGVzdERhdGFJZC90ZXN0RGF0YVByb2ZpbGUsIGZvckxvb3BTdGFydEluZGV4L2Zvckxvb3BFbmRJbmRleCkgKi9cbiAgcHJpdmF0ZSBzeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdEZvcm0gfHwgdGhpcy5sb29wVHlwZSAhPT0gJ2ZvcicpIHJldHVybjtcbiAgICBjb25zdCB0ZXN0RGF0YVZhbCA9IHRoaXMuZ2V0VGVzdERhdGFQcm9maWxlRm9ybVZhbHVlKCk7XG4gICAgY29uc3Qgc3RhcnRWYWwgPSB0aGlzLmdldExvb3BTdGFydEZvcm1WYWx1ZSgpO1xuICAgIGNvbnN0IGVuZFZhbCA9IHRoaXMuZ2V0TG9vcEVuZEZvcm1WYWx1ZSgpO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmb3JPcHRpb25UeXBlOiB0aGlzLmdldEZvck9wdGlvblR5cGVGcm9tQ29uZmlnKCkgPz8gbnVsbCxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFWYWwsXG4gICAgICBzdGFydFN0ZXA6IHN0YXJ0VmFsLFxuICAgICAgZW5kU3RlcDogZW5kVmFsLFxuICAgIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgc2V0IGVhY2ggY29udHJvbCBzbyBtYXQtc2VsZWN0IHBpY2tzIHVwIHRoZSB2YWx1ZSAocGF0Y2hWYWx1ZSBjYW4gYmUgaWdub3JlZCBieSBjaGlsZCBpbiBzb21lIHRpbWluZyBjYXNlcylcbiAgICBjb25zdCB0ZXN0RGF0YUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgY29uc3Qgc3RhcnRDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXJ0U3RlcCcpO1xuICAgIGNvbnN0IGVuZEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5kU3RlcCcpO1xuICAgIGlmICh0ZXN0RGF0YUN0cmwgJiYgdGVzdERhdGFWYWwgIT09IHVuZGVmaW5lZCAmJiB0ZXN0RGF0YVZhbCAhPT0gJycpIHRlc3REYXRhQ3RybC5zZXRWYWx1ZSh0ZXN0RGF0YVZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGlmIChzdGFydEN0cmwgJiYgc3RhcnRWYWwgIT0gbnVsbCkgc3RhcnRDdHJsLnNldFZhbHVlKHN0YXJ0VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgaWYgKGVuZEN0cmwgJiYgZW5kVmFsICE9IG51bGwpIGVuZEN0cmwuc2V0VmFsdWUoZW5kVmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFNuYXBzaG90ID0ge1xuICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSxcbiAgICAgIHN0YXJ0U3RlcDogdGhpcy5zdGFydFN0ZXAsXG4gICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9uLFxuICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zLFxuICAgICAgc2VsZWN0ZWRUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPyBbLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc10gOiBbXSxcbiAgICAgIGNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlOiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybSA/IHsgLi4udGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0udmFsdWUgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIEZPUiBsb29wOiByZWZyZXNoIHNlbGVjdCBjb25maWdzIChzbyBUZXN0IERhdGEgUHJvZmlsZSBvcHRpb25zIGluY2x1ZGUgc2VsZWN0ZWQgaWQgaWYgbmVlZGVkKSB0aGVuIHN5bmMgZm9ybSBzbyBkcm9wZG93bnMgc2hvdyBzZWxlY3RlZFxuICAgIGlmICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgdGhpcy51cGRhdGVGb3JMb29wU2VsZWN0Q29uZmlnc1NlbGVjdGVkVmFsdWVzKCk7XG4gICAgICB0aGlzLnN5bmNGb3JMb29wRWRpdEZvcm1Gcm9tQ29uZmlnKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jRm9yTG9vcEVkaXRGb3JtRnJvbUNvbmZpZygpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlOiB0aGlzLnRlc3REYXRhUHJvZmlsZSA/PyAnJyxcbiAgICAgICAgc3RhcnRTdGVwOiB0aGlzLnN0YXJ0U3RlcCA/PyBudWxsLFxuICAgICAgICBlbmRTdGVwOiB0aGlzLmVuZFN0ZXAgPz8gbnVsbCxcbiAgICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbiA/PyAnJyxcbiAgICAgICAgbWF4SXRlcmF0aW9uczogdGhpcy5tYXhJdGVyYXRpb25zID8/IDUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIC8vIFdoZW4gbmF0dXJhbFRleHRBY3Rpb25JZCBleGlzdHMsIHBvcHVsYXRlIGNvbmRpdGlvbiBhbmQgc2VsZWN0ZWQgdGVtcGxhdGUgZnJvbSBvcHRpb25zIHNvIGF1dG9jb21wbGV0ZSBzaG93cyBzZWxlY3RlZCB0ZW1wbGF0ZVxuICAgICAgY29uc3QgY29uZmlnV2l0aElkID0gdGhpcy5jb25maWcgYXMgYW55O1xuICAgICAgaWYgKGNvbmZpZ1dpdGhJZD8ubmF0dXJhbFRleHRBY3Rpb25JZCAhPSBudWxsICYmIHRoaXMubmF0dXJhbFRleHRBY3Rpb25zT3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVidWlsZFdoaWxlQ29uZGl0aW9uRnJvbU5hdHVyYWxUZXh0QWN0aW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZGl0aW9uIHx8IGNvbmZpZ1dpdGhJZD8udGVtcGxhdGVWYXJpYWJsZXNEYXRhKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBtYXRjaCBieSBjb25kaXRpb24gdGV4dCB3aGVuIG5hdHVyYWxUZXh0QWN0aW9uSWQgbm90IHNldFxuICAgICAgICBjb25zdCBjb25kaXRpb25TdHIgPSB0aGlzLmNvbmRpdGlvbiB8fCBjb25maWdXaXRoSWQ/LmNvbmRpdGlvbiB8fCAnJztcbiAgICAgICAgaWYgKGNvbmRpdGlvblN0ciAmJiAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIHx8IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSAodGhpcy5uYXR1cmFsVGV4dEFjdGlvbnNPcHRpb25zIGFzIGFueVtdKS5maW5kKFxuICAgICAgICAgICAgKG9wdDogYW55KSA9PiAob3B0Lm5hdHVyYWxUZXh0IHx8IG9wdC5uYW1lIHx8IG9wdC52YWx1ZSkgPT09IGNvbmRpdGlvblN0clxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZnVsbFRlbXBsYXRlID0gbWF0Y2hpbmdPcHRpb24/LnRlbXBsYXRlIHx8IG1hdGNoaW5nT3B0aW9uO1xuICAgICAgICAgIGlmIChmdWxsVGVtcGxhdGUgJiYgZnVsbFRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZnVsbFRlbXBsYXRlO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMoZnVsbFRlbXBsYXRlKSB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRUZW1wbGF0ZVZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24gPz8gJycsXG4gICAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyA/PyA1LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXQuZW1pdCgpO1xuICB9XG5cbiAgb25FZGl0QXBwbHkoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuZWRpdEZvcm0udmFsdWU7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsdWUgPSB2LnRlc3REYXRhUHJvZmlsZSA/PyAnJztcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHYuc3RhcnRTdGVwID8/IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZFN0ZXAgPSB2LmVuZFN0ZXAgPz8gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZGl0aW9uID0gdi5jb25kaXRpb24gPz8gJyc7XG4gICAgY29uc3QgbWF4VmFsID0gdi5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHR5cGVvZiBtYXhWYWwgPT09ICdudW1iZXInID8gbWF4VmFsIDogKG1heFZhbCAhPSBudWxsICYmIG1heFZhbCAhPT0gJycgPyBOdW1iZXIobWF4VmFsKSA6IHVuZGVmaW5lZCk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgc2VsZWN0ZWQgZGF0YSBwcm9maWxlIG9wdGlvbiB0byBnZXQgYm90aCBJRCBhbmQgbmFtZVxuICAgIGxldCB0ZXN0RGF0YVByb2ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0ZXN0RGF0YVByb2ZpbGVOYW1lOiBzdHJpbmcgPSAnJztcbiAgICBcbiAgICBpZiAodGVzdERhdGFQcm9maWxlVmFsdWUgJiYgdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGZvcm0gdmFsdWUgbWlnaHQgYmUgSUQgKG51bWJlcikgb3IgbmFtZSAoc3RyaW5nKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlID0gdGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMuZmluZChcbiAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gTnVtYmVyKHRlc3REYXRhUHJvZmlsZVZhbHVlKSB8fCBvcHRpb24ubmFtZSA9PT0gdGVzdERhdGFQcm9maWxlVmFsdWUgfHwgU3RyaW5nKG9wdGlvbi5pZCkgPT09IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGVWYWx1ZSlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWRQcm9maWxlKSB7XG4gICAgICAgIHRlc3REYXRhUHJvZmlsZUlkID0gc2VsZWN0ZWRQcm9maWxlLmlkO1xuICAgICAgICB0ZXN0RGF0YVByb2ZpbGVOYW1lID0gc2VsZWN0ZWRQcm9maWxlLm5hbWU7XG4gICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlID0gdGVzdERhdGFQcm9maWxlTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSB2YWx1ZSBhcy1pcyAobWlnaHQgYmUgSUQgb3IgbmFtZSlcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZTtcbiAgICAgICAgdGVzdERhdGFQcm9maWxlSWQgPSBOdW1iZXIodGVzdERhdGFQcm9maWxlVmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGVWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gV2hpbGUgbG9vcDogYnVpbGQgdGVtcGxhdGVWYXJpYWJsZXNEYXRhIGFuZCBuYXR1cmFsVGV4dEFjdGlvbklkIGZyb20gc2VsZWN0ZWQgdGVtcGxhdGUgKHNhbWUgYXMgY29uZGl0aW9uLXN0ZXApXG4gICAgbGV0IHRlbXBsYXRlVmFyaWFibGVzRGF0YTogYW55O1xuICAgIGxldCBuYXR1cmFsVGV4dEFjdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScgJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcz8ubGVuZ3RoKSB7XG4gICAgICB0ZW1wbGF0ZVZhcmlhYmxlc0RhdGEgPSB7fTtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZS5uYW1lKT8udmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzRGF0YVt2YXJpYWJsZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGVtcGxhdGU/LmlkICE9IG51bGwpIHtcbiAgICAgICAgbmF0dXJhbFRleHRBY3Rpb25JZCA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIG5ldyB2YWx1ZXMgKGluY2x1ZGUgdGVzdERhdGFQcm9maWxlSWQsIHRlbXBsYXRlVmFyaWFibGVzRGF0YSwgbmF0dXJhbFRleHRBY3Rpb25JZCBmb3Igd2hpbGU7IGZvckxvb3BUZXN0RGF0YUlkLCBmb3JMb29wU3RhcnRJbmRleC9mb3JMb29wRW5kSW5kZXggZm9yIGZvcilcbiAgICBjb25zdCB1cGRhdGVkQ29uZmlnOiBMb29wU3RlcENvbmZpZyAmIHsgdGVzdERhdGFQcm9maWxlSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHRlbXBsYXRlVmFyaWFibGVzRGF0YT86IGFueTsgbmF0dXJhbFRleHRBY3Rpb25JZD86IG51bWJlciB9ID0ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRoaXMudGVzdERhdGFQcm9maWxlLFxuICAgICAgdGVzdERhdGFQcm9maWxlSWQ6IHRlc3REYXRhUHJvZmlsZUlkLCAvLyBBZGQgSUQgZm9yIEFQSSBjYWxsXG4gICAgICBzdGFydFN0ZXA6IHRoaXMuc3RhcnRTdGVwLFxuICAgICAgZW5kU3RlcDogdGhpcy5lbmRTdGVwLFxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmRpdGlvbixcbiAgICAgIG1heEl0ZXJhdGlvbnM6IHRoaXMubWF4SXRlcmF0aW9ucyxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIE9iamVjdC5rZXlzKHRlbXBsYXRlVmFyaWFibGVzRGF0YSB8fCB7fSkubGVuZ3RoID4gMCAmJiB7IHRlbXBsYXRlVmFyaWFibGVzRGF0YSB9KSxcbiAgICAgIC4uLih0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnICYmIG5hdHVyYWxUZXh0QWN0aW9uSWQgIT0gbnVsbCAmJiB7IG5hdHVyYWxUZXh0QWN0aW9uSWQgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB7IGZvckxvb3BUZXN0RGF0YUlkOiBOdW1iZXIodGVzdERhdGFQcm9maWxlSWQpIH0pLFxuICAgICAgLi4uKHRoaXMubG9vcFR5cGUgPT09ICdmb3InICYmIHRoaXMuc3RhcnRTdGVwICE9IG51bGwgJiYgeyBmb3JMb29wU3RhcnRJbmRleDogdGhpcy5zdGFydFN0ZXAgfSksXG4gICAgICAuLi4odGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgJiYgdGhpcy5lbmRTdGVwICE9IG51bGwgJiYgeyBmb3JMb29wRW5kSW5kZXg6IHRoaXMuZW5kU3RlcCB9KSxcbiAgICB9O1xuICAgIFxuICAgIC8vIEVtaXQgaW5kaXZpZHVhbCBjaGFuZ2UgZXZlbnRzXG4gICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVDaGFuZ2UuZW1pdCh0aGlzLnRlc3REYXRhUHJvZmlsZSk7XG4gICAgdGhpcy5zdGFydFN0ZXBDaGFuZ2UuZW1pdCh0aGlzLnN0YXJ0U3RlcCA/PyAxKTtcbiAgICB0aGlzLmVuZFN0ZXBDaGFuZ2UuZW1pdCh0aGlzLmVuZFN0ZXAgPz8gMSk7XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hhbmdlLmVtaXQodGhpcy5jb25kaXRpb24pO1xuICAgICAgdGhpcy5tYXhJdGVyYXRpb25zQ2hhbmdlLmVtaXQodGhpcy5tYXhJdGVyYXRpb25zID8/IDUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IHN0ZXAgdXBkYXRlIGV2ZW50IHdpdGggZnVsbCBjb25maWdcbiAgICBjb25zb2xlLmxvZygnTG9vcC1zdGVwOiBFbWl0dGluZyBzdGVwVXBkYXRlIGV2ZW50JywgdXBkYXRlZENvbmZpZyk7XG4gICAgdGhpcy5zdGVwVXBkYXRlLmVtaXQodXBkYXRlZENvbmZpZyk7XG4gICAgXG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdENhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3REYXRhUHJvZmlsZSA9IHRoaXMuZWRpdFNuYXBzaG90LnRlc3REYXRhUHJvZmlsZTtcbiAgICB0aGlzLnN0YXJ0U3RlcCA9IHRoaXMuZWRpdFNuYXBzaG90LnN0YXJ0U3RlcDtcbiAgICB0aGlzLmVuZFN0ZXAgPSB0aGlzLmVkaXRTbmFwc2hvdC5lbmRTdGVwO1xuICAgIHRoaXMuY29uZGl0aW9uID0gdGhpcy5lZGl0U25hcHNob3QuY29uZGl0aW9uO1xuICAgIHRoaXMubWF4SXRlcmF0aW9ucyA9IHRoaXMuZWRpdFNuYXBzaG90Lm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGhpcy5lZGl0U25hcHNob3Quc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5lZGl0U25hcHNob3QudGVtcGxhdGVWYXJpYWJsZXMgfHwgW107XG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtICYmIHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybS5wYXRjaFZhbHVlKHRoaXMuZWRpdFNuYXBzaG90LmNvbmRpdGlvblRlbXBsYXRlRm9ybVZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdEluRGVwdGgodGVtcGxhdGVPdmVycmlkZT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ251bWJlcicgPyB0aGlzLnN0ZXBOdW1iZXIgOiAodHlwZW9mIHRoaXMuc3RlcE51bWJlciA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0aGlzLnN0ZXBOdW1iZXIsIDEwKSA6IDApO1xuICAgIGNvbnN0IHBheWxvYWQ6IHsgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnOyBpbmRleDogbnVtYmVyOyB0ZW1wbGF0ZU92ZXJyaWRlPzogYW55IH0gPSB7XG4gICAgICBzdGVwOiB0aGlzLmNvbmZpZyBhcyBUZXN0Q2FzZVN0ZXBDb25maWcsXG4gICAgICBpbmRleDogaXNOYU4oaW5kZXgpID8gMCA6IGluZGV4LFxuICAgIH07XG4gICAgaWYgKHRlbXBsYXRlT3ZlcnJpZGUpIHtcbiAgICAgIHBheWxvYWQudGVtcGxhdGVPdmVycmlkZSA9IHRlbXBsYXRlT3ZlcnJpZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uTGluaygpOiB2b2lkIHtcbiAgICAvLyBOb3QgdXNlZCBpbiBsb29wIHN0ZXAsIGJ1dCBuZWVkZWQgZm9yIHJlY3Vyc2l2ZSBzdGVwIGdyb3Vwc1xuICB9XG5cbiAgb25EdXBsaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kdXBsaWNhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk1vcmVPcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubW9yZU9wdGlvbnMuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RGV0YWlscyhldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbiB8fCB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRoaXMubG9vcFR5cGUgPT09ICdmb3InID8gJ0ZPUiBMT09QIERldGFpbHMnIDogJ1dISUxFIExPT1AgRGV0YWlscyc7XG4gICAgICB0aGlzLnZpZXdEZXRhaWxzLmVtaXQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxvb3Atc3RlcC1yb3cgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gIDwhLS0gSW5saW5lIEVkaXQgTW9kZTogc3RvcCBwcm9wYWdhdGlvbiBzbyBkcm9wZG93bi9zZWxlY3QgaW50ZXJhY3Rpb25zIGRvbid0IGJ1YmJsZSBhbmQgY29sbGFwc2UgdGhlIHN0ZXAgb3Igc3RhcnQgZHJhZyAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRWRpdGluZ1wiIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC1ncm93XCI+XG4gICAgICAgIDwhLS0gTG9vcCBUeXBlIExhYmVsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxQzM5OEVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAgICB7eyBnZXRMb29wVHlwZUxhYmVsKCkgfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGT1IgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWR5bmFtaWMtc2VsZWN0IChzYW1lIHVzYWdlIGFzIGRlZmF1bHQgc3RvcmllcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgICAgICA8IS0tIEZpcnN0IHNlbGVjdDogd2lkdGggMjE2LjI1cHgsIGhlaWdodCAzNnB4LCBnYXAgNHB4LCBvcGFjaXR5IDEgLS0+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwiZm9yT3B0aW9uVHlwZVNlbGVjdENvbmZpZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLW1heC13LVsyMTZweF1cIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImVkaXRGb3JtXCIgW2NvbmZpZ109XCJ0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJlZGl0Rm9ybVwiIFtjb25maWddPVwic3RhcnRTdGVwU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZWRpdEZvcm1cIiBbY29uZmlnXT1cImVuZFN0ZXBTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMjE2cHhdXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gV0hJTEUgTE9PUCBpbmxpbmUgZWRpdDogY3FhLWF1dG9jb21wbGV0ZSArIHRlbXBsYXRlIHZhcmlhYmxlcyAoc2FtZSBhcyBjb25kaXRpb24tc3RlcCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1doaWxlTG9vcCgpXCI+XG4gICAgICAgICAgPGNxYS1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwid2hpbGVDb25kaXRpb25BdXRvY29tcGxldGVPcHRpb25zXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aGlsZUNvbmRpdGlvbkRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdjb25kaXRpb24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3QpPVwib25Db25kaXRpb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb25kaXRpb25cIlxuICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtbWF4LXctWzIxNnB4XVwiPlxuICAgICAgICAgIDwvY3FhLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8IS0tIFRlbXBsYXRlIHZhcmlhYmxlcyBoaWRkZW4gaW4gd2hpbGUgbG9vcCAtIHVzZSBFZGl0IEluIGRlcHRoIHRvIGNvbmZpZ3VyZSAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFZGl0IEluIGRlcHRoIGxpbmsgLS0+XG4gICAgICA8YSBocmVmPVwiI1wiICpuZ0lmPVwiaXNXaGlsZUxvb3AoKVwiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS1uby11bmRlcmxpbmVcIj5cbiAgICAgICAgRWRpdCBJbiBkZXB0aFxuICAgICAgICA8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTIuMDM4MDkgNi43NDMyOUwyLjYyODA5IDcuMzMzMjlMNS45NjE0MiAzLjk5OTk2TDIuNjI4MDkgMC42NjY2MjZMMi4wMzgwOSAxLjI1NjYzTDQuNzgxNDIgMy45OTk5NkwyLjAzODA5IDYuNzQzMjlaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgPCEtLSBDYW5jZWwgLyBBcHBseSAtLT5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uRWRpdENhbmNlbCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSdcIiBbdGV4dF09XCInQXBwbHknXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0QXBwbHkoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExvb3AgSGVhZGVyIChub3JtYWwgdmlldyB3aGVuIG5vdCBlZGl0aW5nKSAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIlxuICAgIFtjbGFzc109XCInc3RlcC1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTIgJyArIChpc0luc2lkZUxvb3AgJiYgaXNJbnNpZGVTdGVwR3JvdXAgPyAnY3FhLXBsLTIwIGNxYS1wci00JyA6IChpc0luc2lkZUxvb3AgfHwgaXNJbnNpZGVTdGVwR3JvdXApID8gJ2NxYS1wbC0xMCBjcWEtcHItNCcgOiAnY3FhLXB4LTQnKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gRHJhZyBIYW5kbGUgSWNvbiAod2hlbiBpc1Jlb3JkZXIgaXMgdHJ1ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlclwiIGNsYXNzPVwiY3FhLW1yLTIgY3FhLWN1cnNvci1tb3ZlIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDaGVja2JveCAod2hlbiBpc1Jlb3JkZXIgaXMgZmFsc2UpIC0tPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yZWxhdGl2ZSBjcWEtbXItMlwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWFwcGVhcmFuY2Utbm9uZSBjcWEtcm91bmRlZCBzaGFkb3cgaG92ZXI6Y3FhLXNoYWRvdy1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1zbGF0ZS0zMDAgY3FhLWZsZXgtc2hyaW5rLTBcIlxuICAgICAgICBbY2xhc3MuY3FhLWJnLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtYm9yZGVyLVsjM0Y0M0VFXV09XCJzZWxlY3RlZFwiXG4gICAgICAgIGlkPVwiY2hlY2stbG9vcC1zdGVwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10ZXh0LXdoaXRlIGNxYS10b3AtMS8yIGNxYS1sZWZ0LTEvMiBjcWEtLXRyYW5zbGF0ZS14LTEvMiBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFzZWxlY3RlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0xMDBdPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEyIDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMCAzLjEyNUw0LjUgOC42MjVMMiA2LjEyNVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtbWluLXctWzMycHhdXCI+e3sgc3RlcE51bWJlciB9fTwvc3Bhbj5cbiAgICA8IS0tIEV4cGFuZC9Db2xsYXBzZSBJY29uIC0tPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIiBjbGFzcz1cImNxYS1wLTBcIj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFleHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDEwTDggNkw0IDEwXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJsb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjMzNCAxLjMzMzI1TDE0LjAwMDcgMy45OTk5MkwxMS4zMzQgNi42NjY1OVwiIHN0cm9rZT1cIiMxQzM5OEVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTIgNy4zMzMzM1Y2LjY2NjY3QzIgNS45NTk0MiAyLjI4MDk1IDUuMjgxMTUgMi43ODEwNSA0Ljc4MTA1QzMuMjgxMTUgNC4yODA5NSAzLjk1OTQyIDQgNC42NjY2NyA0SDE0XCJcbiAgICAgICAgICBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNC42NjY2NyAxNC42NjY2TDIgMTEuOTk5OUw0LjY2NjY3IDkuMzMzMjVcIiBzdHJva2U9XCIjMUMzOThFXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTE0IDguNjY2NzVWOS4zMzM0MUMxNCAxMC4wNDA3IDEzLjcxOSAxMC43MTg5IDEzLjIxOSAxMS4yMTlDMTIuNzE4OSAxMS43MTkxIDEyLjA0MDYgMTIuMDAwMSAxMS4zMzMzIDEyLjAwMDFIMlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzFDMzk4RVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImxvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMS4zMzQgMS4zMzMyNUwxNC4wMDA3IDMuOTk5OTJMMTEuMzM0IDYuNjY2NTlcIiBzdHJva2U9XCIjNTkxNjhCXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgPHBhdGggZD1cIk0yIDcuMzMzMzNWNi42NjY2N0MyIDUuOTU5NDIgMi4yODA5NSA1LjI4MTE1IDIuNzgxMDUgNC43ODEwNUMzLjI4MTE1IDQuMjgwOTUgMy45NTk0MiA0IDQuNjY2NjcgNEgxNFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTQuNjY2NjcgMTQuNjY2NkwyIDExLjk5OTlMNC42NjY2NyA5LjMzMzI1XCIgc3Ryb2tlPVwiIzU5MTY4QlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNCA4LjY2Njc1VjkuMzMzNDFDMTQgMTAuMDQwNyAxMy43MTkgMTAuNzE4OSAxMy4yMTkgMTEuMjE5QzEyLjcxODkgMTEuNzE5MSAxMi4wNDA2IDEyLjAwMDEgMTEuMzMzMyAxMi4wMDAxSDJcIlxuICAgICAgICAgIHN0cm9rZT1cIiM1OTE2OEJcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb29wIFR5cGUgTGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLW5vbmVcIj5cbiAgICAgIHt7IGdldExvb3BUeXBlTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gRm9yIExvb3AgRGlzcGxheSAoc2FtZSBzdHlsaW5nIGFzIGNvbmRpdGlvbiBzdGVwLCBIVE1MIGJhZGdlcyB2aWEgaW5uZXJIVE1MKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9vcFR5cGUgPT09ICdmb3InICYmIChoYXNUZXN0RGF0YVByb2ZpbGUoKSB8fCBoYXNTdGFydFZhbHVlKCkgfHwgaGFzRW5kVmFsdWUoKSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tbC0yIGNxYS1mbGV4LTEgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtYWN0aW9uLWZvcm1hdFwiIFtpbm5lckhUTUxdPVwiZ2V0Rm9yTG9vcERpc3BsYXkoKVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KCkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdoaWxlIExvb3AgQ29uZGl0aW9uIChvbmx5IHNob3cgaWYgY29uZGl0aW9uIGV4aXN0cykgLSBzYW1lIHN0eWxpbmcgYXMgY29uZGl0aW9uIHN0ZXAgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzV2hpbGVMb29wKCkgJiYgY29uZGl0aW9uXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWwtMiBjcWEtZmxleC0xIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWFjdGlvbi1mb3JtYXRcIiBbaW5uZXJIVE1MXT1cImdldENvbmRpdGlvbkRpc3BsYXkoKVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldExvb3BFdmVudERldGFpbHNGb3JEaXNwbGF5KCkubGVuZ3RoID4gMFwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMb29wRXZlbnREZXRhaWxzRm9yRGlzcGxheSgpXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtcm91bmRlZCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiIChjbGljayk9XCJvbkxvb3BBY3Rpb25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaXRlbS5rZXkgfX06PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1sLWF1dG9cIj5cbiAgICAgIDwhLS0gU3RlcHMgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtbWwtYXV0byBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbGcgY3FhLXB5LTAuNSBjcWEtcHgtMiBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBnZXRTdGVwc1N1bW1hcnkoKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlldyBEZXRhaWxzIExpbmsgKHNob3cgb25seSBpZiBkZXNjcmlwdGlvbiBpcyBub3QgZW1wdHkpIC0tPlxuICAgICAgPGEgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb24gJiYgY29uZmlnLmRlc2NyaXB0aW9uLnRyaW0oKSAhPT0gJydcIiAjdmlld0RldGFpbHNUcmlnZ2VyIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0RldGFpbHMoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1uby11bmRlcmxpbmUgY3FhLW1sLWF1dG9cIj5WaWV3IERldGFpbHM8c3ZnIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIiB2aWV3Qm94PVwiMCAwIDggOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzgwOSA2Ljc0MzI5TDIuNjI4MDkgNy4zMzMyOUw1Ljk2MTQyIDMuOTk5OTZMMi42MjgwOSAwLjY2NjYyNkwyLjAzODA5IDEuMjU2NjNMNC43ODE0MiAzLjk5OTk2TDIuMDM4MDkgNi43NDMyOVpcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz48L2E+XG5cbiAgICAgIDwhLS0gQ3JlYXRlZCBEYXRlIChmcm9tIEFQSSkgLSBiZWZvcmUgYWN0aW9uIGljb25zLCBmb3JtYXQ6IDI1IEZlYiAyMDI2IC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuY3JlYXRlZERhdGVcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdXCI+XG4gICAgICAgIHt7IGNvbmZpZy5jcmVhdGVkRGF0ZSB8IGRhdGU6J2QgTU1NIHl5eXknIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8IS0tIEFjdGlvbiBJY29uczogRWRpdCwgTGluaywgRHVwbGljYXRlLCBEZWxldGUgKHNob3cgb24gaG92ZXI7IGhpZGRlbiB3aGVuIGluc2lkZSBzdGVwLWdyb3VwKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNJbnNpZGVTdGVwR3JvdXBcIiBjbGFzcz1cInN0ZXAtYWN0aW9ucyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtWzdweF1cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTEuNjY2NkgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05LjU1MjA4IDIuMTEyOEM5Ljc4NDMgMS44ODA1OCAxMC4wOTkzIDEuNzUwMTIgMTAuNDI3NyAxLjc1MDEyQzEwLjc1NjEgMS43NTAxMiAxMS4wNzEgMS44ODA1OCAxMS4zMDMzIDIuMTEyOEMxMS41MzU1IDIuMzQ1MDIgMTEuNjY1OSAyLjY1OTk4IDExLjY2NTkgMi45ODgzOEMxMS42NjU5IDMuMzE2NzkgMTEuNTM1NSAzLjYzMTc1IDExLjMwMzMgMy44NjM5N0w0LjI5NzQyIDEwLjg3MDRDNC4xNTg2NCAxMS4wMDkyIDMuOTg3MSAxMS4xMTA3IDMuNzk4NjcgMTEuMTY1NkwyLjEyMzMzIDExLjY1NDRDMi4wNzMxNCAxMS42NjkgMi4wMTk5MyAxMS42Njk5IDEuOTY5MjggMTEuNjU2OUMxLjkxODYzIDExLjY0MzkgMS44NzI0IDExLjYxNzYgMS44MzU0MyAxMS41ODA2QzEuNzk4NDYgMTEuNTQzNyAxLjc3MjEgMTEuNDk3NCAxLjc1OTEzIDExLjQ0NjhDMS43NDYxNSAxMS4zOTYxIDEuNzQ3MDMgMTEuMzQyOSAxLjc2MTY3IDExLjI5MjdMMi4yNTA1IDkuNjE3MzhDMi4zMDU0NiA5LjQyOTE2IDIuNDA2OTggOS4yNTc4MyAyLjU0NTY3IDkuMTE5MjJMOS41NTIwOCAyLjExMjhaXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkxpbmsoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJMaW5rXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyM5OUExQWZdIGhvdmVyOmNxYS10ZXh0LVsjMTQ0N0U2XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk01LjAwMDY1IDkuOTE2NzFIMy42NjczMkMyLjc4MzI2IDkuOTE2NzEgMS45MzU0MiA5LjYwOTQyIDEuMzEwMyA5LjA2MjQ0QzAuNjg1MTc0IDguNTE1NDUgMC4zMzM5ODQgNy43NzM1OSAwLjMzMzk4NCA3LjAwMDA0QzAuMzMzOTg0IDYuMjI2NDkgMC42ODUxNzQgNS40ODQ2MyAxLjMxMDMgNC45Mzc2NUMxLjkzNTQyIDQuMzkwNjYgMi43ODMyNiA0LjA4MzM3IDMuNjY3MzIgNC4wODMzN0g1LjAwMDY1XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTkgNC4wODMzN0gxMC4zMzMzQzExLjIxNzQgNC4wODMzNyAxMi4wNjUyIDQuMzkwNjYgMTIuNjkwNCA0LjkzNzY1QzEzLjMxNTUgNS40ODQ2MyAxMy42NjY3IDYuMjI2NDkgMTMuNjY2NyA3LjAwMDA0QzEzLjY2NjcgNy43NzM1OSAxMy4zMTU1IDguNTE1NDUgMTIuNjkwNCA5LjA2MjQ0QzEyLjA2NTIgOS42MDk0MiAxMS4yMTc0IDkuOTE2NzEgMTAuMzMzMyA5LjkxNjcxSDlcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC4zMzM5OCA3SDkuNjY3MzJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25EdXBsaWNhdGUoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJEdXBsaWNhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1bIzk5QTFBZl0gaG92ZXI6Y3FhLXRleHQtWyMxNDQ3RTZdXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTExLjY2NiA0LjY2NjYzSDUuODMyNjhDNS4xODgzNSA0LjY2NjYzIDQuNjY2MDIgNS4xODg5NiA0LjY2NjAyIDUuODMzMjlWMTEuNjY2NkM0LjY2NjAyIDEyLjMxMSA1LjE4ODM1IDEyLjgzMzMgNS44MzI2OCAxMi44MzMzSDExLjY2NkMxMi4zMTAzIDEyLjgzMzMgMTIuODMyNyAxMi4zMTEgMTIuODMyNyAxMS42NjY2VjUuODMzMjlDMTIuODMyNyA1LjE4ODk2IDEyLjMxMDMgNC42NjY2MyAxMS42NjYgNC42NjY2M1pcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMi4zMzI2OCA5LjMzMzI5QzEuNjkxMDIgOS4zMzMyOSAxLjE2NjAyIDguODA4MjkgMS4xNjYwMiA4LjE2NjYzVjIuMzMzMjlDMS4xNjYwMiAxLjY5MTYzIDEuNjkxMDIgMS4xNjY2MyAyLjMzMjY4IDEuMTY2NjNIOC4xNjYwMkM4LjgwNzY4IDEuMTY2NjMgOS4zMzI2OCAxLjY5MTYzIDkuMzMyNjggMi4zMzMyOVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtWyNmZjY0NjddIGhvdmVyOmNxYS10ZXh0LVsjQzYzNTM1XVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xLjc1IDMuNUgxMi4yNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMS4wODI3IDMuNVYxMS42NjY3QzExLjA4MjcgMTIuMjUgMTAuNDk5MyAxMi44MzMzIDkuOTE2MDIgMTIuODMzM0g0LjA4MjY4QzMuNDk5MzUgMTIuODMzMyAyLjkxNjAyIDEyLjI1IDIuOTE2MDIgMTEuNjY2N1YzLjVcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNC42NjYwMiAzLjQ5OTk2VjIuMzMzMjlDNC42NjYwMiAxLjc0OTk2IDUuMjQ5MzUgMS4xNjY2MyA1LjgzMjY4IDEuMTY2NjNIOC4xNjYwMkM4Ljc0OTM1IDEuMTY2NjMgOS4zMzI2OCAxLjc0OTk2IDkuMzMyNjggMi4zMzMyOVYzLjQ5OTk2XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUuODMzOTggNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgNi40MTY2M1Y5LjkxNjYzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCB3aXRoIE5lc3RlZCBTdGVwcyAocmVuZGVyZXIgZGlzcGF0Y2hlcyBieSBzdGVwIHR5cGUsIG4tbGV2ZWwgbmVzdGluZykgLS0+XG4gIDxkaXYgKm5nSWY9XCJleHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPCEtLSBTVEFSVCBNYXJrZXIgKGNlbnRlcmVkIHdpdGggZGVjb3JhdGl2ZSBsaW5lcykgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS0xIGNxYS1weC00IGNxYS1iZy1bI0RCRUFGRTgwXVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCRURCRkY7XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMUMzOThFXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj57eyBnZXRTdGFydExhYmVsKCkgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXNlbGYtc3RyZXRjaCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzFDMzk4RV0gY3FhLW9wYWNpdHktNDBcIiBzdHlsZT1cIm1pbi13aWR0aDogMjBweDtcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGNxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBuZXN0ZWRTdGVwczsgbGV0IGkgPSBpbmRleFwiIFtzdGVwXT1cInN0ZXBcIiBbaW5kZXhdPVwiaVwiXG4gICAgICAgIFtzZWxlY3RlZF09XCIkYW55KHN0ZXApLnNlbGVjdGVkXCJcbiAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgIFthZGRTdGVwQmV0d2Vlbl09XCJhZGRTdGVwQmV0d2VlblwiXG4gICAgICAgIFtkYXRhUHJvZmlsZU9wdGlvbnNdPVwiZGF0YVByb2ZpbGVPcHRpb25zXCIgW2hhc01vcmVEYXRhUHJvZmlsZXNdPVwiaGFzTW9yZURhdGFQcm9maWxlc1wiIFtpc0xvYWRpbmdEYXRhUHJvZmlsZXNdPVwiaXNMb2FkaW5nRGF0YVByb2ZpbGVzXCJcbiAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgIChuZXN0ZWRTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZSgkZXZlbnQuc3RlcCwgJGV2ZW50LmluZGV4KVwiXG4gICAgICAgIChhZGRTdGVwKT1cIm9uQWRkU3RlcCgpXCIgKGFkZFN0ZXBGb3JMb29wKT1cIm9uQWRkU3RlcEZvckxvb3BGcm9tTmVzdGVkKCRldmVudClcIiAoZGVsZXRlU3RlcCk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50KVwiXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAoZ3JvdXBOYW1lQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZ3JvdXBOYW1lID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5kZXNjcmlwdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChvcGVuRXh0ZXJuYWwpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGVkaXQpPVwib25OZXN0ZWRFZGl0KCRldmVudClcIlxuICAgICAgICAobGluayk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZHVwbGljYXRlKT1cIm9uTmVzdGVkRHVwbGljYXRlKCRldmVudCwgc3RlcClcIiAoZGVsZXRlKT1cIm9uRGVsZXRlU3RlcCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjb25kaXRpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5jb25kaXRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChicmFuY2hTdGVwQ2hhbmdlKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChhZGRCcmFuY2gpPVwib25OZXN0ZWRDb25kaXRpb25BZGRCcmFuY2goJGFueShzdGVwKSwgaSlcIlxuICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAodGVzdERhdGFQcm9maWxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkudGVzdERhdGFQcm9maWxlID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc3RhcnRTdGVwQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc3RhcnRTdGVwID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChtYXhJdGVyYXRpb25zQ2hhbmdlKT1cIiRhbnkoc3RlcCkubWF4SXRlcmF0aW9ucyA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGV2ZW50VHlwZUNoYW5nZSk9XCIkYW55KHN0ZXApLmV2ZW50VHlwZSA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuc2VsZWN0ZWQgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgIChsb2FkTW9yZURhdGFQcm9maWxlcyk9XCJsb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VhcmNoRGF0YVByb2ZpbGVzKT1cInNlYXJjaERhdGFQcm9maWxlcy5lbWl0KCRldmVudClcIlxuICAgICAgICAoZG5kRHJvcEluWm9uZSk9XCJkbmREcm9wSW5ab25lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChjbGlja0FjdGlvbik9XCJjbGlja0FjdGlvbi5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEluRGVwdGgpPVwiZWRpdEluRGVwdGguZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFkZFN0ZXBCZXR3ZWVuQ2xpY2spPVwiYWRkU3RlcEJldHdlZW5DbGljay5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvY3FhLXRlc3QtY2FzZS1kZXRhaWxzLXJlbmRlcmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBuZXN0ZWQtc3RlcC1kcm9wLWxpc3RcIlxuICAgICAgICAgW2RuZERyb3B6b25lXT1cIlsnc3RlcCddXCJcbiAgICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInN0ZXAtZHJhZy1wbGFjZWhvbGRlci1uZXN0ZWQgY3FhLW15LTEgY3FhLW1pbi1oLVs1MHB4XSBjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQgY3FhLWJnLVtyZ2JhKDYzLDY3LDIzOCwwLjA4KV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LXhzXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIG5lc3RlZFN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJuZXN0ZWQtc3RlcC1kcmFnLWl0ZW1cIlxuICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInN0ZXBcIlxuICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgIGRuZFR5cGU9XCJzdGVwXCI+XG4gICAgICAgIDxjcWEtdGVzdC1jYXNlLWRldGFpbHMtcmVuZGVyZXIgW3N0ZXBdPVwic3RlcFwiIFtpbmRleF09XCJpXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiJGFueShzdGVwKS5zZWxlY3RlZFwiXG4gICAgICAgICAgW2lzTmVzdGVkXT1cInRydWVcIiBbaXNJbnNpZGVMb29wXT1cInRydWVcIiBbaXNSZW9yZGVyXT1cImlzUmVvcmRlclwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQWJvdmVdPVwiYWRkU3RlcEJldHdlZW5BYm92ZVwiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuQmVsb3ddPVwiYWRkU3RlcEJldHdlZW5CZWxvd1wiXG4gICAgICAgICAgW2FkZFN0ZXBCZXR3ZWVuXT1cImFkZFN0ZXBCZXR3ZWVuXCJcbiAgICAgICAgICBbZGF0YVByb2ZpbGVPcHRpb25zXT1cImRhdGFQcm9maWxlT3B0aW9uc1wiIFtoYXNNb3JlRGF0YVByb2ZpbGVzXT1cImhhc01vcmVEYXRhUHJvZmlsZXNcIiBbaXNMb2FkaW5nRGF0YVByb2ZpbGVzXT1cImlzTG9hZGluZ0RhdGFQcm9maWxlc1wiXG4gICAgICAgICAgW25hdHVyYWxUZXh0QWN0aW9uc09wdGlvbnNdPVwibmF0dXJhbFRleHRBY3Rpb25zT3B0aW9uc1wiXG4gICAgICAgICAgKG5lc3RlZFN0ZXBDaGFuZ2UpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKCRldmVudC5zdGVwLCAkZXZlbnQuaW5kZXgpXCJcbiAgICAgICAgICAoYWRkU3RlcCk9XCJvbkFkZFN0ZXAoKVwiIChhZGRTdGVwRm9yTG9vcCk9XCJvbkFkZFN0ZXBGb3JMb29wRnJvbU5lc3RlZCgkZXZlbnQpXCIgKGRlbGV0ZVN0ZXApPVwib25EZWxldGVTdGVwKCRldmVudClcIlxuICAgICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJvbk5lc3RlZFRvZ2dsZUV4cGFuZGVkKCRldmVudCwgc3RlcCwgaSlcIlxuICAgICAgICAgIChncm91cE5hbWVDaGFuZ2UpPVwiJGFueShzdGVwKS5ncm91cE5hbWUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIiRhbnkoc3RlcCkuZGVzY3JpcHRpb24gPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHJldXNhYmxlQ2hhbmdlKT1cIiRhbnkoc3RlcCkucmV1c2FibGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG9wZW5FeHRlcm5hbCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoZWRpdCk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChsaW5rKT1cIm9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiIChkdXBsaWNhdGUpPVwib25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCIgKGRlbGV0ZSk9XCJvbkRlbGV0ZVN0ZXAoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgKHZpZXdEZXRhaWxzKT1cInZpZXdEZXRhaWxzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbmRpdGlvbkNoYW5nZSk9XCIkYW55KHN0ZXApLmNvbmRpdGlvbiA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoYnJhbmNoU3RlcENoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIiAoYWRkQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uQWRkQnJhbmNoKCRhbnkoc3RlcCksIGkpXCJcbiAgICAgICAgICAoZGVsZXRlQnJhbmNoKT1cIm9uTmVzdGVkQ29uZGl0aW9uRGVsZXRlQnJhbmNoKCRhbnkoc3RlcCksICRldmVudCwgaSlcIlxuICAgICAgICAgICh0ZXN0RGF0YVByb2ZpbGVDaGFuZ2UpPVwiJGFueShzdGVwKS50ZXN0RGF0YVByb2ZpbGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHN0YXJ0U3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLnN0YXJ0U3RlcCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgICAoZW5kU3RlcENoYW5nZSk9XCIkYW55KHN0ZXApLmVuZFN0ZXAgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKG1heEl0ZXJhdGlvbnNDaGFuZ2UpPVwiJGFueShzdGVwKS5tYXhJdGVyYXRpb25zID0gJGV2ZW50OyBvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChldmVudFR5cGVDaGFuZ2UpPVwiJGFueShzdGVwKS5ldmVudFR5cGUgPSAkZXZlbnQ7IG9uTmVzdGVkU3RlcENoYW5nZShzdGVwLCBpKVwiXG4gICAgICAgICAgKHBhcmFtZXRlckNoYW5nZSk9XCJvbk5lc3RlZFN0ZXBDaGFuZ2Uoc3RlcCwgaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiJGFueShzdGVwKS5zZWxlY3RlZCA9ICRldmVudDsgb25OZXN0ZWRTdGVwQ2hhbmdlKHN0ZXAsIGkpXCJcbiAgICAgICAgKGxvYWRNb3JlRGF0YVByb2ZpbGVzKT1cImxvYWRNb3JlRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2hEYXRhUHJvZmlsZXMpPVwic2VhcmNoRGF0YVByb2ZpbGVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkbmREcm9wSW5ab25lKT1cImRuZERyb3BJblpvbmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrQWN0aW9uKT1cImNsaWNrQWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0SW5EZXB0aCk9XCJlZGl0SW5EZXB0aC5lbWl0KCRldmVudClcIlxuICAgICAgICAoYWRkU3RlcEJldHdlZW5DbGljayk9XCJhZGRTdGVwQmV0d2VlbkNsaWNrLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS10ZXN0LWNhc2UtZGV0YWlscy1yZW5kZXJlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFbXB0eSBsb29wOiBzaG93IHBsdXMgaWNvbiBvbiBob3ZlciB3aGVuIGV4cGFuZGVkIGFuZCBubyBzdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibmVzdGVkU3RlcHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJsb29wLXN0ZXAtZW1wdHkgY3FhLW1pbi1oLVs1MnB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGwtNCBjcWEtcHItNFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEVtcHR5KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdGl0bGU9XCJBZGQgc3RlcFwiXG4gICAgICAgIGNsYXNzPVwibG9vcC1zdGVwLWVtcHR5LWFkZFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIyMS4xODIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjEwLjU5MTFcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIxXCIgeT1cIjFcIiB3aWR0aD1cIjIxLjE4MjJcIiBoZWlnaHQ9XCIyMlwiIHJ4PVwiMTAuNTkxMVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIyXCIgLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMkgxNS41XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMiA4LjVWMTUuNVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFTkQgTWFya2VyIChjZW50ZXJlZCB3aXRoIGRlY29yYXRpdmUgbGluZXMpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMSBjcWEtcHgtNCBjcWEtYmctWyNEQkVBRkU4MF1cIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjQkVEQkZGO1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWJvcmRlci10IGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyMxQzM5OEVdIGNxYS1vcGFjaXR5LTQwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDIwcHg7XCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzFDMzk4RV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0RW5kTGFiZWwoKSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtc2VsZi1zdHJldGNoIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjMUMzOThFXSBjcWEtb3BhY2l0eS00MFwiIHN0eWxlPVwibWluLXdpZHRoOiAyMHB4O1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=