@cqa-lib/cqa-ui 1.1.233 → 1.1.235

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.
@@ -15,6 +15,7 @@ export class MainStepCollapseComponent {
15
15
  this.viewStepsAsRedirect = false;
16
16
  /** When redirecting, open link in new tab. Default true */
17
17
  this.viewStepsOpenInNewTab = true;
18
+ this.expandOnViewSteps = true;
18
19
  /** Optional initial item id to expand (e.g. first failed prerequisite). When set and present in items, that item is expanded on load. */
19
20
  this.initialExpandedItemId = null;
20
21
  /** When true, shows Edit/Add/More options icons before duration on each item. */
@@ -91,12 +92,14 @@ export class MainStepCollapseComponent {
91
92
  onViewSteps(item, event) {
92
93
  event.preventDefault();
93
94
  event.stopPropagation();
94
- // Accordion behavior: if clicking the same item, close it; otherwise, close previous and open new one
95
- if (this.expandedItemId === item.id) {
96
- this.expandedItemId = null; // Close if already open
97
- }
98
- else {
99
- this.expandedItemId = item.id; // Open the clicked item (closes previous automatically)
95
+ if (this.expandOnViewSteps) {
96
+ // Accordion behavior: if clicking the same item, close it; otherwise, close previous and open new one
97
+ if (this.expandedItemId === item.id) {
98
+ this.expandedItemId = null; // Close if already open
99
+ }
100
+ else {
101
+ this.expandedItemId = item.id; // Open the clicked item (closes previous automatically)
102
+ }
100
103
  }
101
104
  this.viewSteps.emit(item);
102
105
  }
@@ -142,7 +145,7 @@ export class MainStepCollapseComponent {
142
145
  }
143
146
  }
144
147
  MainStepCollapseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainStepCollapseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
145
- MainStepCollapseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MainStepCollapseComponent, selector: "cqa-main-step-collapse", inputs: { title: "title", items: "items", expanded: "expanded", icon: "icon", count: "count", countLoading: "countLoading", itemContentTemplate: "itemContentTemplate", headerButtons: "headerButtons", viewStepsAsRedirect: "viewStepsAsRedirect", getViewStepsUrl: "getViewStepsUrl", viewStepsOpenInNewTab: "viewStepsOpenInNewTab", initialExpandedItemId: "initialExpandedItemId", isDebug: "isDebug", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions" }, outputs: { viewSteps: "viewSteps", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", headerButtonClick: "headerButtonClick", expandedChange: "expandedChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, queries: [{ propertyName: "itemContentTpl", first: true, predicate: ["itemContent"], descendants: true, read: TemplateRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Header -->\n<div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggle()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <!-- Chevron Icon (Left) -->\n <!-- <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#3F51B5\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> -->\n <div><svg [class.cqa-rotate-180]=\"isExpanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- Chain-Link Icon (if configured, otherwise default) -->\n <!-- <div *ngIf=\"icon && icon.type === 'folder'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#3F51B5\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div *ngIf=\"icon && icon.type === 'loop'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/>\n <path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div> -->\n <!-- Bar Icon (Bulleted List) -->\n <div *ngIf=\"icon && icon.type === 'bar'\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <!-- First bullet and line -->\n <circle cx=\"3\" cy=\"5\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"5\" x2=\"17\" y2=\"5\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Second bullet and line -->\n <circle cx=\"3\" cy=\"10\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"10\" x2=\"17\" y2=\"10\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Third bullet and line -->\n <circle cx=\"3\" cy=\"15\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"15\" x2=\"17\" y2=\"15\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <!-- Default Chain-Link Icon (when no icon or icon type is not specified) -->\n <div *ngIf=\"!icon || (icon.type !== 'bar' && icon.type !== 'folder' && icon.type !== 'loop' && icon.type !== 'custom')\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.50033 14.1663H5.83366C4.72859 14.1663 3.66878 13.7274 2.88738 12.946C2.10598 12.1646 1.66699 11.1047 1.66699 9.99967C1.66699 8.89461 2.10598 7.8348 2.88738 7.0534C3.66878 6.27199 4.72859 5.83301 5.83366 5.83301H7.50033\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5 5.83301H14.1667C15.2717 5.83301 16.3315 6.27199 17.1129 7.0534C17.8943 7.8348 18.3333 8.89461 18.3333 9.99967C18.3333 11.1047 17.8943 12.1646 17.1129 12.946C16.3315 13.7274 15.2717 14.1663 14.1667 14.1663H12.5\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.66699 10H13.3337\" stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Custom Icon -->\n <div *ngIf=\"icon && icon.type === 'custom' && icon.svg\" [innerHTML]=\"icon.svg\"></div>\n\n <!-- Title -->\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ title }}\n </span>\n\n <!-- Badge and dynamic header buttons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" (click)=\"$event.stopPropagation()\">\n <ng-container *ngFor=\"let btn of headerButtons; let i = index\">\n <cqa-button\n [text]=\"btn.text\"\n [icon]=\"btn.icon\"\n [variant]=\"btn.variant || 'outlined'\"\n [disabled]=\"btn.disabled\"\n [tooltip]=\"btn.tooltip\"\n [customClass]=\"btn.customClass\"\n [btnSize]=\"btn.btnSize || 'sm'\"\n (clicked)=\"onHeaderButtonClick(btn, i, $event)\">\n </cqa-button>\n </ng-container>\n <span\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-bg-[#C6D2FF] cqa-text-[12px] cqa-leading-[16px] cqa-text-[#432DD7] cqa-inline-flex cqa-items-center cqa-justify-center cqa-min-w-[24px]\">\n <mat-spinner *ngIf=\"countLoading\" diameter=\"16\" class=\"cqa-inline-block\"></mat-spinner>\n <span *ngIf=\"!countLoading\">{{ getDisplayCount() }}</span>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Expanded Content -->\n<div *ngIf=\"isExpanded\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <!-- When there are no items, display ng-content directly -->\n <ng-container *ngIf=\"!items || items.length === 0\">\n <ng-content></ng-content>\n </ng-container>\n\n <!-- When items exist, display them -->\n <div *ngFor=\"let item of items\">\n\n <!-- Item Header -->\n <div class=\"cqa-bg-white cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-md cqa-overflow-hidden\">\n <div class=\"cqa-py-2 cqa-px-3 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3\">\n <!-- Left side: Status and Title -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-1\">\n <!-- Status Icon (Filled Green Circle with Checkmark) -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"item.status === 'success'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_48_121)\">\n <path\n d=\"M10.0003 18.3337C14.6027 18.3337 18.3337 14.6027 18.3337 10.0003C18.3337 5.39795 14.6027 1.66699 10.0003 1.66699C5.39795 1.66699 1.66699 5.39795 1.66699 10.0003C1.66699 14.6027 5.39795 18.3337 10.0003 18.3337Z\"\n stroke=\"#00A63E\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M7.5 9.99967L9.16667 11.6663L12.5 8.33301\" stroke=\"#00A63E\" stroke-width=\"1.66667\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_48_121\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <!-- Failed -->\n <svg *ngIf=\"item.status === 'failed'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#EF4444\" />\n <path d=\"M7 7L13 13M13 7L7 13\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <!-- Pending -->\n <svg *ngIf=\"item.status === 'pending'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#9CA3AF\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <!-- Running -->\n <svg *ngIf=\"item.status === 'running'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#3B82F6\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n \n <!-- Title -->\n <span class=\"cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ item.title }}\n </span>\n </div>\n \n <!-- Right side: Duration and View Steps Link -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3\">\n <!-- Step action icons (only when isDebug) -->\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep(item, $event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of stepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <!-- Duration with Clock Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\n stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6 3V6L8 7\" stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"cqa-text-[14px] cqa-leading-[20px] cqa-text-[#6A7282]\">\n {{ formatDuration(item.duration) }}\n </span>\n </div>\n \n <!-- View Steps Link: redirect mode (navigates to URL) or inline mode (toggle expand) -->\n <a *ngIf=\"hasViewStepsRedirectUrl(item)\"\n [href]=\"getItemViewStepsUrl(item)\"\n [attr.target]=\"viewStepsOpenInNewTab ? '_blank' : null\"\n [attr.rel]=\"viewStepsOpenInNewTab ? 'noopener noreferrer' : null\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>View steps</span>\n <svg class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n <a *ngIf=\"!hasViewStepsRedirectUrl(item)\" href=\"#\" (click)=\"onViewSteps(item, $event)\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>{{ isItemExpanded(item.id) ? 'Hide steps' : 'View steps' }}</span>\n <svg [class.cqa-rotate-90]=\"isItemExpanded(item.id)\" class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n </div>\n </div>\n\n <!-- Steps Content (shown when item is expanded) -->\n <div *ngIf=\"isItemExpanded(item.id)\">\n <!-- Custom template via TemplateRef (from @ContentChild or @Input) - passes item as context -->\n <ng-container *ngIf=\"itemContentTpl || itemContentTemplate\">\n <div class=\"cqa-p-3\">\n <ng-container\n *ngTemplateOutlet=\"(itemContentTpl || itemContentTemplate)!; context: { $implicit: item, item: item }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Custom content projection via ng-content - displayed for all expanded items -->\n <ng-content select=\"[itemContent]\"></ng-content>\n </div>\n </div>\n</div>\n\n<!-- Custom content projection after all items - for steps loaded after API call -->\n<ng-content select=\"[afterItems]\"></ng-content>", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
148
+ MainStepCollapseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MainStepCollapseComponent, selector: "cqa-main-step-collapse", inputs: { title: "title", items: "items", expanded: "expanded", icon: "icon", count: "count", countLoading: "countLoading", itemContentTemplate: "itemContentTemplate", headerButtons: "headerButtons", viewStepsAsRedirect: "viewStepsAsRedirect", getViewStepsUrl: "getViewStepsUrl", viewStepsOpenInNewTab: "viewStepsOpenInNewTab", expandOnViewSteps: "expandOnViewSteps", initialExpandedItemId: "initialExpandedItemId", isDebug: "isDebug", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions" }, outputs: { viewSteps: "viewSteps", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", headerButtonClick: "headerButtonClick", expandedChange: "expandedChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, queries: [{ propertyName: "itemContentTpl", first: true, predicate: ["itemContent"], descendants: true, read: TemplateRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Header -->\n<div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggle()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <!-- Chevron Icon (Left) -->\n <!-- <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#3F51B5\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> -->\n <div><svg [class.cqa-rotate-180]=\"isExpanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- Chain-Link Icon (if configured, otherwise default) -->\n <!-- <div *ngIf=\"icon && icon.type === 'folder'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#3F51B5\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div *ngIf=\"icon && icon.type === 'loop'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/>\n <path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div> -->\n <!-- Bar Icon (Bulleted List) -->\n <div *ngIf=\"icon && icon.type === 'bar'\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <!-- First bullet and line -->\n <circle cx=\"3\" cy=\"5\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"5\" x2=\"17\" y2=\"5\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Second bullet and line -->\n <circle cx=\"3\" cy=\"10\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"10\" x2=\"17\" y2=\"10\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Third bullet and line -->\n <circle cx=\"3\" cy=\"15\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"15\" x2=\"17\" y2=\"15\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <!-- Default Chain-Link Icon (when no icon or icon type is not specified) -->\n <div *ngIf=\"!icon || (icon.type !== 'bar' && icon.type !== 'folder' && icon.type !== 'loop' && icon.type !== 'custom')\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.50033 14.1663H5.83366C4.72859 14.1663 3.66878 13.7274 2.88738 12.946C2.10598 12.1646 1.66699 11.1047 1.66699 9.99967C1.66699 8.89461 2.10598 7.8348 2.88738 7.0534C3.66878 6.27199 4.72859 5.83301 5.83366 5.83301H7.50033\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5 5.83301H14.1667C15.2717 5.83301 16.3315 6.27199 17.1129 7.0534C17.8943 7.8348 18.3333 8.89461 18.3333 9.99967C18.3333 11.1047 17.8943 12.1646 17.1129 12.946C16.3315 13.7274 15.2717 14.1663 14.1667 14.1663H12.5\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.66699 10H13.3337\" stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Custom Icon -->\n <div *ngIf=\"icon && icon.type === 'custom' && icon.svg\" [innerHTML]=\"icon.svg\"></div>\n\n <!-- Title -->\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ title }}\n </span>\n\n <!-- Badge and dynamic header buttons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" (click)=\"$event.stopPropagation()\">\n <ng-container *ngFor=\"let btn of headerButtons; let i = index\">\n <cqa-button\n [text]=\"btn.text\"\n [icon]=\"btn.icon\"\n [variant]=\"btn.variant || 'outlined'\"\n [disabled]=\"btn.disabled\"\n [tooltip]=\"btn.tooltip\"\n [customClass]=\"btn.customClass\"\n [btnSize]=\"btn.btnSize || 'sm'\"\n (clicked)=\"onHeaderButtonClick(btn, i, $event)\">\n </cqa-button>\n </ng-container>\n <span\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-bg-[#C6D2FF] cqa-text-[12px] cqa-leading-[16px] cqa-text-[#432DD7] cqa-inline-flex cqa-items-center cqa-justify-center cqa-min-w-[24px]\">\n <mat-spinner *ngIf=\"countLoading\" diameter=\"16\" class=\"cqa-inline-block\"></mat-spinner>\n <span *ngIf=\"!countLoading\">{{ getDisplayCount() }}</span>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Expanded Content -->\n<div *ngIf=\"isExpanded\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <!-- When there are no items, display ng-content directly -->\n <ng-container *ngIf=\"!items || items.length === 0\">\n <ng-content></ng-content>\n </ng-container>\n\n <!-- When items exist, display them -->\n <div *ngFor=\"let item of items\">\n\n <!-- Item Header -->\n <div class=\"cqa-bg-white cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-md cqa-overflow-hidden\">\n <div class=\"cqa-py-2 cqa-px-3 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3\">\n <!-- Left side: Status and Title -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-1\">\n <!-- Status Icon (Filled Green Circle with Checkmark) -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"item.status === 'success'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_48_121)\">\n <path\n d=\"M10.0003 18.3337C14.6027 18.3337 18.3337 14.6027 18.3337 10.0003C18.3337 5.39795 14.6027 1.66699 10.0003 1.66699C5.39795 1.66699 1.66699 5.39795 1.66699 10.0003C1.66699 14.6027 5.39795 18.3337 10.0003 18.3337Z\"\n stroke=\"#00A63E\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M7.5 9.99967L9.16667 11.6663L12.5 8.33301\" stroke=\"#00A63E\" stroke-width=\"1.66667\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_48_121\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <!-- Failed -->\n <svg *ngIf=\"item.status === 'failed'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#EF4444\" />\n <path d=\"M7 7L13 13M13 7L7 13\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <!-- Pending -->\n <svg *ngIf=\"item.status === 'pending'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#9CA3AF\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <!-- Running -->\n <svg *ngIf=\"item.status === 'running'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#3B82F6\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n \n <!-- Title -->\n <span class=\"cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ item.title }}\n </span>\n </div>\n \n <!-- Right side: Duration and View Steps Link -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3\">\n <!-- Step action icons (only when isDebug) -->\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep(item, $event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of stepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <!-- Duration with Clock Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\n stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6 3V6L8 7\" stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"cqa-text-[14px] cqa-leading-[20px] cqa-text-[#6A7282]\">\n {{ formatDuration(item.duration) }}\n </span>\n </div>\n \n <!-- View Steps Link: redirect mode (navigates to URL) or inline mode (toggle expand) -->\n <a *ngIf=\"hasViewStepsRedirectUrl(item)\"\n [href]=\"getItemViewStepsUrl(item)\"\n [attr.target]=\"viewStepsOpenInNewTab ? '_blank' : null\"\n [attr.rel]=\"viewStepsOpenInNewTab ? 'noopener noreferrer' : null\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>View steps</span>\n <svg class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n <a *ngIf=\"!hasViewStepsRedirectUrl(item)\" href=\"#\" (click)=\"onViewSteps(item, $event)\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>{{ isItemExpanded(item.id) ? 'Hide steps' : 'View steps' }}</span>\n <svg [class.cqa-rotate-90]=\"isItemExpanded(item.id)\" class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n </div>\n </div>\n\n <!-- Steps Content (shown when item is expanded) -->\n <div *ngIf=\"isItemExpanded(item.id)\">\n <!-- Custom template via TemplateRef (from @ContentChild or @Input) - passes item as context -->\n <ng-container *ngIf=\"itemContentTpl || itemContentTemplate\">\n <div class=\"cqa-p-3\">\n <ng-container\n *ngTemplateOutlet=\"(itemContentTpl || itemContentTemplate)!; context: { $implicit: item, item: item }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Custom content projection via ng-content - displayed for all expanded items -->\n <ng-content select=\"[itemContent]\"></ng-content>\n </div>\n </div>\n</div>\n\n<!-- Custom content projection after all items - for steps loaded after API call -->\n<ng-content select=\"[afterItems]\"></ng-content>", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
146
149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MainStepCollapseComponent, decorators: [{
147
150
  type: Component,
148
151
  args: [{ selector: 'cqa-main-step-collapse', host: { class: 'cqa-ui-root cqa-w-full' }, template: "<!-- Header -->\n<div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggle()\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <!-- Chevron Icon (Left) -->\n <!-- <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#3F51B5\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> -->\n <div><svg [class.cqa-rotate-180]=\"isExpanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg></div>\n\n <!-- Chain-Link Icon (if configured, otherwise default) -->\n <!-- <div *ngIf=\"icon && icon.type === 'folder'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.6666 11.6667C11.976 11.6667 12.2728 11.5437 12.4916 11.325C12.7104 11.1062 12.8333 10.8094 12.8333 10.5V4.66667C12.8333 4.35725 12.7104 4.0605 12.4916 3.84171C12.2728 3.62292 11.976 3.5 11.6666 3.5H7.05829C6.86318 3.50191 6.67069 3.45486 6.49847 3.36314C6.32624 3.27142 6.17977 3.13797 6.07246 2.975L5.59996 2.275C5.49373 2.11369 5.34911 1.98128 5.17908 1.88965C5.00906 1.79802 4.81894 1.75003 4.62579 1.75H2.33329C2.02387 1.75 1.72713 1.87292 1.50833 2.09171C1.28954 2.3105 1.16663 2.60725 1.16663 2.91667V10.5C1.16663 10.8094 1.28954 11.1062 1.50833 11.325C1.72713 11.5437 2.02387 11.6667 2.33329 11.6667H11.6666Z\" fill=\"#EFF6FF\" stroke=\"#3F51B5\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div *ngIf=\"icon && icon.type === 'loop'\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/>\n <path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F51B5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div> -->\n <!-- Bar Icon (Bulleted List) -->\n <div *ngIf=\"icon && icon.type === 'bar'\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <!-- First bullet and line -->\n <circle cx=\"3\" cy=\"5\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"5\" x2=\"17\" y2=\"5\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Second bullet and line -->\n <circle cx=\"3\" cy=\"10\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"10\" x2=\"17\" y2=\"10\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <!-- Third bullet and line -->\n <circle cx=\"3\" cy=\"15\" r=\"2\" fill=\"#4F39F6\"/>\n <line x1=\"7\" y1=\"15\" x2=\"17\" y2=\"15\" stroke=\"#4F39F6\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <!-- Default Chain-Link Icon (when no icon or icon type is not specified) -->\n <div *ngIf=\"!icon || (icon.type !== 'bar' && icon.type !== 'folder' && icon.type !== 'loop' && icon.type !== 'custom')\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.50033 14.1663H5.83366C4.72859 14.1663 3.66878 13.7274 2.88738 12.946C2.10598 12.1646 1.66699 11.1047 1.66699 9.99967C1.66699 8.89461 2.10598 7.8348 2.88738 7.0534C3.66878 6.27199 4.72859 5.83301 5.83366 5.83301H7.50033\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5 5.83301H14.1667C15.2717 5.83301 16.3315 6.27199 17.1129 7.0534C17.8943 7.8348 18.3333 8.89461 18.3333 9.99967C18.3333 11.1047 17.8943 12.1646 17.1129 12.946C16.3315 13.7274 15.2717 14.1663 14.1667 14.1663H12.5\"\n stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.66699 10H13.3337\" stroke=\"#4F39F6\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n\n <!-- Custom Icon -->\n <div *ngIf=\"icon && icon.type === 'custom' && icon.svg\" [innerHTML]=\"icon.svg\"></div>\n\n <!-- Title -->\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ title }}\n </span>\n\n <!-- Badge and dynamic header buttons -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" (click)=\"$event.stopPropagation()\">\n <ng-container *ngFor=\"let btn of headerButtons; let i = index\">\n <cqa-button\n [text]=\"btn.text\"\n [icon]=\"btn.icon\"\n [variant]=\"btn.variant || 'outlined'\"\n [disabled]=\"btn.disabled\"\n [tooltip]=\"btn.tooltip\"\n [customClass]=\"btn.customClass\"\n [btnSize]=\"btn.btnSize || 'sm'\"\n (clicked)=\"onHeaderButtonClick(btn, i, $event)\">\n </cqa-button>\n </ng-container>\n <span\n class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[4px] cqa-bg-[#C6D2FF] cqa-text-[12px] cqa-leading-[16px] cqa-text-[#432DD7] cqa-inline-flex cqa-items-center cqa-justify-center cqa-min-w-[24px]\">\n <mat-spinner *ngIf=\"countLoading\" diameter=\"16\" class=\"cqa-inline-block\"></mat-spinner>\n <span *ngIf=\"!countLoading\">{{ getDisplayCount() }}</span>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Expanded Content -->\n<div *ngIf=\"isExpanded\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <!-- When there are no items, display ng-content directly -->\n <ng-container *ngIf=\"!items || items.length === 0\">\n <ng-content></ng-content>\n </ng-container>\n\n <!-- When items exist, display them -->\n <div *ngFor=\"let item of items\">\n\n <!-- Item Header -->\n <div class=\"cqa-bg-white cqa-border cqa-border-solid cqa-border-[#E5E5E5] cqa-rounded-md cqa-overflow-hidden\">\n <div class=\"cqa-py-2 cqa-px-3 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3\">\n <!-- Left side: Status and Title -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-flex-1\">\n <!-- Status Icon (Filled Green Circle with Checkmark) -->\n <div>\n <!-- Success -->\n <svg *ngIf=\"item.status === 'success'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_48_121)\">\n <path\n d=\"M10.0003 18.3337C14.6027 18.3337 18.3337 14.6027 18.3337 10.0003C18.3337 5.39795 14.6027 1.66699 10.0003 1.66699C5.39795 1.66699 1.66699 5.39795 1.66699 10.0003C1.66699 14.6027 5.39795 18.3337 10.0003 18.3337Z\"\n stroke=\"#00A63E\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M7.5 9.99967L9.16667 11.6663L12.5 8.33301\" stroke=\"#00A63E\" stroke-width=\"1.66667\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_48_121\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <!-- Failed -->\n <svg *ngIf=\"item.status === 'failed'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#EF4444\" />\n <path d=\"M7 7L13 13M13 7L7 13\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <!-- Pending -->\n <svg *ngIf=\"item.status === 'pending'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#9CA3AF\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <!-- Running -->\n <svg *ngIf=\"item.status === 'running'\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"#3B82F6\" />\n <path d=\"M10 6V10L13 12\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n \n <!-- Title -->\n <span class=\"cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ item.title }}\n </span>\n </div>\n \n <!-- Right side: Duration and View Steps Link -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3\">\n <!-- Step action icons (only when isDebug) -->\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep(item, $event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of stepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(item, opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <!-- Duration with Clock Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\n stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6 3V6L8 7\" stroke=\"#6A7282\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"cqa-text-[14px] cqa-leading-[20px] cqa-text-[#6A7282]\">\n {{ formatDuration(item.duration) }}\n </span>\n </div>\n \n <!-- View Steps Link: redirect mode (navigates to URL) or inline mode (toggle expand) -->\n <a *ngIf=\"hasViewStepsRedirectUrl(item)\"\n [href]=\"getItemViewStepsUrl(item)\"\n [attr.target]=\"viewStepsOpenInNewTab ? '_blank' : null\"\n [attr.rel]=\"viewStepsOpenInNewTab ? 'noopener noreferrer' : null\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>View steps</span>\n <svg class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n <a *ngIf=\"!hasViewStepsRedirectUrl(item)\" href=\"#\" (click)=\"onViewSteps(item, $event)\"\n class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-semibold cqa-text-[#3F43EE] cqa-no-underline cqa-flex cqa-items-center cqa-gap-1 hover:cqa-underline\">\n <span>{{ isItemExpanded(item.id) ? 'Hide steps' : 'View steps' }}</span>\n <svg [class.cqa-rotate-90]=\"isItemExpanded(item.id)\" class=\"cqa-transition-transform\" width=\"16\" height=\"15\"\n viewBox=\"0 0 16 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.6552 12.8184L7.55413 11.7668L10.852 8.5864H2.83984V7.05032H10.852L7.55413 3.87506L8.6552 2.81836L13.8398 7.81836L8.6552 12.8184Z\"\n fill=\"#3F43EE\" />\n </svg>\n </a>\n </div>\n </div>\n </div>\n\n <!-- Steps Content (shown when item is expanded) -->\n <div *ngIf=\"isItemExpanded(item.id)\">\n <!-- Custom template via TemplateRef (from @ContentChild or @Input) - passes item as context -->\n <ng-container *ngIf=\"itemContentTpl || itemContentTemplate\">\n <div class=\"cqa-p-3\">\n <ng-container\n *ngTemplateOutlet=\"(itemContentTpl || itemContentTemplate)!; context: { $implicit: item, item: item }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Custom content projection via ng-content - displayed for all expanded items -->\n <ng-content select=\"[itemContent]\"></ng-content>\n </div>\n </div>\n</div>\n\n<!-- Custom content projection after all items - for steps loaded after API call -->\n<ng-content select=\"[afterItems]\"></ng-content>", styles: [] }]
@@ -168,6 +171,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
168
171
  type: Input
169
172
  }], viewStepsOpenInNewTab: [{
170
173
  type: Input
174
+ }], expandOnViewSteps: [{
175
+ type: Input
171
176
  }], initialExpandedItemId: [{
172
177
  type: Input
173
178
  }], isDebug: [{
@@ -192,4 +197,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
192
197
  }], expandedChange: [{
193
198
  type: Output
194
199
  }] } });
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9tYWluLXN0ZXAtY29sbGFwc2UvbWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9tYWluLXN0ZXAtY29sbGFwc2UvbWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFtRCw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQTZCOUssTUFBTSxPQUFPLHlCQUF5QjtJQU50QztRQU9XLFVBQUssR0FBVyxlQUFlLENBQUM7UUFFaEMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUd6QixpQkFBWSxHQUFhLEtBQUssQ0FBQztRQUd4Qyx1SUFBdUk7UUFDOUgsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRzlDLDJEQUEyRDtRQUNsRCwwQkFBcUIsR0FBWSxJQUFJLENBQUM7UUFDL0MseUlBQXlJO1FBQ2hJLDBCQUFxQixHQUEyQixJQUFJLENBQUM7UUFDOUQsaUZBQWlGO1FBQ3hFLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFFekIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBQ2pELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUNoRCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBeUQsQ0FBQztRQUNoRyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBMEQsQ0FBQztRQUNuRyx1QkFBa0IsR0FBd0IsNkJB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Q2pEbEQsaTNkQW9PK0M7MkZEdE1sQyx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usd0JBQXdCLFFBRzVCLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFOzhCQUdoQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUM4QyxjQUFjO3NCQUFqRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3hDLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNFLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBDb250ZW50Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByZXJlcXVpc2l0ZUl0ZW0sIFN0ZXBTdGF0dXMsIEFkZFN0ZXBNZW51T3B0aW9uLCBERUZBVUxUX0FERF9TVEVQX01FTlVfT1BUSU9OUywgU3RlcE1vcmVNZW51T3B0aW9uLCBERUZBVUxUX1NURVBfTU9SRV9NRU5VX09QVElPTlMgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uLy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgSWNvblR5cGUgPSAnZm9sZGVyJyB8ICdsb29wJyB8ICdiYXInIHwgJ2N1c3RvbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWNvbkNvbmZpZyB7XG4gIHR5cGU6IEljb25UeXBlO1xuICBzdmc/OiBzdHJpbmc7IC8vIEN1c3RvbSBTVkcgc3RyaW5nIHdoZW4gdHlwZSBpcyAnY3VzdG9tJ1xufVxuXG4vKiogQ29uZmlnIGZvciBkeW5hbWljIGhlYWRlciBidXR0b25zIHNob3duIGJlc2lkZSB0aGUgaXRlbXMgY291bnQgYmFkZ2UgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyQnV0dG9uQ29uZmlnIHtcbiAgdGV4dD86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgdmFyaWFudD86IEJ1dHRvblZhcmlhbnQ7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdG9vbHRpcD86IHN0cmluZztcbiAgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIC8qKiBPcHRpb25hbCBpZCB0byBpZGVudGlmeSB0aGUgYnV0dG9uIGluIGhlYWRlckJ1dHRvbkNsaWNrIGV2ZW50ICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbWFpbi1zdGVwLWNvbGxhcHNlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21haW4tc3RlcC1jb2xsYXBzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtdy1mdWxsJyB9XG59KVxuZXhwb3J0IGNsYXNzIE1haW5TdGVwQ29sbGFwc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnUHJlcmVxdWlzaXRlcyc7XG4gIEBJbnB1dCgpIGl0ZW1zITogUHJlcmVxdWlzaXRlSXRlbVtdO1xuICBASW5wdXQoKSBleHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGljb24/OiBJY29uQ29uZmlnO1xuICBASW5wdXQoKSBjb3VudD86IG51bWJlcjsgLy8gQ291bnQgdG8gZGlzcGxheSB3aGVuIGl0ZW1zIGFycmF5IGlzIGVtcHR5XG4gIEBJbnB1dCgpIGNvdW50TG9hZGluZz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXRlbUNvbnRlbnRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47IC8vIFRlbXBsYXRlIGZvciBjdXN0b20gY29udGVudCB1bmRlciBzdGVwcyAocHJvZ3JhbW1hdGljKVxuICBASW5wdXQoKSBoZWFkZXJCdXR0b25zPzogSGVhZGVyQnV0dG9uQ29uZmlnW107IC8vIER5bmFtaWMgYnV0dG9ucyB0byBzaG93IGJlc2lkZSB0aGUgaXRlbXMgY291bnQgYmFkZ2VcbiAgLyoqIFdoZW4gdHJ1ZSwgXCJWaWV3IHN0ZXBzXCIgcmVkaXJlY3RzIHRvIFVSTCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpbmxpbmUuIFVSTCBjb21lcyBmcm9tIGl0ZW0udmlld1N0ZXBzVXJsIG9yIGdldFZpZXdTdGVwc1VybChpdGVtKS4gKi9cbiAgQElucHV0KCkgdmlld1N0ZXBzQXNSZWRpcmVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9uYWwgZnVuY3Rpb24gdG8gZ2V0IHJlZGlyZWN0IFVSTCBwZXIgaXRlbS4gVXNlZCB3aGVuIGl0ZW0udmlld1N0ZXBzVXJsIGlzIG5vdCBzZXQuICovXG4gIEBJbnB1dCgpIGdldFZpZXdTdGVwc1VybD86IChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtKSA9PiBzdHJpbmc7XG4gIC8qKiBXaGVuIHJlZGlyZWN0aW5nLCBvcGVuIGxpbmsgaW4gbmV3IHRhYi4gRGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIHZpZXdTdGVwc09wZW5Jbk5ld1RhYjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBPcHRpb25hbCBpbml0aWFsIGl0ZW0gaWQgdG8gZXhwYW5kIChlLmcuIGZpcnN0IGZhaWxlZCBwcmVyZXF1aXNpdGUpLiBXaGVuIHNldCBhbmQgcHJlc2VudCBpbiBpdGVtcywgdGhhdCBpdGVtIGlzIGV4cGFuZGVkIG9uIGxvYWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxFeHBhbmRlZEl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHRydWUsIHNob3dzIEVkaXQvQWRkL01vcmUgb3B0aW9ucyBpY29ucyBiZWZvcmUgZHVyYXRpb24gb24gZWFjaCBpdGVtLiAqL1xuICBASW5wdXQoKSBpc0RlYnVnPzogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKCdpdGVtQ29udGVudCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgaXRlbUNvbnRlbnRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+OyAvLyBUZW1wbGF0ZSByZWZlcmVuY2UgZnJvbSBuZy10ZW1wbGF0ZVxuICBAT3V0cHV0KCkgdmlld1N0ZXBzID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVJdGVtPigpO1xuICBAT3V0cHV0KCkgZWRpdFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPFByZXJlcXVpc2l0ZUl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBhZGRTdGVwT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IFByZXJlcXVpc2l0ZUl0ZW07IG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24gfT4oKTtcbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IFByZXJlcXVpc2l0ZUl0ZW07IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uIH0+KCk7XG4gIEBJbnB1dCgpIGFkZFN0ZXBNZW51T3B0aW9uczogQWRkU3RlcE1lbnVPcHRpb25bXSA9IERFRkFVTFRfQUREX1NURVBfTUVOVV9PUFRJT05TO1xuICBASW5wdXQoKSBzdGVwTW9yZU1lbnVPcHRpb25zOiBTdGVwTW9yZU1lbnVPcHRpb25bXSA9IERFRkFVTFRfU1RFUF9NT1JFX01FTlVfT1BUSU9OUztcbiAgQE91dHB1dCgpIGhlYWRlckJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbmZpZzogSGVhZGVyQnV0dG9uQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBpc0V4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgZXhwYW5kZWRJdGVtSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB3aGljaCBpdGVtJ3Mgc3RlcHMgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMuYXBwbHlJbml0aWFsRXhwYW5kZWRJdGVtSWQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZXhwYW5kZWQnXSkge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxFeHBhbmRlZEl0ZW1JZCddIHx8IGNoYW5nZXNbJ2l0ZW1zJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsRXhwYW5kZWRJdGVtSWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbEV4cGFuZGVkSXRlbUlkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxFeHBhbmRlZEl0ZW1JZCA9PSBudWxsIHx8ICF0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT0gdGhpcy5pbml0aWFsRXhwYW5kZWRJdGVtSWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy5leHBhbmRlZEl0ZW1JZCA9IG1hdGNoLmlkO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLmlzRXhwYW5kZWQpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb24oc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoc2Vjb25kcyA8IDEpIHtcbiAgICAgIHJldHVybiBgJHsoc2Vjb25kcyAqIDEwMDApLnRvRml4ZWQoMCl9bXNgO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gMzYwMCk7XG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApO1xuXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoaG91cnMgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2hvdXJzfWhgKTtcbiAgICB9XG4gICAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke21pbnV0ZXN9bWApO1xuICAgIH1cbiAgICBpZiAoc2VjcyA+IDAgfHwgKGhvdXJzID09PSAwICYmIG1pbnV0ZXMgPT09IDApKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3NlY3N9c2ApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cbiAgZ2V0U3RhdHVzSWNvbihzdGF0dXM6IFN0ZXBTdGF0dXMpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdjaGVja19jaXJjbGUnO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjYW5jZWwnO1xuICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgIHJldHVybiAnc2NoZWR1bGUnO1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiAnc3luYyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2hlbHBfb3V0bGluZSc7XG4gICAgfVxuICB9XG5cblxuICBvblZpZXdTdGVwcyhpdGVtOiBQcmVyZXF1aXNpdGVJdGVtLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIC8vIEFjY29yZGlvbiBiZWhhdmlvcjogaWYgY2xpY2tpbmcgdGhlIHNhbWUgaXRlbSwgY2xvc2UgaXQ7IG90aGVyd2lzZSwgY2xvc2UgcHJldmlvdXMgYW5kIG9wZW4gbmV3IG9uZVxuICAgIGlmICh0aGlzLmV4cGFuZGVkSXRlbUlkID09PSBpdGVtLmlkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSXRlbUlkID0gbnVsbDsgLy8gQ2xvc2UgaWYgYWxyZWFkeSBvcGVuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRJdGVtSWQgPSBpdGVtLmlkOyAvLyBPcGVuIHRoZSBjbGlja2VkIGl0ZW0gKGNsb3NlcyBwcmV2aW91cyBhdXRvbWF0aWNhbGx5KVxuICAgIH1cbiAgICBcbiAgICB0aGlzLnZpZXdTdGVwcy5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgb25FZGl0U3RlcChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZWRpdFN0ZXAuZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9uQWRkU3RlcE9wdGlvblNlbGVjdChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtLCBvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgaXRlbSwgb3B0aW9uIH0pO1xuICB9XG5cbiAgb25TdGVwTW9yZU9wdGlvblNlbGVjdChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtLCBvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbiwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBpdGVtLCBvcHRpb24gfSk7XG4gIH1cblxuICBpc0l0ZW1FeHBhbmRlZChpdGVtSWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkSXRlbUlkID09IGl0ZW1JZDtcbiAgfVxuXG4gIGdldERpc3BsYXlDb3VudCgpOiBudW1iZXIge1xuICAgIC8vIElmIGl0ZW1zIGlzIGVtcHR5L3VuZGVmaW5lZCBhbmQgY291bnQgaXMgcHJvdmlkZWQsIHVzZSBjb3VudFxuICAgIGlmICgoIXRoaXMuaXRlbXMgfHwgdGhpcy5pdGVtcy5sZW5ndGggPT09IDApICYmIHRoaXMuY291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY291bnQ7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSB1c2UgaXRlbXMgbGVuZ3RoXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgb25IZWFkZXJCdXR0b25DbGljayhjb25maWc6IEhlYWRlckJ1dHRvbkNvbmZpZywgaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaGVhZGVyQnV0dG9uQ2xpY2suZW1pdCh7IGNvbmZpZywgaW5kZXggfSk7XG4gIH1cblxuICAvKiogUmVzb2x2ZXMgdGhlIHJlZGlyZWN0IFVSTCBmb3IgYW4gaXRlbTogaXRlbS52aWV3U3RlcHNVcmwgdGFrZXMgcHJlY2VkZW5jZSwgZWxzZSBnZXRWaWV3U3RlcHNVcmwoaXRlbSkgKi9cbiAgZ2V0SXRlbVZpZXdTdGVwc1VybChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXRlbS52aWV3U3RlcHNVcmwpIHtcbiAgICAgIHJldHVybiBpdGVtLnZpZXdTdGVwc1VybDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0Vmlld1N0ZXBzVXJsPy4oaXRlbSk7XG4gIH1cblxuICAvKiogV2hldGhlciByZWRpcmVjdCBtb2RlIGlzIGFjdGl2ZSBhbmQgd2UgaGF2ZSBhIFVSTCBmb3IgdGhpcyBpdGVtICovXG4gIGhhc1ZpZXdTdGVwc1JlZGlyZWN0VXJsKGl0ZW06IFByZXJlcXVpc2l0ZUl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnZpZXdTdGVwc0FzUmVkaXJlY3QgJiYgISF0aGlzLmdldEl0ZW1WaWV3U3RlcHNVcmwoaXRlbSk7XG4gIH1cbn1cbiIsIjwhLS0gSGVhZGVyIC0tPlxuPGRpdlxuICBjbGFzcz1cImNxYS1tdC0yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXB4LTMgY3FhLXB5LTIgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1iZy1bI0VFRjJGRl0gY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjQzZEMkZGXSBjcWEtYm9yZGVyLXNvbGlkIGNxYS13LWZ1bGxcIlxuICAoY2xpY2spPVwidG9nZ2xlKClcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS13LWZ1bGxcIj5cbiAgICA8IS0tIENoZXZyb24gSWNvbiAoTGVmdCkgLS0+XG4gICAgPCEtLSA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJpc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzNGNTFCNVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgPC9zdmc+IC0tPlxuICAgIDxkaXY+PHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiaXNFeHBhbmRlZFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz48L2Rpdj5cblxuICAgIDwhLS0gQ2hhaW4tTGluayBJY29uIChpZiBjb25maWd1cmVkLCBvdGhlcndpc2UgZGVmYXVsdCkgLS0+XG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaWNvbiAmJiBpY29uLnR5cGUgPT09ICdmb2xkZXInXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICA8cGF0aCBkPVwiTTExLjY2NjYgMTEuNjY2N0MxMS45NzYgMTEuNjY2NyAxMi4yNzI4IDExLjU0MzcgMTIuNDkxNiAxMS4zMjVDMTIuNzEwNCAxMS4xMDYyIDEyLjgzMzMgMTAuODA5NCAxMi44MzMzIDEwLjVWNC42NjY2N0MxMi44MzMzIDQuMzU3MjUgMTIuNzEwNCA0LjA2MDUgMTIuNDkxNiAzLjg0MTcxQzEyLjI3MjggMy42MjI5MiAxMS45NzYgMy41IDExLjY2NjYgMy41SDcuMDU4MjlDNi44NjMxOCAzLjUwMTkxIDYuNjcwNjkgMy40NTQ4NiA2LjQ5ODQ3IDMuMzYzMTRDNi4zMjYyNCAzLjI3MTQyIDYuMTc5NzcgMy4xMzc5NyA2LjA3MjQ2IDIuOTc1TDUuNTk5OTYgMi4yNzVDNS40OTM3MyAyLjExMzY5IDUuMzQ5MTEgMS45ODEyOCA1LjE3OTA4IDEuODg5NjVDNS4wMDkwNiAxLjc5ODAyIDQuODE4OTQgMS43NTAwMyA0LjYyNTc5IDEuNzVIMi4zMzMyOUMyLjAyMzg3IDEuNzUgMS43MjcxMyAxLjg3MjkyIDEuNTA4MzMgMi4wOTE3MUMxLjI4OTU0IDIuMzEwNSAxLjE2NjYzIDIuNjA3MjUgMS4xNjY2MyAyLjkxNjY3VjEwLjVDMS4xNjY2MyAxMC44MDk0IDEuMjg5NTQgMTEuMTA2MiAxLjUwODMzIDExLjMyNUMxLjcyNzEzIDExLjU0MzcgMi4wMjM4NyAxMS42NjY3IDIuMzMzMjkgMTEuNjY2N0gxMS42NjY2WlwiIGZpbGw9XCIjRUZGNkZGXCIgc3Ryb2tlPVwiIzNGNTFCNVwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiaWNvbiAmJiBpY29uLnR5cGUgPT09ICdsb29wJ1wiPlxuICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCI0XCIgZmlsbD1cIiNFQkVDRkRcIi8+XG4gICAgICA8cGF0aCBkPVwiTTkuNjY2NjMgNC42NjY2NkwxMSA1Ljk5OTk5TDkuNjY2NjMgNy4zMzMzMlwiIHN0cm9rZT1cIiMzRjUxQjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8cGF0aCBkPVwiTTUgNy42NjY2N1Y3LjMzMzMzQzUgNi45Nzk3MSA1LjE0MDQ4IDYuNjQwNTcgNS4zOTA1MiA2LjM5MDUyQzUuNjQwNTcgNi4xNDA0OCA1Ljk3OTcxIDYgNi4zMzMzMyA2SDExXCIgc3Ryb2tlPVwiIzNGNTFCNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDxwYXRoIGQ9XCJNNi4zMzMzMyAxMS4zMzMzTDUgOS45OTk5OUw2LjMzMzMzIDguNjY2NjZcIiBzdHJva2U9XCIjM0Y1MUI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgPHBhdGggZD1cIk0xMSA4LjMzMzM0VjguNjY2NjhDMTEgOS4wMjAzIDEwLjg1OTUgOS4zNTk0NCAxMC42MDk1IDkuNjA5NDlDMTAuMzU5NCA5Ljg1OTUzIDEwLjAyMDMgMTAgOS42NjY2NyAxMEg1XCIgc3Ryb2tlPVwiIzNGNTFCNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9kaXY+IC0tPlxuICAgIDwhLS0gQmFyIEljb24gKEJ1bGxldGVkIExpc3QpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpY29uICYmIGljb24udHlwZSA9PT0gJ2JhcidcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8IS0tIEZpcnN0IGJ1bGxldCBhbmQgbGluZSAtLT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjVcIiByPVwiMlwiIGZpbGw9XCIjNEYzOUY2XCIvPlxuICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjVcIiB4Mj1cIjE3XCIgeTI9XCI1XCIgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgIDwhLS0gU2Vjb25kIGJ1bGxldCBhbmQgbGluZSAtLT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEwXCIgcj1cIjJcIiBmaWxsPVwiIzRGMzlGNlwiLz5cbiAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCIxMFwiIHgyPVwiMTdcIiB5Mj1cIjEwXCIgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgIDwhLS0gVGhpcmQgYnVsbGV0IGFuZCBsaW5lIC0tPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTVcIiByPVwiMlwiIGZpbGw9XCIjNEYzOUY2XCIvPlxuICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjE1XCIgeDI9XCIxN1wiIHkyPVwiMTVcIiBzdHJva2U9XCIjNEYzOUY2XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEZWZhdWx0IENoYWluLUxpbmsgSWNvbiAod2hlbiBubyBpY29uIG9yIGljb24gdHlwZSBpcyBub3Qgc3BlY2lmaWVkKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWljb24gfHwgKGljb24udHlwZSAhPT0gJ2JhcicgJiYgaWNvbi50eXBlICE9PSAnZm9sZGVyJyAmJiBpY29uLnR5cGUgIT09ICdsb29wJyAmJiBpY29uLnR5cGUgIT09ICdjdXN0b20nKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk03LjUwMDMzIDE0LjE2NjNINS44MzM2NkM0LjcyODU5IDE0LjE2NjMgMy42Njg3OCAxMy43Mjc0IDIuODg3MzggMTIuOTQ2QzIuMTA1OTggMTIuMTY0NiAxLjY2Njk5IDExLjEwNDcgMS42NjY5OSA5Ljk5OTY3QzEuNjY2OTkgOC44OTQ2MSAyLjEwNTk4IDcuODM0OCAyLjg4NzM4IDcuMDUzNEMzLjY2ODc4IDYuMjcxOTkgNC43Mjg1OSA1LjgzMzAxIDUuODMzNjYgNS44MzMwMUg3LjUwMDMzXCJcbiAgICAgICAgICBzdHJva2U9XCIjNEYzOUY2XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xMi41IDUuODMzMDFIMTQuMTY2N0MxNS4yNzE3IDUuODMzMDEgMTYuMzMxNSA2LjI3MTk5IDE3LjExMjkgNy4wNTM0QzE3Ljg5NDMgNy44MzQ4IDE4LjMzMzMgOC44OTQ2MSAxOC4zMzMzIDkuOTk5NjdDMTguMzMzMyAxMS4xMDQ3IDE3Ljg5NDMgMTIuMTY0NiAxNy4xMTI5IDEyLjk0NkMxNi4zMzE1IDEzLjcyNzQgMTUuMjcxNyAxNC4xNjYzIDE0LjE2NjcgMTQuMTY2M0gxMi41XCJcbiAgICAgICAgICBzdHJva2U9XCIjNEYzOUY2XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNi42NjY5OSAxMEgxMy4zMzM3XCIgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ3VzdG9tIEljb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImljb24gJiYgaWNvbi50eXBlID09PSAnY3VzdG9tJyAmJiBpY29uLnN2Z1wiIFtpbm5lckhUTUxdPVwiaWNvbi5zdmdcIj48L2Rpdj5cblxuICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS10ZXh0LVsjMzEyQzg1XSBjcWEtZmxleC0xXCI+XG4gICAgICB7eyB0aXRsZSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gQmFkZ2UgYW5kIGR5bmFtaWMgaGVhZGVyIGJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIGhlYWRlckJ1dHRvbnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICBbdGV4dF09XCJidG4udGV4dFwiXG4gICAgICAgICAgW2ljb25dPVwiYnRuLmljb25cIlxuICAgICAgICAgIFt2YXJpYW50XT1cImJ0bi52YXJpYW50IHx8ICdvdXRsaW5lZCdcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIlxuICAgICAgICAgIFt0b29sdGlwXT1cImJ0bi50b29sdGlwXCJcbiAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiYnRuLmN1c3RvbUNsYXNzXCJcbiAgICAgICAgICBbYnRuU2l6ZV09XCJidG4uYnRuU2l6ZSB8fCAnc20nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvbkhlYWRlckJ1dHRvbkNsaWNrKGJ0biwgaSwgJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1iZy1bI0M2RDJGRl0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNnB4XSBjcWEtdGV4dC1bIzQzMkREN10gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4tdy1bMjRweF1cIj5cbiAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiY291bnRMb2FkaW5nXCIgZGlhbWV0ZXI9XCIxNlwiIGNsYXNzPVwiY3FhLWlubGluZS1ibG9ja1wiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvdW50TG9hZGluZ1wiPnt7IGdldERpc3BsYXlDb3VudCgpIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEV4cGFuZGVkIENvbnRlbnQgLS0+XG48ZGl2ICpuZ0lmPVwiaXNFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLW10LTIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcHgtMi41XCI+XG4gIDwhLS0gV2hlbiB0aGVyZSBhcmUgbm8gaXRlbXMsIGRpc3BsYXkgbmctY29udGVudCBkaXJlY3RseSAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDBcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBXaGVuIGl0ZW1zIGV4aXN0LCBkaXNwbGF5IHRoZW0gLS0+XG4gIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIj5cblxuICAgIDwhLS0gSXRlbSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yIGNxYS1weC0zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTNcIj5cbiAgICAgICAgPCEtLSBMZWZ0IHNpZGU6IFN0YXR1cyBhbmQgVGl0bGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC0xXCI+XG4gICAgICAgICAgPCEtLSBTdGF0dXMgSWNvbiAoRmlsbGVkIEdyZWVuIENpcmNsZSB3aXRoIENoZWNrbWFyaykgLS0+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDwhLS0gU3VjY2VzcyAtLT5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ4XzEyMSlcIj5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgZD1cIk0xMC4wMDAzIDE4LjMzMzdDMTQuNjAyNyAxOC4zMzM3IDE4LjMzMzcgMTQuNjAyNyAxOC4zMzM3IDEwLjAwMDNDMTguMzMzNyA1LjM5Nzk1IDE0LjYwMjcgMS42NjY5OSAxMC4wMDAzIDEuNjY2OTlDNS4zOTc5NSAxLjY2Njk5IDEuNjY2OTkgNS4zOTc5NSAxLjY2Njk5IDEwLjAwMDNDMS42NjY5OSAxNC42MDI3IDUuMzk3OTUgMTguMzMzNyAxMC4wMDAzIDE4LjMzMzdaXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEE2M0VcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuNSA5Ljk5OTY3TDkuMTY2NjcgMTEuNjY2M0wxMi41IDguMzMzMDFcIiBzdHJva2U9XCIjMDBBNjNFXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ4XzEyMVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwhLS0gRmFpbGVkIC0tPlxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAnZmFpbGVkJ1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI4XCIgZmlsbD1cIiNFRjQ0NDRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0wxMyAxM00xMyA3TDcgMTNcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ3BlbmRpbmcnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjhcIiBmaWxsPVwiIzlDQTNBRlwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNlYxMEwxMyAxMlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwhLS0gUnVubmluZyAtLT5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjhcIiBmaWxsPVwiIzNCODJGNlwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNlYxMEwxMyAxMlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgPCEtLSBUaXRsZSAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF1cIiBzdHlsZT1cIndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCI+XG4gICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgIDwhLS0gUmlnaHQgc2lkZTogRHVyYXRpb24gYW5kIFZpZXcgU3RlcHMgTGluayAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPCEtLSBTdGVwIGFjdGlvbiBpY29ucyAob25seSB3aGVuIGlzRGVidWcpIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0RlYnVnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMC41IGNxYS10ZXh0LVsjOUNBM0FGXVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiRWRpdFwiIChjbGljayk9XCJvbkVkaXRTdGVwKGl0ZW0sICRldmVudClcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS10ZXh0LVsxNHB4XSAhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF1cIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZVwiIGFyaWEtbGFiZWw9XCJBZGRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWRkU3RlcE1lbnVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS10ZXh0LVsxNHB4XSAhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF1cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2FkZFN0ZXBNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLWFkZC1zdGVwLW1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIiB5UG9zaXRpb249XCJiZWxvd1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IG9wdCBvZiBhZGRTdGVwTWVudU9wdGlvbnNcIiAoY2xpY2spPVwib25BZGRTdGVwT3B0aW9uU2VsZWN0KGl0ZW0sIG9wdCwgJGV2ZW50KVwiPnt7IG9wdC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiTW9yZSBvcHRpb25zXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInN0ZXBNb3JlTWVudVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxtYXQtbWVudSAjc3RlcE1vcmVNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLXN0ZXAtbW9yZS1tZW51XCIgeFBvc2l0aW9uPVwiYmVmb3JlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2Ygc3RlcE1vcmVNZW51T3B0aW9uc1wiIChjbGljayk9XCJvblN0ZXBNb3JlT3B0aW9uU2VsZWN0KGl0ZW0sIG9wdCwgJGV2ZW50KVwiPnt7IG9wdC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIER1cmF0aW9uIHdpdGggQ2xvY2sgSWNvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2QTcyODJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM2QTcyODJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyM2QTcyODJdXCI+XG4gICAgICAgICAgICAgIHt7IGZvcm1hdER1cmF0aW9uKGl0ZW0uZHVyYXRpb24pIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICAgIDwhLS0gVmlldyBTdGVwcyBMaW5rOiByZWRpcmVjdCBtb2RlIChuYXZpZ2F0ZXMgdG8gVVJMKSBvciBpbmxpbmUgbW9kZSAodG9nZ2xlIGV4cGFuZCkgLS0+XG4gICAgICAgICAgPGEgKm5nSWY9XCJoYXNWaWV3U3RlcHNSZWRpcmVjdFVybChpdGVtKVwiXG4gICAgICAgICAgICBbaHJlZl09XCJnZXRJdGVtVmlld1N0ZXBzVXJsKGl0ZW0pXCJcbiAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJ2aWV3U3RlcHNPcGVuSW5OZXdUYWIgPyAnX2JsYW5rJyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIucmVsXT1cInZpZXdTdGVwc09wZW5Jbk5ld1RhYiA/ICdub29wZW5lciBub3JlZmVycmVyJyA6IG51bGxcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtbm8tdW5kZXJsaW5lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGhvdmVyOmNxYS11bmRlcmxpbmVcIj5cbiAgICAgICAgICAgIDxzcGFuPlZpZXcgc3RlcHM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE1XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNOC42NTUyIDEyLjgxODRMNy41NTQxMyAxMS43NjY4TDEwLjg1MiA4LjU4NjRIMi44Mzk4NFY3LjA1MDMySDEwLjg1Mkw3LjU1NDEzIDMuODc1MDZMOC42NTUyIDIuODE4MzZMMTMuODM5OCA3LjgxODM2TDguNjU1MiAxMi44MTg0WlwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIiMzRjQzRUVcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIDxhICpuZ0lmPVwiIWhhc1ZpZXdTdGVwc1JlZGlyZWN0VXJsKGl0ZW0pXCIgaHJlZj1cIiNcIiAoY2xpY2spPVwib25WaWV3U3RlcHMoaXRlbSwgJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS1uby11bmRlcmxpbmUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgaG92ZXI6Y3FhLXVuZGVybGluZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgaXNJdGVtRXhwYW5kZWQoaXRlbS5pZCkgPyAnSGlkZSBzdGVwcycgOiAnVmlldyBzdGVwcycgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTkwXT1cImlzSXRlbUV4cGFuZGVkKGl0ZW0uaWQpXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTVcIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk04LjY1NTIgMTIuODE4NEw3LjU1NDEzIDExLjc2NjhMMTAuODUyIDguNTg2NEgyLjgzOTg0VjcuMDUwMzJIMTAuODUyTDcuNTU0MTMgMy44NzUwNkw4LjY1NTIgMi44MTgzNkwxMy44Mzk4IDcuODE4MzZMOC42NTUyIDEyLjgxODRaXCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiIzNGNDNFRVwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0ZXBzIENvbnRlbnQgKHNob3duIHdoZW4gaXRlbSBpcyBleHBhbmRlZCkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzSXRlbUV4cGFuZGVkKGl0ZW0uaWQpXCI+XG4gICAgICA8IS0tIEN1c3RvbSB0ZW1wbGF0ZSB2aWEgVGVtcGxhdGVSZWYgKGZyb20gQENvbnRlbnRDaGlsZCBvciBASW5wdXQpIC0gcGFzc2VzIGl0ZW0gYXMgY29udGV4dCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtQ29udGVudFRwbCB8fCBpdGVtQ29udGVudFRlbXBsYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0zXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCIoaXRlbUNvbnRlbnRUcGwgfHwgaXRlbUNvbnRlbnRUZW1wbGF0ZSkhOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSwgaXRlbTogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQ3VzdG9tIGNvbnRlbnQgcHJvamVjdGlvbiB2aWEgbmctY29udGVudCAtIGRpc3BsYXllZCBmb3IgYWxsIGV4cGFuZGVkIGl0ZW1zIC0tPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2l0ZW1Db250ZW50XVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBDdXN0b20gY29udGVudCBwcm9qZWN0aW9uIGFmdGVyIGFsbCBpdGVtcyAtIGZvciBzdGVwcyBsb2FkZWQgYWZ0ZXIgQVBJIGNhbGwgLS0+XG48bmctY29udGVudCBzZWxlY3Q9XCJbYWZ0ZXJJdGVtc11cIj48L25nLWNvbnRlbnQ+Il19
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9tYWluLXN0ZXAtY29sbGFwc2UvbWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9tYWluLXN0ZXAtY29sbGFwc2UvbWFpbi1zdGVwLWNvbGxhcHNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFtRCw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQTZCOUssTUFBTSxPQUFPLHlCQUF5QjtJQU50QztRQU9XLFVBQUssR0FBVyxlQUFlLENBQUM7UUFFaEMsYUFBUSxHQUFZLElBQUksQ0FBQztRQUd6QixpQkFBWSxHQUFhLEtBQUssQ0FBQztRQUd4Qyx1SUFBdUk7UUFDOUgsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRzlDLDJEQUEyRDtRQUNsRCwwQkFBcUIsR0FBWSxJQUFJLENBQUM7UUFDdEMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQzNDLHlJQUF5STtRQUNoSSwwQkFBcUIsR0FBMkIsSUFBSSxDQUFDO1FBQzlELGlGQUFpRjtRQUN4RSxZQUFPLEdBQWEsS0FBSyxDQUFDO1FBRXpCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUNqRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDaEQsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQXlELENBQUM7UUFDaEcseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQTBE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QUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDOztzSEFuS1UseUJBQXlCOzBHQUF6Qix5QkFBeUIsbTdCQW9CQyxXQUFXLGtEQ2xEbEQsaTNkQW9PK0M7MkZEdE1sQyx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usd0JBQXdCLFFBRzVCLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFOzhCQUdoQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFDOEMsY0FBYztzQkFBakUsWUFBWTt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUN4QyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgQ29udGVudENoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcmVyZXF1aXNpdGVJdGVtLCBTdGVwU3RhdHVzLCBBZGRTdGVwTWVudU9wdGlvbiwgREVGQVVMVF9BRERfU1RFUF9NRU5VX09QVElPTlMsIFN0ZXBNb3JlTWVudU9wdGlvbiwgREVGQVVMVF9TVEVQX01PUkVfTUVOVV9PUFRJT05TIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJ1dHRvblZhcmlhbnQgfSBmcm9tICcuLi8uLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIEljb25UeXBlID0gJ2ZvbGRlcicgfCAnbG9vcCcgfCAnYmFyJyB8ICdjdXN0b20nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25Db25maWcge1xuICB0eXBlOiBJY29uVHlwZTtcbiAgc3ZnPzogc3RyaW5nOyAvLyBDdXN0b20gU1ZHIHN0cmluZyB3aGVuIHR5cGUgaXMgJ2N1c3RvbSdcbn1cblxuLyoqIENvbmZpZyBmb3IgZHluYW1pYyBoZWFkZXIgYnV0dG9ucyBzaG93biBiZXNpZGUgdGhlIGl0ZW1zIGNvdW50IGJhZGdlICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlckJ1dHRvbkNvbmZpZyB7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBCdXR0b25WYXJpYW50O1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHRvb2x0aXA/OiBzdHJpbmc7XG4gIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xuICBidG5TaXplPzogJ3NtJyB8ICdtZCcgfCAnbGcnO1xuICAvKiogT3B0aW9uYWwgaWQgdG8gaWRlbnRpZnkgdGhlIGJ1dHRvbiBpbiBoZWFkZXJCdXR0b25DbGljayBldmVudCAqL1xuICBpZD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW1haW4tc3RlcC1jb2xsYXBzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYWluLXN0ZXAtY29sbGFwc2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QgY3FhLXctZnVsbCcgfVxufSlcbmV4cG9ydCBjbGFzcyBNYWluU3RlcENvbGxhcHNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1ByZXJlcXVpc2l0ZXMnO1xuICBASW5wdXQoKSBpdGVtcyE6IFByZXJlcXVpc2l0ZUl0ZW1bXTtcbiAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpY29uPzogSWNvbkNvbmZpZztcbiAgQElucHV0KCkgY291bnQ/OiBudW1iZXI7IC8vIENvdW50IHRvIGRpc3BsYXkgd2hlbiBpdGVtcyBhcnJheSBpcyBlbXB0eVxuICBASW5wdXQoKSBjb3VudExvYWRpbmc/OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGl0ZW1Db250ZW50VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+OyAvLyBUZW1wbGF0ZSBmb3IgY3VzdG9tIGNvbnRlbnQgdW5kZXIgc3RlcHMgKHByb2dyYW1tYXRpYylcbiAgQElucHV0KCkgaGVhZGVyQnV0dG9ucz86IEhlYWRlckJ1dHRvbkNvbmZpZ1tdOyAvLyBEeW5hbWljIGJ1dHRvbnMgdG8gc2hvdyBiZXNpZGUgdGhlIGl0ZW1zIGNvdW50IGJhZGdlXG4gIC8qKiBXaGVuIHRydWUsIFwiVmlldyBzdGVwc1wiIHJlZGlyZWN0cyB0byBVUkwgaW5zdGVhZCBvZiBleHBhbmRpbmcgaW5saW5lLiBVUkwgY29tZXMgZnJvbSBpdGVtLnZpZXdTdGVwc1VybCBvciBnZXRWaWV3U3RlcHNVcmwoaXRlbSkuICovXG4gIEBJbnB1dCgpIHZpZXdTdGVwc0FzUmVkaXJlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGdldCByZWRpcmVjdCBVUkwgcGVyIGl0ZW0uIFVzZWQgd2hlbiBpdGVtLnZpZXdTdGVwc1VybCBpcyBub3Qgc2V0LiAqL1xuICBASW5wdXQoKSBnZXRWaWV3U3RlcHNVcmw/OiAoaXRlbTogUHJlcmVxdWlzaXRlSXRlbSkgPT4gc3RyaW5nO1xuICAvKiogV2hlbiByZWRpcmVjdGluZywgb3BlbiBsaW5rIGluIG5ldyB0YWIuIERlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSB2aWV3U3RlcHNPcGVuSW5OZXdUYWI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBleHBhbmRPblZpZXdTdGVwczogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBPcHRpb25hbCBpbml0aWFsIGl0ZW0gaWQgdG8gZXhwYW5kIChlLmcuIGZpcnN0IGZhaWxlZCBwcmVyZXF1aXNpdGUpLiBXaGVuIHNldCBhbmQgcHJlc2VudCBpbiBpdGVtcywgdGhhdCBpdGVtIGlzIGV4cGFuZGVkIG9uIGxvYWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxFeHBhbmRlZEl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHRydWUsIHNob3dzIEVkaXQvQWRkL01vcmUgb3B0aW9ucyBpY29ucyBiZWZvcmUgZHVyYXRpb24gb24gZWFjaCBpdGVtLiAqL1xuICBASW5wdXQoKSBpc0RlYnVnPzogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKCdpdGVtQ29udGVudCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgaXRlbUNvbnRlbnRUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+OyAvLyBUZW1wbGF0ZSByZWZlcmVuY2UgZnJvbSBuZy10ZW1wbGF0ZVxuICBAT3V0cHV0KCkgdmlld1N0ZXBzID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVJdGVtPigpO1xuICBAT3V0cHV0KCkgZWRpdFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPFByZXJlcXVpc2l0ZUl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBhZGRTdGVwT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IFByZXJlcXVpc2l0ZUl0ZW07IG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24gfT4oKTtcbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IFByZXJlcXVpc2l0ZUl0ZW07IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uIH0+KCk7XG4gIEBJbnB1dCgpIGFkZFN0ZXBNZW51T3B0aW9uczogQWRkU3RlcE1lbnVPcHRpb25bXSA9IERFRkFVTFRfQUREX1NURVBfTUVOVV9PUFRJT05TO1xuICBASW5wdXQoKSBzdGVwTW9yZU1lbnVPcHRpb25zOiBTdGVwTW9yZU1lbnVPcHRpb25bXSA9IERFRkFVTFRfU1RFUF9NT1JFX01FTlVfT1BUSU9OUztcbiAgQE91dHB1dCgpIGhlYWRlckJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbmZpZzogSGVhZGVyQnV0dG9uQ29uZmlnOyBpbmRleDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBpc0V4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgZXhwYW5kZWRJdGVtSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB3aGljaCBpdGVtJ3Mgc3RlcHMgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgIHRoaXMuYXBwbHlJbml0aWFsRXhwYW5kZWRJdGVtSWQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZXhwYW5kZWQnXSkge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxFeHBhbmRlZEl0ZW1JZCddIHx8IGNoYW5nZXNbJ2l0ZW1zJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsRXhwYW5kZWRJdGVtSWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbEV4cGFuZGVkSXRlbUlkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxFeHBhbmRlZEl0ZW1JZCA9PSBudWxsIHx8ICF0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT0gdGhpcy5pbml0aWFsRXhwYW5kZWRJdGVtSWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy5leHBhbmRlZEl0ZW1JZCA9IG1hdGNoLmlkO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLmlzRXhwYW5kZWQpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb24oc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoc2Vjb25kcyA8IDEpIHtcbiAgICAgIHJldHVybiBgJHsoc2Vjb25kcyAqIDEwMDApLnRvRml4ZWQoMCl9bXNgO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gMzYwMCk7XG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApO1xuXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoaG91cnMgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2hvdXJzfWhgKTtcbiAgICB9XG4gICAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke21pbnV0ZXN9bWApO1xuICAgIH1cbiAgICBpZiAoc2VjcyA+IDAgfHwgKGhvdXJzID09PSAwICYmIG1pbnV0ZXMgPT09IDApKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3NlY3N9c2ApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG4gIH1cbiAgZ2V0U3RhdHVzSWNvbihzdGF0dXM6IFN0ZXBTdGF0dXMpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdjaGVja19jaXJjbGUnO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjYW5jZWwnO1xuICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgIHJldHVybiAnc2NoZWR1bGUnO1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiAnc3luYyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2hlbHBfb3V0bGluZSc7XG4gICAgfVxuICB9XG5cblxuICBvblZpZXdTdGVwcyhpdGVtOiBQcmVyZXF1aXNpdGVJdGVtLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuZXhwYW5kT25WaWV3U3RlcHMpIHtcbiAgICAgIC8vIEFjY29yZGlvbiBiZWhhdmlvcjogaWYgY2xpY2tpbmcgdGhlIHNhbWUgaXRlbSwgY2xvc2UgaXQ7IG90aGVyd2lzZSwgY2xvc2UgcHJldmlvdXMgYW5kIG9wZW4gbmV3IG9uZVxuICAgICAgaWYgKHRoaXMuZXhwYW5kZWRJdGVtSWQgPT09IGl0ZW0uaWQpIHtcbiAgICAgICAgdGhpcy5leHBhbmRlZEl0ZW1JZCA9IG51bGw7IC8vIENsb3NlIGlmIGFscmVhZHkgb3BlblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBhbmRlZEl0ZW1JZCA9IGl0ZW0uaWQ7IC8vIE9wZW4gdGhlIGNsaWNrZWQgaXRlbSAoY2xvc2VzIHByZXZpb3VzIGF1dG9tYXRpY2FsbHkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52aWV3U3RlcHMuZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9uRWRpdFN0ZXAoaXRlbTogUHJlcmVxdWlzaXRlSXRlbSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmVkaXRTdGVwLmVtaXQoaXRlbSk7XG4gIH1cblxuICBvbkFkZFN0ZXBPcHRpb25TZWxlY3QoaXRlbTogUHJlcmVxdWlzaXRlSXRlbSwgb3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbiwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmFkZFN0ZXBPcHRpb25TZWxlY3QuZW1pdCh7IGl0ZW0sIG9wdGlvbiB9KTtcbiAgfVxuXG4gIG9uU3RlcE1vcmVPcHRpb25TZWxlY3QoaXRlbTogUHJlcmVxdWlzaXRlSXRlbSwgb3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgaXRlbSwgb3B0aW9uIH0pO1xuICB9XG5cbiAgaXNJdGVtRXhwYW5kZWQoaXRlbUlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEl0ZW1JZCA9PSBpdGVtSWQ7XG4gIH1cblxuICBnZXREaXNwbGF5Q291bnQoKTogbnVtYmVyIHtcbiAgICAvLyBJZiBpdGVtcyBpcyBlbXB0eS91bmRlZmluZWQgYW5kIGNvdW50IGlzIHByb3ZpZGVkLCB1c2UgY291bnRcbiAgICBpZiAoKCF0aGlzLml0ZW1zIHx8IHRoaXMuaXRlbXMubGVuZ3RoID09PSAwKSAmJiB0aGlzLmNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvdW50O1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UgdXNlIGl0ZW1zIGxlbmd0aFxuICAgIHJldHVybiB0aGlzLml0ZW1zPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIG9uSGVhZGVyQnV0dG9uQ2xpY2soY29uZmlnOiBIZWFkZXJCdXR0b25Db25maWcsIGluZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmhlYWRlckJ1dHRvbkNsaWNrLmVtaXQoeyBjb25maWcsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFJlc29sdmVzIHRoZSByZWRpcmVjdCBVUkwgZm9yIGFuIGl0ZW06IGl0ZW0udmlld1N0ZXBzVXJsIHRha2VzIHByZWNlZGVuY2UsIGVsc2UgZ2V0Vmlld1N0ZXBzVXJsKGl0ZW0pICovXG4gIGdldEl0ZW1WaWV3U3RlcHNVcmwoaXRlbTogUHJlcmVxdWlzaXRlSXRlbSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGl0ZW0udmlld1N0ZXBzVXJsKSB7XG4gICAgICByZXR1cm4gaXRlbS52aWV3U3RlcHNVcmw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFZpZXdTdGVwc1VybD8uKGl0ZW0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgcmVkaXJlY3QgbW9kZSBpcyBhY3RpdmUgYW5kIHdlIGhhdmUgYSBVUkwgZm9yIHRoaXMgaXRlbSAqL1xuICBoYXNWaWV3U3RlcHNSZWRpcmVjdFVybChpdGVtOiBQcmVyZXF1aXNpdGVJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52aWV3U3RlcHNBc1JlZGlyZWN0ICYmICEhdGhpcy5nZXRJdGVtVmlld1N0ZXBzVXJsKGl0ZW0pO1xuICB9XG59XG4iLCI8IS0tIEhlYWRlciAtLT5cbjxkaXZcbiAgY2xhc3M9XCJjcWEtbXQtMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS1weC0zIGNxYS1weS0yIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYmctWyNFRUYyRkZdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0M2RDJGRl0gY3FhLWJvcmRlci1zb2xpZCBjcWEtdy1mdWxsXCJcbiAgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtdy1mdWxsXCI+XG4gICAgPCEtLSBDaGV2cm9uIEljb24gKExlZnQpIC0tPlxuICAgIDwhLS0gPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiaXNFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMzRjUxQjVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gIDwvc3ZnPiAtLT5cbiAgICA8ZGl2PjxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImlzRXhwYW5kZWRcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0RjM5RjZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+PC9kaXY+XG5cbiAgICA8IS0tIENoYWluLUxpbmsgSWNvbiAoaWYgY29uZmlndXJlZCwgb3RoZXJ3aXNlIGRlZmF1bHQpIC0tPlxuICAgIDwhLS0gPGRpdiAqbmdJZj1cImljb24gJiYgaWNvbi50eXBlID09PSAnZm9sZGVyJ1wiPlxuICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgPHBhdGggZD1cIk0xMS42NjY2IDExLjY2NjdDMTEuOTc2IDExLjY2NjcgMTIuMjcyOCAxMS41NDM3IDEyLjQ5MTYgMTEuMzI1QzEyLjcxMDQgMTEuMTA2MiAxMi44MzMzIDEwLjgwOTQgMTIuODMzMyAxMC41VjQuNjY2NjdDMTIuODMzMyA0LjM1NzI1IDEyLjcxMDQgNC4wNjA1IDEyLjQ5MTYgMy44NDE3MUMxMi4yNzI4IDMuNjIyOTIgMTEuOTc2IDMuNSAxMS42NjY2IDMuNUg3LjA1ODI5QzYuODYzMTggMy41MDE5MSA2LjY3MDY5IDMuNDU0ODYgNi40OTg0NyAzLjM2MzE0QzYuMzI2MjQgMy4yNzE0MiA2LjE3OTc3IDMuMTM3OTcgNi4wNzI0NiAyLjk3NUw1LjU5OTk2IDIuMjc1QzUuNDkzNzMgMi4xMTM2OSA1LjM0OTExIDEuOTgxMjggNS4xNzkwOCAxLjg4OTY1QzUuMDA5MDYgMS43OTgwMiA0LjgxODk0IDEuNzUwMDMgNC42MjU3OSAxLjc1SDIuMzMzMjlDMi4wMjM4NyAxLjc1IDEuNzI3MTMgMS44NzI5MiAxLjUwODMzIDIuMDkxNzFDMS4yODk1NCAyLjMxMDUgMS4xNjY2MyAyLjYwNzI1IDEuMTY2NjMgMi45MTY2N1YxMC41QzEuMTY2NjMgMTAuODA5NCAxLjI4OTU0IDExLjEwNjIgMS41MDgzMyAxMS4zMjVDMS43MjcxMyAxMS41NDM3IDIuMDIzODcgMTEuNjY2NyAyLjMzMzI5IDExLjY2NjdIMTEuNjY2NlpcIiBmaWxsPVwiI0VGRjZGRlwiIHN0cm9rZT1cIiMzRjUxQjVcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgIDwvc3ZnPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImljb24gJiYgaWNvbi50eXBlID09PSAnbG9vcCdcIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiNFwiIGZpbGw9XCIjRUJFQ0ZEXCIvPlxuICAgICAgPHBhdGggZD1cIk05LjY2NjYzIDQuNjY2NjZMMTEgNS45OTk5OUw5LjY2NjYzIDcuMzMzMzJcIiBzdHJva2U9XCIjM0Y1MUI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgPHBhdGggZD1cIk01IDcuNjY2NjdWNy4zMzMzM0M1IDYuOTc5NzEgNS4xNDA0OCA2LjY0MDU3IDUuMzkwNTIgNi4zOTA1MkM1LjY0MDU3IDYuMTQwNDggNS45Nzk3MSA2IDYuMzMzMzMgNkgxMVwiIHN0cm9rZT1cIiMzRjUxQjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8cGF0aCBkPVwiTTYuMzMzMzMgMTEuMzMzM0w1IDkuOTk5OTlMNi4zMzMzMyA4LjY2NjY2XCIgc3Ryb2tlPVwiIzNGNTFCNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDxwYXRoIGQ9XCJNMTEgOC4zMzMzNFY4LjY2NjY4QzExIDkuMDIwMyAxMC44NTk1IDkuMzU5NDQgMTAuNjA5NSA5LjYwOTQ5QzEwLjM1OTQgOS44NTk1MyAxMC4wMjAzIDEwIDkuNjY2NjcgMTBINVwiIHN0cm9rZT1cIiMzRjUxQjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvZGl2PiAtLT5cbiAgICA8IS0tIEJhciBJY29uIChCdWxsZXRlZCBMaXN0KSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaWNvbiAmJiBpY29uLnR5cGUgPT09ICdiYXInXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPCEtLSBGaXJzdCBidWxsZXQgYW5kIGxpbmUgLS0+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI1XCIgcj1cIjJcIiBmaWxsPVwiIzRGMzlGNlwiLz5cbiAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCI1XCIgeDI9XCIxN1wiIHkyPVwiNVwiIHN0cm9rZT1cIiM0RjM5RjZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICA8IS0tIFNlY29uZCBidWxsZXQgYW5kIGxpbmUgLS0+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxMFwiIHI9XCIyXCIgZmlsbD1cIiM0RjM5RjZcIi8+XG4gICAgICAgIDxsaW5lIHgxPVwiN1wiIHkxPVwiMTBcIiB4Mj1cIjE3XCIgeTI9XCIxMFwiIHN0cm9rZT1cIiM0RjM5RjZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICA8IS0tIFRoaXJkIGJ1bGxldCBhbmQgbGluZSAtLT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjE1XCIgcj1cIjJcIiBmaWxsPVwiIzRGMzlGNlwiLz5cbiAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCIxNVwiIHgyPVwiMTdcIiB5Mj1cIjE1XCIgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGVmYXVsdCBDaGFpbi1MaW5rIEljb24gKHdoZW4gbm8gaWNvbiBvciBpY29uIHR5cGUgaXMgbm90IHNwZWNpZmllZCkgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpY29uIHx8IChpY29uLnR5cGUgIT09ICdiYXInICYmIGljb24udHlwZSAhPT0gJ2ZvbGRlcicgJiYgaWNvbi50eXBlICE9PSAnbG9vcCcgJiYgaWNvbi50eXBlICE9PSAnY3VzdG9tJylcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNNy41MDAzMyAxNC4xNjYzSDUuODMzNjZDNC43Mjg1OSAxNC4xNjYzIDMuNjY4NzggMTMuNzI3NCAyLjg4NzM4IDEyLjk0NkMyLjEwNTk4IDEyLjE2NDYgMS42NjY5OSAxMS4xMDQ3IDEuNjY2OTkgOS45OTk2N0MxLjY2Njk5IDguODk0NjEgMi4xMDU5OCA3LjgzNDggMi44ODczOCA3LjA1MzRDMy42Njg3OCA2LjI3MTk5IDQuNzI4NTkgNS44MzMwMSA1LjgzMzY2IDUuODMzMDFINy41MDAzM1wiXG4gICAgICAgICAgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTIuNSA1LjgzMzAxSDE0LjE2NjdDMTUuMjcxNyA1LjgzMzAxIDE2LjMzMTUgNi4yNzE5OSAxNy4xMTI5IDcuMDUzNEMxNy44OTQzIDcuODM0OCAxOC4zMzMzIDguODk0NjEgMTguMzMzMyA5Ljk5OTY3QzE4LjMzMzMgMTEuMTA0NyAxNy44OTQzIDEyLjE2NDYgMTcuMTEyOSAxMi45NDZDMTYuMzMxNSAxMy43Mjc0IDE1LjI3MTcgMTQuMTY2MyAxNC4xNjY3IDE0LjE2NjNIMTIuNVwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzRGMzlGNlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8cGF0aCBkPVwiTTYuNjY2OTkgMTBIMTMuMzMzN1wiIHN0cm9rZT1cIiM0RjM5RjZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEN1c3RvbSBJY29uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpY29uICYmIGljb24udHlwZSA9PT0gJ2N1c3RvbScgJiYgaWNvbi5zdmdcIiBbaW5uZXJIVE1MXT1cImljb24uc3ZnXCI+PC9kaXY+XG5cbiAgICA8IS0tIFRpdGxlIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxN3B4XSBjcWEtdGV4dC1bIzMxMkM4NV0gY3FhLWZsZXgtMVwiPlxuICAgICAge3sgdGl0bGUgfX1cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIEJhZGdlIGFuZCBkeW5hbWljIGhlYWRlciBidXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBoZWFkZXJCdXR0b25zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgW3RleHRdPVwiYnRuLnRleHRcIlxuICAgICAgICAgIFtpY29uXT1cImJ0bi5pY29uXCJcbiAgICAgICAgICBbdmFyaWFudF09XCJidG4udmFyaWFudCB8fCAnb3V0bGluZWQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnRuLmRpc2FibGVkXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCJidG4udG9vbHRpcFwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cImJ0bi5jdXN0b21DbGFzc1wiXG4gICAgICAgICAgW2J0blNpemVdPVwiYnRuLmJ0blNpemUgfHwgJ3NtJ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25IZWFkZXJCdXR0b25DbGljayhidG4sIGksICRldmVudClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYmctWyNDNkQyRkZdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTZweF0gY3FhLXRleHQtWyM0MzJERDddIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWluLXctWzI0cHhdXCI+XG4gICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImNvdW50TG9hZGluZ1wiIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2tcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb3VudExvYWRpbmdcIj57eyBnZXREaXNwbGF5Q291bnQoKSB9fTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBFeHBhbmRlZCBDb250ZW50IC0tPlxuPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXB4LTIuNVwiPlxuICA8IS0tIFdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zLCBkaXNwbGF5IG5nLWNvbnRlbnQgZGlyZWN0bHkgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gV2hlbiBpdGVtcyBleGlzdCwgZGlzcGxheSB0aGVtIC0tPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG5cbiAgICA8IS0tIEl0ZW0gSGVhZGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHktMiBjcWEtcHgtMyBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zXCI+XG4gICAgICAgIDwhLS0gTGVmdCBzaWRlOiBTdGF0dXMgYW5kIFRpdGxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtMVwiPlxuICAgICAgICAgIDwhLS0gU3RhdHVzIEljb24gKEZpbGxlZCBHcmVlbiBDaXJjbGUgd2l0aCBDaGVja21hcmspIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8IS0tIFN1Y2Nlc3MgLS0+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80OF8xMjEpXCI+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuMDAwMyAxOC4zMzM3QzE0LjYwMjcgMTguMzMzNyAxOC4zMzM3IDE0LjYwMjcgMTguMzMzNyAxMC4wMDAzQzE4LjMzMzcgNS4zOTc5NSAxNC42MDI3IDEuNjY2OTkgMTAuMDAwMyAxLjY2Njk5QzUuMzk3OTUgMS42NjY5OSAxLjY2Njk5IDUuMzk3OTUgMS42NjY5OSAxMC4wMDAzQzEuNjY2OTkgMTQuNjAyNyA1LjM5Nzk1IDE4LjMzMzcgMTAuMDAwMyAxOC4zMzM3WlwiXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBNjNFXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjUgOS45OTk2N0w5LjE2NjY3IDExLjY2NjNMMTIuNSA4LjMzMzAxXCIgc3Ryb2tlPVwiIzAwQTYzRVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80OF8xMjFcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8IS0tIEZhaWxlZCAtLT5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMTBcIiByPVwiOFwiIGZpbGw9XCIjRUY0NDQ0XCIgLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdMMTMgMTNNMTMgN0w3IDEzXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8IS0tIFBlbmRpbmcgLS0+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI4XCIgZmlsbD1cIiM5Q0EzQUZcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZWMTBMMTMgMTJcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8IS0tIFJ1bm5pbmcgLS0+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdydW5uaW5nJ1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI4XCIgZmlsbD1cIiMzQjgyRjZcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZWMTBMMTMgMTJcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE4cHhdXCIgc3R5bGU9XCJ3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiPlxuICAgICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICA8IS0tIFJpZ2h0IHNpZGU6IER1cmF0aW9uIGFuZCBWaWV3IFN0ZXBzIExpbmsgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDwhLS0gU3RlcCBhY3Rpb24gaWNvbnMgKG9ubHkgd2hlbiBpc0RlYnVnKSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEZWJ1Z1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTAuNSBjcWEtdGV4dC1bIzlDQTNBRl1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIkVkaXRcIiAoY2xpY2spPVwib25FZGl0U3RlcChpdGVtLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiQWRkXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkZFN0ZXBNZW51XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNhZGRTdGVwTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cImNxYS1hZGQtc3RlcC1tZW51XCIgeFBvc2l0aW9uPVwiYmVmb3JlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2YgYWRkU3RlcE1lbnVPcHRpb25zXCIgKGNsaWNrKT1cIm9uQWRkU3RlcE9wdGlvblNlbGVjdChpdGVtLCBvcHQsICRldmVudClcIj57eyBvcHQubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIk1vcmUgb3B0aW9uc1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJzdGVwTW9yZU1lbnVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS10ZXh0LVsxNHB4XSAhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF1cIj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI3N0ZXBNb3JlTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cImNxYS1zdGVwLW1vcmUtbWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgb3B0IG9mIHN0ZXBNb3JlTWVudU9wdGlvbnNcIiAoY2xpY2spPVwib25TdGVwTW9yZU9wdGlvblNlbGVjdChpdGVtLCBvcHQsICRldmVudClcIj57eyBvcHQubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBEdXJhdGlvbiB3aXRoIENsb2NrIEljb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjNkE3MjgyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjNkE3MjgyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVsjNkE3MjgyXVwiPlxuICAgICAgICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihpdGVtLmR1cmF0aW9uKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICA8IS0tIFZpZXcgU3RlcHMgTGluazogcmVkaXJlY3QgbW9kZSAobmF2aWdhdGVzIHRvIFVSTCkgb3IgaW5saW5lIG1vZGUgKHRvZ2dsZSBleHBhbmQpIC0tPlxuICAgICAgICAgIDxhICpuZ0lmPVwiaGFzVmlld1N0ZXBzUmVkaXJlY3RVcmwoaXRlbSlcIlxuICAgICAgICAgICAgW2hyZWZdPVwiZ2V0SXRlbVZpZXdTdGVwc1VybChpdGVtKVwiXG4gICAgICAgICAgICBbYXR0ci50YXJnZXRdPVwidmlld1N0ZXBzT3BlbkluTmV3VGFiID8gJ19ibGFuaycgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLnJlbF09XCJ2aWV3U3RlcHNPcGVuSW5OZXdUYWIgPyAnbm9vcGVuZXIgbm9yZWZlcnJlcicgOiBudWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLW5vLXVuZGVybGluZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBob3ZlcjpjcWEtdW5kZXJsaW5lXCI+XG4gICAgICAgICAgICA8c3Bhbj5WaWV3IHN0ZXBzPC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNVwiXG4gICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTguNjU1MiAxMi44MTg0TDcuNTU0MTMgMTEuNzY2OEwxMC44NTIgOC41ODY0SDIuODM5ODRWNy4wNTAzMkgxMC44NTJMNy41NTQxMyAzLjg3NTA2TDguNjU1MiAyLjgxODM2TDEzLjgzOTggNy44MTgzNkw4LjY1NTIgMTIuODE4NFpcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCIjM0Y0M0VFXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8YSAqbmdJZj1cIiFoYXNWaWV3U3RlcHNSZWRpcmVjdFVybChpdGVtKVwiIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld1N0ZXBzKGl0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtbm8tdW5kZXJsaW5lIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGhvdmVyOmNxYS11bmRlcmxpbmVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGlzSXRlbUV4cGFuZGVkKGl0ZW0uaWQpID8gJ0hpZGUgc3RlcHMnIDogJ1ZpZXcgc3RlcHMnIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyBbY2xhc3MuY3FhLXJvdGF0ZS05MF09XCJpc0l0ZW1FeHBhbmRlZChpdGVtLmlkKVwiIGNsYXNzPVwiY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE1XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNOC42NTUyIDEyLjgxODRMNy41NTQxMyAxMS43NjY4TDEwLjg1MiA4LjU4NjRIMi44Mzk4NFY3LjA1MDMySDEwLjg1Mkw3LjU1NDEzIDMuODc1MDZMOC42NTUyIDIuODE4MzZMMTMuODM5OCA3LjgxODM2TDguNjU1MiAxMi44MTg0WlwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIiMzRjQzRUVcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwcyBDb250ZW50IChzaG93biB3aGVuIGl0ZW0gaXMgZXhwYW5kZWQpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0l0ZW1FeHBhbmRlZChpdGVtLmlkKVwiPlxuICAgICAgPCEtLSBDdXN0b20gdGVtcGxhdGUgdmlhIFRlbXBsYXRlUmVmIChmcm9tIEBDb250ZW50Q2hpbGQgb3IgQElucHV0KSAtIHBhc3NlcyBpdGVtIGFzIGNvbnRleHQgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbUNvbnRlbnRUcGwgfHwgaXRlbUNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtM1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiKGl0ZW1Db250ZW50VHBsIHx8IGl0ZW1Db250ZW50VGVtcGxhdGUpITsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGl0ZW06IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEN1c3RvbSBjb250ZW50IHByb2plY3Rpb24gdmlhIG5nLWNvbnRlbnQgLSBkaXNwbGF5ZWQgZm9yIGFsbCBleHBhbmRlZCBpdGVtcyAtLT5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpdGVtQ29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQ3VzdG9tIGNvbnRlbnQgcHJvamVjdGlvbiBhZnRlciBhbGwgaXRlbXMgLSBmb3Igc3RlcHMgbG9hZGVkIGFmdGVyIEFQSSBjYWxsIC0tPlxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FmdGVySXRlbXNdXCI+PC9uZy1jb250ZW50PiJdfQ==