@cqa-lib/cqa-ui 1.1.211 → 1.1.212

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2020/lib/custom-textarea/custom-textarea.component.mjs +53 -5
  2. package/esm2020/lib/detail-drawer/detail-drawer.component.mjs +3 -3
  3. package/esm2020/lib/detail-side-panel/detail-side-panel.component.mjs +22 -6
  4. package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +11 -6
  5. package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +1 -1
  6. package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +1 -1
  7. package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
  8. package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1 -1
  9. package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +1 -1
  10. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +1 -1
  11. package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +226 -52
  12. package/esm2020/lib/test-case-details/test-case-details.component.mjs +34 -11
  13. package/esm2020/lib/test-case-details/test-case-details.models.mjs +6 -1
  14. package/esm2020/lib/ui-kit.module.mjs +3 -2
  15. package/esm2020/public-api.mjs +1 -1
  16. package/fesm2015/cqa-lib-cqa-ui.mjs +374 -99
  17. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  18. package/fesm2020/cqa-lib-cqa-ui.mjs +350 -78
  19. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  20. package/lib/custom-textarea/custom-textarea.component.d.ts +13 -3
  21. package/lib/detail-side-panel/detail-side-panel.component.d.ts +11 -2
  22. package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +32 -4
  23. package/lib/test-case-details/test-case-details.component.d.ts +11 -3
  24. package/lib/test-case-details/test-case-details.models.d.ts +6 -0
  25. package/package.json +1 -1
  26. package/styles.css +1 -1
@@ -6,7 +6,8 @@ import * as i2 from "../test-case-details/test-case-details.component";
6
6
  import * as i3 from "@angular/material/tooltip";
7
7
  import * as i4 from "@angular/common";
8
8
  export class DetailSidePanelComponent {
9
- constructor() {
9
+ constructor(cdr) {
10
+ this.cdr = cdr;
10
11
  /** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1 */
11
12
  this.tabs = [
12
13
  { label: 'Test Case', value: 'test-case', icon: 'description' },
@@ -19,6 +20,8 @@ export class DetailSidePanelComponent {
19
20
  this.descriptionTitle = 'Description';
20
21
  /** Description text content */
21
22
  this.descriptionContent = '';
23
+ /** When true, description uses rich text editor and renders as HTML. Host app must load Trix. */
24
+ this.enableMarkdown = false;
22
25
  /** Whether to show the Edit button in the Description header */
23
26
  this.showEditButton = true;
24
27
  /** Metadata items (Created on, Status, Priority, etc.) */
@@ -55,12 +58,14 @@ export class DetailSidePanelComponent {
55
58
  this.back = new EventEmitter();
56
59
  this.tabChange = new EventEmitter();
57
60
  this.editDescription = new EventEmitter();
61
+ this.cancel = new EventEmitter();
58
62
  this.saveChanges = new EventEmitter();
59
63
  this.metadataLinkClick = new EventEmitter();
60
64
  this.selectSearch = new EventEmitter();
61
65
  this.selectLoadMore = new EventEmitter();
62
66
  this.selectOpened = new EventEmitter();
63
67
  this.selectionChange = new EventEmitter();
68
+ this.labelAdded = new EventEmitter();
64
69
  this.expandToggle = new EventEmitter();
65
70
  this.close = new EventEmitter();
66
71
  }
@@ -99,6 +104,9 @@ export class DetailSidePanelComponent {
99
104
  onSaveChanges(data) {
100
105
  this.saveChanges.emit(data);
101
106
  }
107
+ onCancel() {
108
+ this.cancel.emit();
109
+ }
102
110
  onExpandToggle() {
103
111
  this.expandToggle.emit();
104
112
  }
@@ -126,15 +134,15 @@ export class DetailSidePanelComponent {
126
134
  }
127
135
  }
128
136
  }
129
- DetailSidePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
- DetailSidePanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailSidePanelComponent, selector: "cqa-detail-side-panel", inputs: { tabs: "tabs", activeTab: "activeTab", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", configTitle: "configTitle", showCloseButton: "showCloseButton", startInEditMode: "startInEditMode", selectConfigOverrides: "selectConfigOverrides", expanded: "expanded", expandedWidth: "expandedWidth", collapsedWidth: "collapsedWidth", expandTooltip: "expandTooltip", collapseTooltip: "collapseTooltip", closeTooltip: "closeTooltip" }, outputs: { back: "back", tabChange: "tabChange", editDescription: "editDescription", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", expandToggle: "expandToggle", close: "close" }, host: { properties: { "style.width": "this.hostWidth", "style.min-width": "this.hostMinWidth", "style.max-width": "this.hostMaxWidth", "style.overflow": "this.hostOverflow" }, styleAttribute: "transition: width 0.3s ease-in-out", classAttribute: "cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-flex-shrink-0 cqa-flex-grow-0 cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Test Case tab: use cqa-test-case-details (Figma design) -->\n <cqa-test-case-details\n *ngIf=\"activeTab === 'test-case'\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\n (saveChanges)=\"onSaveChanges($event)\"\n (metadataLinkClick)=\"onMetadataLinkClick($event)\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\">\n </cqa-test-case-details>\n\n <!-- Placeholder for other tabs (Data Library, Variables) -->\n <div *ngIf=\"activeTab !== 'test-case'\" class=\"cqa-p-4 cqa-text-[#64748B] cqa-text-sm\">\n {{ activeTab === 'data-library' ? 'Data Library content' : 'Variables content' }} \u2013 coming soon\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".detail-side-panel-scroll{overflow-y:auto!important;overflow-x:hidden!important;min-height:0!important;-webkit-overflow-scrolling:touch}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: ["startInEditMode", "descriptionTitle", "descriptionContent", "showEditButton", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "platform", "selectConfigOverrides"], outputs: ["editDescription", "saveChanges", "metadataLinkClick", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange"] }], directives: [{ type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
137
+ DetailSidePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
138
+ DetailSidePanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailSidePanelComponent, selector: "cqa-detail-side-panel", inputs: { tabs: "tabs", activeTab: "activeTab", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", configTitle: "configTitle", showCloseButton: "showCloseButton", startInEditMode: "startInEditMode", editing: "editing", selectConfigOverrides: "selectConfigOverrides", expanded: "expanded", expandedWidth: "expandedWidth", collapsedWidth: "collapsedWidth", expandTooltip: "expandTooltip", collapseTooltip: "collapseTooltip", closeTooltip: "closeTooltip" }, outputs: { back: "back", tabChange: "tabChange", editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", expandToggle: "expandToggle", close: "close" }, host: { properties: { "style.width": "this.hostWidth", "style.min-width": "this.hostMinWidth", "style.max-width": "this.hostMaxWidth", "style.overflow": "this.hostOverflow" }, styleAttribute: "transition: width 0.3s ease-in-out", classAttribute: "cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-flex-shrink-0 cqa-flex-grow-0 cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Test Case tab: use cqa-test-case-details (Figma design) -->\n <cqa-test-case-details\n *ngIf=\"activeTab === 'test-case'\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [editing]=\"editing\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\n (cancel)=\"onCancel()\"\n (saveChanges)=\"onSaveChanges($event)\"\n (metadataLinkClick)=\"onMetadataLinkClick($event)\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n </cqa-test-case-details>\n\n <!-- Placeholder for other tabs (Data Library, Variables) -->\n <div *ngIf=\"activeTab !== 'test-case'\" class=\"cqa-p-4 cqa-text-[#64748B] cqa-text-sm\">\n {{ activeTab === 'data-library' ? 'Data Library content' : 'Variables content' }} \u2013 coming soon\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".detail-side-panel-scroll{overflow-y:auto!important;overflow-x:hidden!important;min-height:0!important;-webkit-overflow-scrolling:touch}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: ["editing", "startInEditMode", "descriptionTitle", "descriptionContent", "enableMarkdown", "showEditButton", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "platform", "selectConfigOverrides"], outputs: ["editDescription", "cancel", "saveChanges", "metadataLinkClick", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded"] }], directives: [{ type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
131
139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, decorators: [{
132
140
  type: Component,
133
141
  args: [{ selector: 'cqa-detail-side-panel', styles: [DETAIL_SIDE_PANEL_SCROLL_STYLES], changeDetection: ChangeDetectionStrategy.OnPush, host: {
134
142
  class: 'cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-flex-shrink-0 cqa-flex-grow-0 cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]',
135
143
  style: 'transition: width 0.3s ease-in-out',
136
- }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Test Case tab: use cqa-test-case-details (Figma design) -->\n <cqa-test-case-details\n *ngIf=\"activeTab === 'test-case'\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\n (saveChanges)=\"onSaveChanges($event)\"\n (metadataLinkClick)=\"onMetadataLinkClick($event)\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\">\n </cqa-test-case-details>\n\n <!-- Placeholder for other tabs (Data Library, Variables) -->\n <div *ngIf=\"activeTab !== 'test-case'\" class=\"cqa-p-4 cqa-text-[#64748B] cqa-text-sm\">\n {{ activeTab === 'data-library' ? 'Data Library content' : 'Variables content' }} \u2013 coming soon\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
137
- }], propDecorators: { tabs: [{
144
+ }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Test Case tab: use cqa-test-case-details (Figma design) -->\n <cqa-test-case-details\n *ngIf=\"activeTab === 'test-case'\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [editing]=\"editing\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\n (cancel)=\"onCancel()\"\n (saveChanges)=\"onSaveChanges($event)\"\n (metadataLinkClick)=\"onMetadataLinkClick($event)\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n </cqa-test-case-details>\n\n <!-- Placeholder for other tabs (Data Library, Variables) -->\n <div *ngIf=\"activeTab !== 'test-case'\" class=\"cqa-p-4 cqa-text-[#64748B] cqa-text-sm\">\n {{ activeTab === 'data-library' ? 'Data Library content' : 'Variables content' }} \u2013 coming soon\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
145
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { tabs: [{
138
146
  type: Input
139
147
  }], activeTab: [{
140
148
  type: Input
@@ -142,6 +150,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
142
150
  type: Input
143
151
  }], descriptionContent: [{
144
152
  type: Input
153
+ }], enableMarkdown: [{
154
+ type: Input
145
155
  }], showEditButton: [{
146
156
  type: Input
147
157
  }], metadataItems: [{
@@ -160,6 +170,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
160
170
  type: Input
161
171
  }], startInEditMode: [{
162
172
  type: Input
173
+ }], editing: [{
174
+ type: Input
163
175
  }], selectConfigOverrides: [{
164
176
  type: Input
165
177
  }], expanded: [{
@@ -192,6 +204,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
192
204
  type: Output
193
205
  }], editDescription: [{
194
206
  type: Output
207
+ }], cancel: [{
208
+ type: Output
195
209
  }], saveChanges: [{
196
210
  type: Output
197
211
  }], metadataLinkClick: [{
@@ -204,9 +218,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
204
218
  type: Output
205
219
  }], selectionChange: [{
206
220
  type: Output
221
+ }], labelAdded: [{
222
+ type: Output
207
223
  }], expandToggle: [{
208
224
  type: Output
209
225
  }], close: [{
210
226
  type: Output
211
227
  }] } });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXNpZGUtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXRhaWwtc2lkZS1wYW5lbC9kZXRhaWwtc2lkZS1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFpbC1zaWRlLXBhbmVsL2RldGFpbC1zaWRlLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQVd2QixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBZTdFLE1BQU0sT0FBTyx3QkFBd0I7SUFYckM7UUFZRSw2RUFBNkU7UUFDcEUsU0FBSSxHQUF5QjtZQUNwQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQy9ELEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDaEUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtTQUN6RCxDQUFDO1FBRUYsaUNBQWlDO1FBQ3hCLGNBQVMsR0FBRyxXQUFXLENBQUM7UUFFakMsZ0NBQWdDO1FBQ3ZCLHFCQUFnQixHQUFHLGFBQWEsQ0FBQztRQUUxQywrQkFBK0I7UUFDdEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRWpDLGdFQUFnRTtRQUN2RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUUvQiwwREFBMEQ7UUFDakQsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBRTNELHFEQUFxRDtRQUM1QyxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBRS9CLDZFQUE2RTtRQUNwRSxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFFN0QsMEZBQTBGO1FBQ2pGLHVCQUFrQixHQUFtQyxFQUFFLENBQUM7UUFFakUsZ0ZBQWdGO1FBQ3ZFLGFBQVEsR0FBcUIsS0FBSyxDQUFDO1FBRTVDLGtDQUFrQztRQUN6QixnQkFBVyxHQUFHLGVBQWUsQ0FBQztRQUV2Qyx3REFBd0Q7UUFDL0Msb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFakMsOEVBQThFO1FBQ3JFLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRWpDLG1GQUFtRjtRQUMxRSwwQkFBcUIsR0FBMEIsRUFBRSxDQUFDO1FBRTNELGlGQUFpRjtRQUN4RSxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXpCLHNEQUFzRDtRQUM3QyxrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUVqQyw2RUFBNkU7UUFDcEUsbUJBQWMsR0FBRyxNQUFNLENBQUM7UUFjRixpQkFBWSxHQUFHLFFBQVEsQ0FBQztRQUV2RCx3REFBd0Q7UUFDL0Msa0JBQWEsR0FBRyxRQUFRLENBQUM7UUFFbEMsa0VBQWtFO1FBQ3pELG9CQUFlLEdBQUcsVUFBVSxDQUFDO1FBRXRDLCtCQUErQjtRQUN0QixpQkFBWSxHQUFHLE9BQU8sQ0FBQztRQUV0QixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNoQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUM5RCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUNwRSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBQ2xFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDcEUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNuRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBQ3RFLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN4QyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQStENUM7SUFoR0MsSUFBZ0MsU0FBUztRQUN2QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQW9DLFlBQVk7UUFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFvQyxZQUFZO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUNsRSxDQUFDO0lBeUJELGVBQWUsQ0FBQyxFQUFVLEVBQUUsR0FBdUI7UUFDakQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ25CLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxFQUFVLEVBQUUsSUFBaUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFVLEVBQUUsT0FBcUM7UUFDbEUsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQXVCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQWlDO1FBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWlDO1FBQ25ELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBaUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hCLEtBQUssUUFBUTtnQkFDWCxPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssS0FBSztnQkFDUixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssT0FBTztnQkFDVixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxrQkFBa0IsQ0FBQztTQUM3QjtJQUNILENBQUM7O3FIQXZKVSx3QkFBd0I7eUdBQXhCLHdCQUF3QixtNUNDakNyQyw4MUtBMkZBOzJGRDFEYSx3QkFBd0I7a0JBWHBDLFNBQVM7K0JBQ0UsdUJBQXVCLFVBRXpCLENBQUMsK0JBQStCLENBQUMsbUJBQ3hCLHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0osS0FBSyxFQUNILDJJQUEySTt3QkFDN0ksS0FBSyxFQUFFLG9DQUFvQztxQkFDNUM7OEJBSVEsSUFBSTtzQkFBWixLQUFLO2dCQU9HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUUwQixTQUFTO3NCQUF4QyxXQUFXO3VCQUFDLGFBQWE7Z0JBSVUsWUFBWTtzQkFBL0MsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBSU0sWUFBWTtzQkFBL0MsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBSUMsWUFBWTtzQkFBMUMsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBR3BCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgSG9zdEJpbmRpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkl0ZW0gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uLWNhcmQvY29uZmlndXJhdGlvbi1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBEZXRhaWxTaWRlUGFuZWxUYWIsXG4gIERldGFpbFNpZGVQYW5lbE1ldGFkYXRhSXRlbSxcbiAgRGV0YWlsU2lkZVBhbmVsQ29uZmlnU2VjdGlvbixcbn0gZnJvbSAnLi9kZXRhaWwtc2lkZS1wYW5lbC5tb2RlbHMnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhLFxuICBTZWxlY3RDb25maWdPdmVycmlkZXMsXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgREVUQUlMX1NJREVfUEFORUxfU0NST0xMX1NUWUxFUyB9IGZyb20gJy4vZGV0YWlsLXNpZGUtcGFuZWwuc3R5bGVzJztcblxuZXhwb3J0IHR5cGUgeyBEZXRhaWxTaWRlUGFuZWxUYWIsIERldGFpbFNpZGVQYW5lbE1ldGFkYXRhSXRlbSwgRGV0YWlsU2lkZVBhbmVsQ29uZmlnU2VjdGlvbiB9IGZyb20gJy4vZGV0YWlsLXNpZGUtcGFuZWwubW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWRldGFpbC1zaWRlLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RldGFpbC1zaWRlLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbREVUQUlMX1NJREVfUEFORUxfU0NST0xMX1NUWUxFU10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgY2xhc3M6XG4gICAgICAnY3FhLXVpLXJvb3QgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWZsZXgtZ3Jvdy0wIGNxYS1iZy13aGl0ZSBjcWEtc2hhZG93LVstNHB4XzBfNnB4Xy0xcHhfcmdiYSgwLDAsMCwwLjA1KV0nLFxuICAgIHN0eWxlOiAndHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLWluLW91dCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIERldGFpbFNpZGVQYW5lbENvbXBvbmVudCB7XG4gIC8qKiBUYWJzIC0gZWFjaCB0YWIgaGFzIGEgc2lkZSBwYW5lbCBpY29uIGJ1dHRvbjsgdGFicyBhbmQgYnV0dG9ucyBhcmUgMToxICovXG4gIEBJbnB1dCgpIHRhYnM6IERldGFpbFNpZGVQYW5lbFRhYltdID0gW1xuICAgIHsgbGFiZWw6ICdUZXN0IENhc2UnLCB2YWx1ZTogJ3Rlc3QtY2FzZScsIGljb246ICdkZXNjcmlwdGlvbicgfSxcbiAgICB7IGxhYmVsOiAnRGF0YSBMaWJyYXJ5JywgdmFsdWU6ICdkYXRhLWxpYnJhcnknLCBpY29uOiAnZm9sZGVyJyB9LFxuICAgIHsgbGFiZWw6ICdWYXJpYWJsZXMnLCB2YWx1ZTogJ3ZhcmlhYmxlcycsIGljb246ICdjb2RlJyB9LFxuICBdO1xuXG4gIC8qKiBDdXJyZW50bHkgYWN0aXZlIHRhYiB2YWx1ZSAqL1xuICBASW5wdXQoKSBhY3RpdmVUYWIgPSAndGVzdC1jYXNlJztcblxuICAvKiogRGVzY3JpcHRpb24gc2VjdGlvbiB0aXRsZSAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcblxuICAvKiogRGVzY3JpcHRpb24gdGV4dCBjb250ZW50ICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uQ29udGVudCA9ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIEVkaXQgYnV0dG9uIGluIHRoZSBEZXNjcmlwdGlvbiBoZWFkZXIgKi9cbiAgQElucHV0KCkgc2hvd0VkaXRCdXR0b24gPSB0cnVlO1xuXG4gIC8qKiBNZXRhZGF0YSBpdGVtcyAoQ3JlYXRlZCBvbiwgU3RhdHVzLCBQcmlvcml0eSwgZXRjLikgKi9cbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogRGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtW10gPSBbXTtcblxuICAvKiogTGFiZWxzL3RhZ3MgKGUuZy4gQXV0b21hdGlvbiwgQVBJLCBTREssIFVJL1VYKSAqL1xuICBASW5wdXQoKSBsYWJlbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gc2VjdGlvbnMgLSBmdWxsIHdpZHRoIChlLmcuIEV4ZWN1dGlvbiwgQUkgQ29uZmlndXJhdGlvbikgKi9cbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IERldGFpbFNpZGVQYW5lbENvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuXG4gIC8qKiBPcHRpb25hbCBjb25maWcgc2VjdGlvbnMgZGlzcGxheWVkIGluIGEgMi1jb2x1bW4gcm93IChlLmcuIFdhaXRzICYgUmV0cmllcywgRGV2aWNlKSAqL1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IERldGFpbFNpZGVQYW5lbENvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuXG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgb3IgJ21vYmlsZScuIERlZmF1bHRzIHRvICd3ZWInLiBVc2VkIGZvciBEZXZpY2UgU2V0dGluZ3MuICovXG4gIEBJbnB1dCgpIHBsYXRmb3JtOiAnd2ViJyB8ICdtb2JpbGUnID0gJ3dlYic7XG5cbiAgLyoqIENvbmZpZ3VyYXRpb24gc2VjdGlvbiB0aXRsZSAqL1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBjbG9zZSBidXR0b24gaW4gdGhlIHNpZGUgbWVudSAqL1xuICBASW5wdXQoKSBzaG93Q2xvc2VCdXR0b24gPSBmYWxzZTtcblxuICAvKiogV2hlbiB0cnVlLCB0ZXN0IGNhc2UgZGV0YWlscyBzdGFydCBpbiBlZGl0IG1vZGUgKHVzZWZ1bCBmb3IgU3Rvcnlib29rKS4gKi9cbiAgQElucHV0KCkgc3RhcnRJbkVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLyoqIE92ZXJyaWRlIGNvbmZpZyBwZXIgc2VsZWN0IGZvciBBUEktZHJpdmVuIG9wdGlvbnMsIHNlcnZlciBzZWFyY2gsIGxvYWQgbW9yZS4gKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcblxuICAvKiogV2hldGhlciB0aGUgcGFuZWwgaXMgZXhwYW5kZWQgKGFmZmVjdHMgZXhwYW5kIGJ1dHRvbiBpY29uIGFuZCBwYW5lbCB3aWR0aCkgKi9cbiAgQElucHV0KCkgZXhwYW5kZWQgPSB0cnVlO1xuXG4gIC8qKiBQYW5lbCB3aWR0aCB3aGVuIGV4cGFuZGVkIChlLmcuICc0ODBweCcsICcyNSUnKSAqL1xuICBASW5wdXQoKSBleHBhbmRlZFdpZHRoID0gJzM4MHB4JztcblxuICAvKiogUGFuZWwgd2lkdGggd2hlbiBjb2xsYXBzZWQgKGUuZy4gJzU2cHgnIC0gZml0cyBpY29uIGJhciArIGJhY2sgYnV0dG9uKSAqL1xuICBASW5wdXQoKSBjb2xsYXBzZWRXaWR0aCA9ICc1NnB4JztcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJykgZ2V0IGhvc3RXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkID8gdGhpcy5leHBhbmRlZFdpZHRoIDogdGhpcy5jb2xsYXBzZWRXaWR0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUubWluLXdpZHRoJykgZ2V0IGhvc3RNaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkID8gdGhpcy5leHBhbmRlZFdpZHRoIDogdGhpcy5jb2xsYXBzZWRXaWR0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUubWF4LXdpZHRoJykgZ2V0IGhvc3RNYXhXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkID8gdGhpcy5leHBhbmRlZFdpZHRoIDogdGhpcy5jb2xsYXBzZWRXaWR0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUub3ZlcmZsb3cnKSBob3N0T3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAvKiogVG9vbHRpcCBmb3IgZXhwYW5kIGJ1dHRvbiB3aGVuIHBhbmVsIGlzIGNvbGxhcHNlZCAqL1xuICBASW5wdXQoKSBleHBhbmRUb29sdGlwID0gJ0V4cGFuZCc7XG5cbiAgLyoqIFRvb2x0aXAgZm9yIGV4cGFuZCBidXR0b24gd2hlbiBwYW5lbCBpcyBleHBhbmRlZCAoY29sbGFwc2UpICovXG4gIEBJbnB1dCgpIGNvbGxhcHNlVG9vbHRpcCA9ICdDb2xsYXBzZSc7XG5cbiAgLyoqIFRvb2x0aXAgZm9yIGNsb3NlIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBjbG9zZVRvb2x0aXAgPSAnQ2xvc2UnO1xuXG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlZGl0RGVzY3JpcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFMaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPERldGFpbFNpZGVQYW5lbE1ldGFkYXRhSXRlbT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgZXhwYW5kVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgdHJhY2tCeVRhYlZhbHVlKF9pOiBudW1iZXIsIHRhYjogRGV0YWlsU2lkZVBhbmVsVGFiKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGFiLnZhbHVlO1xuICB9XG5cbiAgdHJhY2tCeU1ldGFkYXRhTGFiZWwoX2k6IG51bWJlciwgaXRlbTogRGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBEZXRhaWxTaWRlUGFuZWxDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmJhY2suZW1pdCgpO1xuICB9XG5cbiAgb25UYWJDbGljayh0YWI6IERldGFpbFNpZGVQYW5lbFRhYik6IHZvaWQge1xuICAgIGlmICghdGhpcy5leHBhbmRlZCkge1xuICAgICAgdGhpcy5leHBhbmRUb2dnbGUuZW1pdCgpO1xuICAgIH1cbiAgICBpZiAodGFiLnZhbHVlICE9PSB0aGlzLmFjdGl2ZVRhYikge1xuICAgICAgdGhpcy50YWJDaGFuZ2UuZW1pdCh0YWIudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRWRpdERlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoZGF0YTogVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlQ2hhbmdlcy5lbWl0KGRhdGEpO1xuICB9XG5cbiAgb25FeHBhbmRUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRUb2dnbGUuZW1pdCgpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIG9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbTogRGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0ubGluaykge1xuICAgICAgdGhpcy5tZXRhZGF0YUxpbmtDbGljay5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0RvdENsYXNzKGl0ZW06IERldGFpbFNpZGVQYW5lbE1ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFpdGVtLnN0YXR1c0NvbG9yKSByZXR1cm4gJyc7XG4gICAgc3dpdGNoIChpdGVtLnN0YXR1c0NvbG9yKSB7XG4gICAgICBjYXNlICd5ZWxsb3cnOlxuICAgICAgICByZXR1cm4gJ2NxYS1iZy1bI0VBQjMwOF0nO1xuICAgICAgY2FzZSAncmVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNEQzI2MjZdJztcbiAgICAgIGNhc2UgJ2dyZWVuJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyMxNkEzNEFdJztcbiAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyM5NEEzQjhdJztcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtbWluLXctMCBjcWEtYmctd2hpdGVcIj5cbiAgPCEtLSBNYWluIGNvbnRlbnQ6IFNpZGUgbWVudSArIFNjcm9sbGFibGUgY29udGVudCAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWdyaWQgY3FhLWZsZXgtMSBjcWEtbWluLWgtMCBjcWEtbWluLXctMCBjcWEtb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cImV4cGFuZGVkID8gJ2F1dG8gMWZyJyA6ICdhdXRvIDBmcidcIlxuICAgIHN0eWxlPVwidHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIDAuM3MgZWFzZS1pbi1vdXRcIj5cbiAgICA8IS0tIExlZnQgdmVydGljYWwgaWNvbiBtZW51IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weS00IGNxYS1weC0yIGNxYS1ib3JkZXItciBjcWEtYm9yZGVyLVsjRjVGNUY1XSBjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzBBMEEwQV1cIlxuICAgICAgc3R5bGU9XCJib3gtc2hhZG93OiAxcHggNHB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XCI+XG4gICAgICA8IS0tIEV4cGFuZCAvIENvbGxhcHNlIGJ1dHRvbiAoYWx3YXlzIHZpc2libGUpIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiZXhwYW5kZWQgPyBjb2xsYXBzZVRvb2x0aXAgOiBleHBhbmRUb29sdGlwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgY3FhLXRleHQtWyM2NDc0OEJdIGhvdmVyOmNxYS1iZy1bI0UyRThGMF0gaG92ZXI6Y3FhLXRleHQtWyMzMzQxNTVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRXhwYW5kVG9nZ2xlKClcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzIwcHhdIGNxYS13LTUgY3FhLWgtNVwiPnt7IGV4cGFuZGVkID8gJ2NoZXZyb25fbGVmdCcgOiAnY2hldnJvbl9yaWdodCcgfX08L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8IS0tIENsb3NlIGJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93Q2xvc2VCdXR0b25cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiY2xvc2VUb29sdGlwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgY3FhLXRleHQtWyM2NDc0OEJdIGhvdmVyOmNxYS1iZy1bI0UyRThGMF0gaG92ZXI6Y3FhLXRleHQtWyMzMzQxNTVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXctNSBjcWEtaC01XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8IS0tIFRhYiBidXR0b25zICgxOjEgd2l0aCB0YWJzKSAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzOyB0cmFja0J5OiB0cmFja0J5VGFiVmFsdWVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwidGFiLmxhYmVsXCJcbiAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICBbY2xhc3MuY3FhLXRleHQtd2hpdGVdPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICBbY2xhc3MuY3FhLXRleHQtWyM2NDc0OEJdXT1cImFjdGl2ZVRhYiAhPT0gdGFiLnZhbHVlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgaG92ZXI6Y3FhLWJnLVsjRTJFOEYwXSBob3ZlcjpjcWEtdGV4dC1bIzMzNDE1NV0gY3FhLXRyYW5zaXRpb24tY29sb3JzIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctb2Zmc2V0LTJcIlxuICAgICAgICAoY2xpY2spPVwib25UYWJDbGljayh0YWIpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsyMHB4XSBjcWEtdy01IGNxYS1oLTVcIj57eyB0YWIuaWNvbiB8fCAnY2lyY2xlJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IGFyZWEgKGNvbGxhcHNlcyB3aXRoIGFuaW1hdGlvbiB3aGVuIGV4cGFuZGVkIGlzIGZhbHNlKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wIGNxYS1taW4tdy0wIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXNpZGUtcGFuZWwtc2Nyb2xsIGNxYS1mbGV4LTEgY3FhLW1pbi1oLTAgY3FhLW1pbi13LTAgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLXAtNCBjcWEtc3BhY2UteS00XCIgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OiBoaWRkZW47IG1pbi1oZWlnaHQ6IDA7IC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcIj5cbiAgICAgIDwhLS0gVGFiczogZXF1YWxseSBkaXN0cmlidXRlZCAoRmlnbWE6IHB1cnBsZSBhY3RpdmUsIGdyYXkgaW5hY3RpdmUpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtWzMuNXB4XSBjcWEtcC1bMy41cHhdIGNxYS1iZy1bI0YxRjVGOV0gY3FhLXJvdW5kZWQtbGcgY3FhLXctZnVsbFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IHRyYWNrQnk6IHRyYWNrQnlUYWJWYWx1ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVUYWIgPT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC13aGl0ZV09XCJhY3RpdmVUYWIgPT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LVsjNjQ3NDhCXV09XCJhY3RpdmVUYWIgIT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyIGNxYS1weS0yIGNxYS1yb3VuZGVkLWxnIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Y3FhLW9wYWNpdHktOTAgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQ2xpY2sodGFiKVwiPlxuICAgICAgICAgIHt7IHRhYi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRlc3QgQ2FzZSB0YWI6IHVzZSBjcWEtdGVzdC1jYXNlLWRldGFpbHMgKEZpZ21hIGRlc2lnbikgLS0+XG4gICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlVGFiID09PSAndGVzdC1jYXNlJ1wiXG4gICAgICAgIFtkZXNjcmlwdGlvblRpdGxlXT1cImRlc2NyaXB0aW9uVGl0bGVcIlxuICAgICAgICBbZGVzY3JpcHRpb25Db250ZW50XT1cImRlc2NyaXB0aW9uQ29udGVudFwiXG4gICAgICAgIFtzaG93RWRpdEJ1dHRvbl09XCJzaG93RWRpdEJ1dHRvblwiXG4gICAgICAgIFtzdGFydEluRWRpdE1vZGVdPVwic3RhcnRJbkVkaXRNb2RlXCJcbiAgICAgICAgW3NlbGVjdENvbmZpZ092ZXJyaWRlc109XCJzZWxlY3RDb25maWdPdmVycmlkZXNcIlxuICAgICAgICBbbWV0YWRhdGFJdGVtc109XCJtZXRhZGF0YUl0ZW1zXCJcbiAgICAgICAgW2xhYmVsc109XCJsYWJlbHNcIlxuICAgICAgICBbY29uZmlnVGl0bGVdPVwiY29uZmlnVGl0bGVcIlxuICAgICAgICBbY29uZmlnU2VjdGlvbnNdPVwiY29uZmlnU2VjdGlvbnNcIlxuICAgICAgICBbY29uZmlnU2VjdGlvbnNSb3cyXT1cImNvbmZpZ1NlY3Rpb25zUm93MlwiXG4gICAgICAgIFtwbGF0Zm9ybV09XCJwbGF0Zm9ybVwiXG4gICAgICAgIChlZGl0RGVzY3JpcHRpb24pPVwib25FZGl0RGVzY3JpcHRpb24oKVwiXG4gICAgICAgIChzYXZlQ2hhbmdlcyk9XCJvblNhdmVDaGFuZ2VzKCRldmVudClcIlxuICAgICAgICAobWV0YWRhdGFMaW5rQ2xpY2spPVwib25NZXRhZGF0YUxpbmtDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdFNlYXJjaCk9XCJzZWxlY3RTZWFyY2guZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdExvYWRNb3JlKT1cInNlbGVjdExvYWRNb3JlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RPcGVuZWQpPVwic2VsZWN0T3BlbmVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHM+XG5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgZm9yIG90aGVyIHRhYnMgKERhdGEgTGlicmFyeSwgVmFyaWFibGVzKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgIT09ICd0ZXN0LWNhc2UnXCIgY2xhc3M9XCJjcWEtcC00IGNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC1zbVwiPlxuICAgICAgICB7eyBhY3RpdmVUYWIgPT09ICdkYXRhLWxpYnJhcnknID8gJ0RhdGEgTGlicmFyeSBjb250ZW50JyA6ICdWYXJpYWJsZXMgY29udGVudCcgfX0g4oCTIGNvbWluZyBzb29uXG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXNpZGUtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXRhaWwtc2lkZS1wYW5lbC9kZXRhaWwtc2lkZS1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFpbC1zaWRlLXBhbmVsL2RldGFpbC1zaWRlLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBRXZCLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQVd2QixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBZTdFLE1BQU0sT0FBTyx3QkFBd0I7SUFtR25DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEcxQyw2RUFBNkU7UUFDcEUsU0FBSSxHQUF5QjtZQUNwQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQy9ELEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDaEUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtTQUN6RCxDQUFDO1FBRUYsaUNBQWlDO1FBQ3hCLGNBQVMsR0FBRyxXQUFXLENBQUM7UUFFakMsZ0NBQWdDO1FBQ3ZCLHFCQUFnQixHQUFHLGFBQWEsQ0FBQztRQUUxQywrQkFBK0I7UUFDdEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRWpDLGlHQUFpRztRQUN4RixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUVoQyxnRUFBZ0U7UUFDdkQs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O2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEhvc3RCaW5kaW5nLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JdGVtIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi1jYXJkL2NvbmZpZ3VyYXRpb24tY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRGV0YWlsU2lkZVBhbmVsVGFiLFxuICBEZXRhaWxTaWRlUGFuZWxNZXRhZGF0YUl0ZW0sXG4gIERldGFpbFNpZGVQYW5lbENvbmZpZ1NlY3Rpb24sXG59IGZyb20gJy4vZGV0YWlsLXNpZGUtcGFuZWwubW9kZWxzJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0VkaXRGb3JtRGF0YSxcbiAgU2VsZWN0Q29uZmlnT3ZlcnJpZGVzLFxufSBmcm9tICcuLi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWNhc2UtZGV0YWlscy1lZGl0L3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQuY29tcG9uZW50JztcbmltcG9ydCB7IERFVEFJTF9TSURFX1BBTkVMX1NDUk9MTF9TVFlMRVMgfSBmcm9tICcuL2RldGFpbC1zaWRlLXBhbmVsLnN0eWxlcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV0YWlsU2lkZVBhbmVsVGFiLCBEZXRhaWxTaWRlUGFuZWxNZXRhZGF0YUl0ZW0sIERldGFpbFNpZGVQYW5lbENvbmZpZ1NlY3Rpb24gfSBmcm9tICcuL2RldGFpbC1zaWRlLXBhbmVsLm1vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1kZXRhaWwtc2lkZS1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtc2lkZS1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW0RFVEFJTF9TSURFX1BBTkVMX1NDUk9MTF9TVFlMRVNdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOlxuICAgICAgJ2NxYS11aS1yb290IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1mbGV4LXNocmluay0wIGNxYS1mbGV4LWdyb3ctMCBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy1bLTRweF8wXzZweF8tMXB4X3JnYmEoMCwwLDAsMC4wNSldJyxcbiAgICBzdHlsZTogJ3RyYW5zaXRpb246IHdpZHRoIDAuM3MgZWFzZS1pbi1vdXQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBEZXRhaWxTaWRlUGFuZWxDb21wb25lbnQge1xuICAvKiogVGFicyAtIGVhY2ggdGFiIGhhcyBhIHNpZGUgcGFuZWwgaWNvbiBidXR0b247IHRhYnMgYW5kIGJ1dHRvbnMgYXJlIDE6MSAqL1xuICBASW5wdXQoKSB0YWJzOiBEZXRhaWxTaWRlUGFuZWxUYWJbXSA9IFtcbiAgICB7IGxhYmVsOiAnVGVzdCBDYXNlJywgdmFsdWU6ICd0ZXN0LWNhc2UnLCBpY29uOiAnZGVzY3JpcHRpb24nIH0sXG4gICAgeyBsYWJlbDogJ0RhdGEgTGlicmFyeScsIHZhbHVlOiAnZGF0YS1saWJyYXJ5JywgaWNvbjogJ2ZvbGRlcicgfSxcbiAgICB7IGxhYmVsOiAnVmFyaWFibGVzJywgdmFsdWU6ICd2YXJpYWJsZXMnLCBpY29uOiAnY29kZScgfSxcbiAgXTtcblxuICAvKiogQ3VycmVudGx5IGFjdGl2ZSB0YWIgdmFsdWUgKi9cbiAgQElucHV0KCkgYWN0aXZlVGFiID0gJ3Rlc3QtY2FzZSc7XG5cbiAgLyoqIERlc2NyaXB0aW9uIHNlY3Rpb24gdGl0bGUgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb25UaXRsZSA9ICdEZXNjcmlwdGlvbic7XG5cbiAgLyoqIERlc2NyaXB0aW9uIHRleHQgY29udGVudCAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbkNvbnRlbnQgPSAnJztcblxuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiB1c2VzIHJpY2ggdGV4dCBlZGl0b3IgYW5kIHJlbmRlcnMgYXMgSFRNTC4gSG9zdCBhcHAgbXVzdCBsb2FkIFRyaXguICovXG4gIEBJbnB1dCgpIGVuYWJsZU1hcmtkb3duID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgRWRpdCBidXR0b24gaW4gdGhlIERlc2NyaXB0aW9uIGhlYWRlciAqL1xuICBASW5wdXQoKSBzaG93RWRpdEJ1dHRvbiA9IHRydWU7XG5cbiAgLyoqIE1ldGFkYXRhIGl0ZW1zIChDcmVhdGVkIG9uLCBTdGF0dXMsIFByaW9yaXR5LCBldGMuKSAqL1xuICBASW5wdXQoKSBtZXRhZGF0YUl0ZW1zOiBEZXRhaWxTaWRlUGFuZWxNZXRhZGF0YUl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBMYWJlbHMvdGFncyAoZS5nLiBBdXRvbWF0aW9uLCBBUEksIFNESywgVUkvVVgpICovXG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ29uZmlndXJhdGlvbiBzZWN0aW9ucyAtIGZ1bGwgd2lkdGggKGUuZy4gRXhlY3V0aW9uLCBBSSBDb25maWd1cmF0aW9uKSAqL1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uczogRGV0YWlsU2lkZVBhbmVsQ29uZmlnU2VjdGlvbltdID0gW107XG5cbiAgLyoqIE9wdGlvbmFsIGNvbmZpZyBzZWN0aW9ucyBkaXNwbGF5ZWQgaW4gYSAyLWNvbHVtbiByb3cgKGUuZy4gV2FpdHMgJiBSZXRyaWVzLCBEZXZpY2UpICovXG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zUm93MjogRGV0YWlsU2lkZVBhbmVsQ29uZmlnU2VjdGlvbltdID0gW107XG5cbiAgLyoqIFBsYXRmb3JtOiAnd2ViJyBvciAnbW9iaWxlJy4gRGVmYXVsdHMgdG8gJ3dlYicuIFVzZWQgZm9yIERldmljZSBTZXR0aW5ncy4gKi9cbiAgQElucHV0KCkgcGxhdGZvcm06ICd3ZWInIHwgJ21vYmlsZScgPSAnd2ViJztcblxuICAvKiogQ29uZmlndXJhdGlvbiBzZWN0aW9uIHRpdGxlICovXG4gIEBJbnB1dCgpIGNvbmZpZ1RpdGxlID0gJ0NvbmZpZ3VyYXRpb24nO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNsb3NlIGJ1dHRvbiBpbiB0aGUgc2lkZSBtZW51ICovXG4gIEBJbnB1dCgpIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHRydWUsIHRlc3QgY2FzZSBkZXRhaWxzIHN0YXJ0IGluIGVkaXQgbW9kZSAodXNlZnVsIGZvciBTdG9yeWJvb2spLiAqL1xuICBASW5wdXQoKSBzdGFydEluRWRpdE1vZGUgPSBmYWxzZTtcblxuICAvKiogV2hlbiBwcm92aWRlZCwgcGFyZW50IGNvbnRyb2xzIGVkaXQgbW9kZSAoZml4ZXMgU3Rvcnlib29rIGV2ZW50IGZsb3cpLiAqL1xuICBASW5wdXQoKSBlZGl0aW5nPzogYm9vbGVhbjtcblxuICAvKiogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3QgZm9yIEFQSS1kcml2ZW4gb3B0aW9ucywgc2VydmVyIHNlYXJjaCwgbG9hZCBtb3JlLiAqL1xuICBASW5wdXQoKSBzZWxlY3RDb25maWdPdmVycmlkZXM6IFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IHt9O1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBwYW5lbCBpcyBleHBhbmRlZCAoYWZmZWN0cyBleHBhbmQgYnV0dG9uIGljb24gYW5kIHBhbmVsIHdpZHRoKSAqL1xuICBASW5wdXQoKSBleHBhbmRlZCA9IHRydWU7XG5cbiAgLyoqIFBhbmVsIHdpZHRoIHdoZW4gZXhwYW5kZWQgKGUuZy4gJzQ4MHB4JywgJzI1JScpICovXG4gIEBJbnB1dCgpIGV4cGFuZGVkV2lkdGggPSAnMzgwcHgnO1xuXG4gIC8qKiBQYW5lbCB3aWR0aCB3aGVuIGNvbGxhcHNlZCAoZS5nLiAnNTZweCcgLSBmaXRzIGljb24gYmFyICsgYmFjayBidXR0b24pICovXG4gIEBJbnB1dCgpIGNvbGxhcHNlZFdpZHRoID0gJzU2cHgnO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKSBnZXQgaG9zdFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWQgPyB0aGlzLmV4cGFuZGVkV2lkdGggOiB0aGlzLmNvbGxhcHNlZFdpZHRoO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5taW4td2lkdGgnKSBnZXQgaG9zdE1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWQgPyB0aGlzLmV4cGFuZGVkV2lkdGggOiB0aGlzLmNvbGxhcHNlZFdpZHRoO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5tYXgtd2lkdGgnKSBnZXQgaG9zdE1heFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWQgPyB0aGlzLmV4cGFuZGVkV2lkdGggOiB0aGlzLmNvbGxhcHNlZFdpZHRoO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5vdmVyZmxvdycpIGhvc3RPdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gIC8qKiBUb29sdGlwIGZvciBleHBhbmQgYnV0dG9uIHdoZW4gcGFuZWwgaXMgY29sbGFwc2VkICovXG4gIEBJbnB1dCgpIGV4cGFuZFRvb2x0aXAgPSAnRXhwYW5kJztcblxuICAvKiogVG9vbHRpcCBmb3IgZXhwYW5kIGJ1dHRvbiB3aGVuIHBhbmVsIGlzIGV4cGFuZGVkIChjb2xsYXBzZSkgKi9cbiAgQElucHV0KCkgY29sbGFwc2VUb29sdGlwID0gJ0NvbGxhcHNlJztcblxuICAvKiogVG9vbHRpcCBmb3IgY2xvc2UgYnV0dG9uICovXG4gIEBJbnB1dCgpIGNsb3NlVG9vbHRpcCA9ICdDbG9zZSc7XG5cbiAgQE91dHB1dCgpIGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB0YWJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGVkaXREZXNjcmlwdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGE+KCk7XG4gIEBPdXRwdXQoKSBtZXRhZGF0YUxpbmtDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0U2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0T3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSBsYWJlbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBleHBhbmRUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgdHJhY2tCeVRhYlZhbHVlKF9pOiBudW1iZXIsIHRhYjogRGV0YWlsU2lkZVBhbmVsVGFiKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGFiLnZhbHVlO1xuICB9XG5cbiAgdHJhY2tCeU1ldGFkYXRhTGFiZWwoX2k6IG51bWJlciwgaXRlbTogRGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBEZXRhaWxTaWRlUGFuZWxDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmJhY2suZW1pdCgpO1xuICB9XG5cbiAgb25UYWJDbGljayh0YWI6IERldGFpbFNpZGVQYW5lbFRhYik6IHZvaWQge1xuICAgIGlmICghdGhpcy5leHBhbmRlZCkge1xuICAgICAgdGhpcy5leHBhbmRUb2dnbGUuZW1pdCgpO1xuICAgIH1cbiAgICBpZiAodGFiLnZhbHVlICE9PSB0aGlzLmFjdGl2ZVRhYikge1xuICAgICAgdGhpcy50YWJDaGFuZ2UuZW1pdCh0YWIudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRWRpdERlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoZGF0YTogVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlQ2hhbmdlcy5lbWl0KGRhdGEpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgb25FeHBhbmRUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRUb2dnbGUuZW1pdCgpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIG9uTWV0YWRhdGFMaW5rQ2xpY2soaXRlbTogRGV0YWlsU2lkZVBhbmVsTWV0YWRhdGFJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0ubGluaykge1xuICAgICAgdGhpcy5tZXRhZGF0YUxpbmtDbGljay5lbWl0KGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0RvdENsYXNzKGl0ZW06IERldGFpbFNpZGVQYW5lbE1ldGFkYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKCFpdGVtLnN0YXR1c0NvbG9yKSByZXR1cm4gJyc7XG4gICAgc3dpdGNoIChpdGVtLnN0YXR1c0NvbG9yKSB7XG4gICAgICBjYXNlICd5ZWxsb3cnOlxuICAgICAgICByZXR1cm4gJ2NxYS1iZy1bI0VBQjMwOF0nO1xuICAgICAgY2FzZSAncmVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyNEQzI2MjZdJztcbiAgICAgIGNhc2UgJ2dyZWVuJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyMxNkEzNEFdJztcbiAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtYmctWyM5NEEzQjhdJztcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtbWluLXctMCBjcWEtYmctd2hpdGVcIj5cbiAgPCEtLSBNYWluIGNvbnRlbnQ6IFNpZGUgbWVudSArIFNjcm9sbGFibGUgY29udGVudCAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWdyaWQgY3FhLWZsZXgtMSBjcWEtbWluLWgtMCBjcWEtbWluLXctMCBjcWEtb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cImV4cGFuZGVkID8gJ2F1dG8gMWZyJyA6ICdhdXRvIDBmcidcIlxuICAgIHN0eWxlPVwidHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIDAuM3MgZWFzZS1pbi1vdXRcIj5cbiAgICA8IS0tIExlZnQgdmVydGljYWwgaWNvbiBtZW51IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weS00IGNxYS1weC0yIGNxYS1ib3JkZXItciBjcWEtYm9yZGVyLVsjRjVGNUY1XSBjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzBBMEEwQV1cIlxuICAgICAgc3R5bGU9XCJib3gtc2hhZG93OiAxcHggNHB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XCI+XG4gICAgICA8IS0tIEV4cGFuZCAvIENvbGxhcHNlIGJ1dHRvbiAoYWx3YXlzIHZpc2libGUpIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiZXhwYW5kZWQgPyBjb2xsYXBzZVRvb2x0aXAgOiBleHBhbmRUb29sdGlwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgY3FhLXRleHQtWyM2NDc0OEJdIGhvdmVyOmNxYS1iZy1bI0UyRThGMF0gaG92ZXI6Y3FhLXRleHQtWyMzMzQxNTVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRXhwYW5kVG9nZ2xlKClcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzIwcHhdIGNxYS13LTUgY3FhLWgtNVwiPnt7IGV4cGFuZGVkID8gJ2NoZXZyb25fbGVmdCcgOiAnY2hldnJvbl9yaWdodCcgfX08L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8IS0tIENsb3NlIGJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93Q2xvc2VCdXR0b25cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiY2xvc2VUb29sdGlwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgY3FhLXRleHQtWyM2NDc0OEJdIGhvdmVyOmNxYS1iZy1bI0UyRThGMF0gaG92ZXI6Y3FhLXRleHQtWyMzMzQxNTVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjM0Y0M0VFXSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLW9mZnNldC0yXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXctNSBjcWEtaC01XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8IS0tIFRhYiBidXR0b25zICgxOjEgd2l0aCB0YWJzKSAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzOyB0cmFja0J5OiB0cmFja0J5VGFiVmFsdWVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwidGFiLmxhYmVsXCJcbiAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICBbY2xhc3MuY3FhLXRleHQtd2hpdGVdPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICBbY2xhc3MuY3FhLXRleHQtWyM2NDc0OEJdXT1cImFjdGl2ZVRhYiAhPT0gdGFiLnZhbHVlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy05IGNxYS1oLTkgY3FhLXJvdW5kZWQtbGcgaG92ZXI6Y3FhLWJnLVsjRTJFOEYwXSBob3ZlcjpjcWEtdGV4dC1bIzMzNDE1NV0gY3FhLXRyYW5zaXRpb24tY29sb3JzIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctb2Zmc2V0LTJcIlxuICAgICAgICAoY2xpY2spPVwib25UYWJDbGljayh0YWIpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsyMHB4XSBjcWEtdy01IGNxYS1oLTVcIj57eyB0YWIuaWNvbiB8fCAnY2lyY2xlJyB9fTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IGFyZWEgKGNvbGxhcHNlcyB3aXRoIGFuaW1hdGlvbiB3aGVuIGV4cGFuZGVkIGlzIGZhbHNlKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4taC0wIGNxYS1taW4tdy0wIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXNpZGUtcGFuZWwtc2Nyb2xsIGNxYS1mbGV4LTEgY3FhLW1pbi1oLTAgY3FhLW1pbi13LTAgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW4gY3FhLXAtNCBjcWEtc3BhY2UteS00XCIgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OiBoaWRkZW47IG1pbi1oZWlnaHQ6IDA7IC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcIj5cbiAgICAgIDwhLS0gVGFiczogZXF1YWxseSBkaXN0cmlidXRlZCAoRmlnbWE6IHB1cnBsZSBhY3RpdmUsIGdyYXkgaW5hY3RpdmUpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtWzMuNXB4XSBjcWEtcC1bMy41cHhdIGNxYS1iZy1bI0YxRjVGOV0gY3FhLXJvdW5kZWQtbGcgY3FhLXctZnVsbFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IHRyYWNrQnk6IHRyYWNrQnlUYWJWYWx1ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVUYWIgPT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1iZy1bIzNGNDNFRV1dPVwiYWN0aXZlVGFiID09PSB0YWIudmFsdWVcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC13aGl0ZV09XCJhY3RpdmVUYWIgPT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS10ZXh0LVsjNjQ3NDhCXV09XCJhY3RpdmVUYWIgIT09IHRhYi52YWx1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyIGNxYS1weS0yIGNxYS1yb3VuZGVkLWxnIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Y3FhLW9wYWNpdHktOTAgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bIzNGNDNFRV0gZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMlwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQ2xpY2sodGFiKVwiPlxuICAgICAgICAgIHt7IHRhYi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRlc3QgQ2FzZSB0YWI6IHVzZSBjcWEtdGVzdC1jYXNlLWRldGFpbHMgKEZpZ21hIGRlc2lnbikgLS0+XG4gICAgICA8Y3FhLXRlc3QtY2FzZS1kZXRhaWxzXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlVGFiID09PSAndGVzdC1jYXNlJ1wiXG4gICAgICAgIFtkZXNjcmlwdGlvblRpdGxlXT1cImRlc2NyaXB0aW9uVGl0bGVcIlxuICAgICAgICBbZGVzY3JpcHRpb25Db250ZW50XT1cImRlc2NyaXB0aW9uQ29udGVudFwiXG4gICAgICAgIFtlbmFibGVNYXJrZG93bl09XCJlbmFibGVNYXJrZG93blwiXG4gICAgICAgIFtzaG93RWRpdEJ1dHRvbl09XCJzaG93RWRpdEJ1dHRvblwiXG4gICAgICAgIFtzdGFydEluRWRpdE1vZGVdPVwic3RhcnRJbkVkaXRNb2RlXCJcbiAgICAgICAgW2VkaXRpbmddPVwiZWRpdGluZ1wiXG4gICAgICAgIFtzZWxlY3RDb25maWdPdmVycmlkZXNdPVwic2VsZWN0Q29uZmlnT3ZlcnJpZGVzXCJcbiAgICAgICAgW21ldGFkYXRhSXRlbXNdPVwibWV0YWRhdGFJdGVtc1wiXG4gICAgICAgIFtsYWJlbHNdPVwibGFiZWxzXCJcbiAgICAgICAgW2NvbmZpZ1RpdGxlXT1cImNvbmZpZ1RpdGxlXCJcbiAgICAgICAgW2NvbmZpZ1NlY3Rpb25zXT1cImNvbmZpZ1NlY3Rpb25zXCJcbiAgICAgICAgW2NvbmZpZ1NlY3Rpb25zUm93Ml09XCJjb25maWdTZWN0aW9uc1JvdzJcIlxuICAgICAgICBbcGxhdGZvcm1dPVwicGxhdGZvcm1cIlxuICAgICAgICAoZWRpdERlc2NyaXB0aW9uKT1cIm9uRWRpdERlc2NyaXB0aW9uKClcIlxuICAgICAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgICAoc2F2ZUNoYW5nZXMpPVwib25TYXZlQ2hhbmdlcygkZXZlbnQpXCJcbiAgICAgICAgKG1ldGFkYXRhTGlua0NsaWNrKT1cIm9uTWV0YWRhdGFMaW5rQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RTZWFyY2gpPVwic2VsZWN0U2VhcmNoLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RMb2FkTW9yZSk9XCJzZWxlY3RMb2FkTW9yZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VsZWN0T3BlbmVkKT1cInNlbGVjdE9wZW5lZC5lbWl0KCRldmVudClcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAobGFiZWxBZGRlZCk9XCJsYWJlbEFkZGVkLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtdGVzdC1jYXNlLWRldGFpbHM+XG5cbiAgICAgIDwhLS0gUGxhY2Vob2xkZXIgZm9yIG90aGVyIHRhYnMgKERhdGEgTGlicmFyeSwgVmFyaWFibGVzKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgIT09ICd0ZXN0LWNhc2UnXCIgY2xhc3M9XCJjcWEtcC00IGNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC1zbVwiPlxuICAgICAgICB7eyBhY3RpdmVUYWIgPT09ICdkYXRhLWxpYnJhcnknID8gJ0RhdGEgTGlicmFyeSBjb250ZW50JyA6ICdWYXJpYWJsZXMgY29udGVudCcgfX0g4oCTIGNvbWluZyBzb29uXG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19