tango-app-ui-store-builder 1.0.1-beta-3 → 1.0.1-beta-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +4 -4
- package/esm2022/lib/components/create-store/create-store.component.mjs +2 -2
- package/esm2022/lib/components/create-vm/create-vm.component.mjs +12 -7
- package/esm2022/lib/components/create-vm/popups/add-vm-type/add-vm-type.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/fixture-template.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +16 -7
- package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +7 -6
- package/esm2022/lib/components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component.mjs +2 -2
- package/esm2022/lib/components/manage-plano-table/manage-plano-table.component.mjs +23 -12
- package/esm2022/lib/components/manage-plano-table/popups/create-planogram/create-planogram.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.mjs +4 -4
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +5 -5
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +1 -1
- package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +1 -1
- package/esm2022/lib/components/plano-configurations/popups/popups.component.mjs +1 -1
- package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +6 -5
- package/esm2022/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/fixture-library/popups/fixture-bulk-upload/fixture-bulk-upload.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/vm-library/popups/vm-bulk-upload/vm-bulk-upload.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +32 -17
- package/esm2022/lib/interfaces/vm-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +1 -3
- package/fesm2022/tango-app-ui-store-builder.mjs +104 -65
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/create-fixture/create-fixture.component.d.ts +2 -2
- package/lib/components/create-store/create-store.component.d.ts +3 -3
- package/lib/components/create-vm/create-vm.component.d.ts +3 -3
- package/lib/components/create-vm/popups/add-vm-type/add-vm-type.component.d.ts +2 -2
- package/lib/components/fixture-template/fixture-template.component.d.ts +2 -2
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -2
- package/lib/components/fixture-template/template-products/template-products.component.d.ts +4 -4
- package/lib/components/fixture-template/template-summary/template-summary.component.d.ts +6 -6
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +4 -4
- package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +1 -1
- package/lib/components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component.d.ts +2 -2
- package/lib/components/manage-plano-table/manage-plano-table.component.d.ts +4 -3
- package/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.d.ts +1 -1
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +5 -5
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +1 -1
- package/lib/components/manage-store-plano/template-products/template-products.component.d.ts +2 -2
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +4 -4
- package/lib/components/plano-configurations/plano-configurations.component.d.ts +3 -3
- package/lib/components/plano-configurations/popups/popups.component.d.ts +1 -1
- package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +1 -1
- package/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.d.ts +1 -1
- package/lib/components/plano-library/fixture-library/popups/fixture-bulk-upload/fixture-bulk-upload.component.d.ts +1 -1
- package/lib/components/plano-library/vm-library/popups/vm-bulk-upload/vm-bulk-upload.component.d.ts +1 -1
- package/lib/components/plano-library/vm-library/vm-library.component.d.ts +3 -2
- package/lib/interfaces/vm-library.interface.d.ts +3 -2
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Component } from '@angular/core';
|
|
2
2
|
import { FormGroup, FormArray, Validators } from '@angular/forms';
|
|
3
|
+
import { distinctUntilChanged, filter, map } from 'rxjs';
|
|
3
4
|
import { CompleteConfirmationComponent } from '../popups/complete-confirmation/complete-confirmation.component';
|
|
4
5
|
import { DeleteConfirmationComponent } from '../popups/delete-confirmation/delete-confirmation.component';
|
|
5
|
-
import { distinctUntilChanged, filter, map } from 'rxjs';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import * as i1 from "@angular/router";
|
|
8
8
|
import * as i2 from "@angular/forms";
|
|
@@ -392,10 +392,10 @@ export class CreateFixtureComponent {
|
|
|
392
392
|
});
|
|
393
393
|
}
|
|
394
394
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.StoreBuilderService }, { token: i4.ToastService }, { token: i1.Router }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
395
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value\r\n }}{{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div\r\n *ngIf=\"!isEditMode\"\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3\"\r\n (click)=\"onClickEdit()\"\r\n [disabled]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline\"\r\n (click)=\"onSubmit('draft')\"\r\n [disabled]=\"this.fixtureDetails.status === 'complete'\"\r\n >\r\n Save as draft\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n\r\n <li\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <a\r\n [class.disabled-click]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n class=\"dropdown-item cursor-pointer text-danger\"\r\n (click)=\"onDelete()\"\r\n >\r\n Delete\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall height (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header')\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ wallFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport w-100\">\r\n <!-- Header Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorPanelFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall length (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"counter-form-group\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"floor-panel-viewport w-100\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex justify-content-center w-100 gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span\r\n >{{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span\r\n >\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorPanelFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex flex-column align-items-center gap-5 mt-5\">\r\n <svg width=\"530\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorPanelFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-form-group{display:flex;align-items:center;justify-content:space-between;margin-top:16px;margin-bottom:18px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid #98a2b3;min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:6px;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(50vh - 100px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#363f72}.indicator.yetToAssign path{fill:#363f72}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:100%;max-width:516px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:70px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i8.CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder"], outputs: ["onIncrement", "onDecrement"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i9.TimeAgoPipe, name: "timeAgo" }] });
|
|
395
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value\r\n }}{{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div\r\n *ngIf=\"!isEditMode\"\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3\"\r\n (click)=\"onClickEdit()\"\r\n [disabled]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <div\r\n ngbTooltip=\"Action unavailable. This Fixture is already completed.\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'inactive')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline\"\r\n (click)=\"onSubmit('draft')\"\r\n [disabled]=\"fixtureDetails.status === 'inactive'\"\r\n >\r\n Save as draft\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n\r\n <li\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <a\r\n [class.disabled-click]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n class=\"dropdown-item cursor-pointer text-danger\"\r\n (click)=\"onDelete()\"\r\n >\r\n Delete\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall height (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header')\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ wallFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport w-100\">\r\n <!-- Header Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorPanelFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall length (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"counter-form-group\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"floor-panel-viewport w-100\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex justify-content-center w-100 gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span\r\n >{{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span\r\n >\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorPanelFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex flex-column align-items-center gap-5 mt-5\">\r\n <svg width=\"530\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorPanelFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-form-group{display:flex;align-items:center;justify-content:space-between;margin-top:16px;margin-bottom:18px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid #98a2b3;min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:6px;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(50vh - 100px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#363f72}.indicator.yetToAssign path{fill:#363f72}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:100%;max-width:516px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:70px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i8.CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder"], outputs: ["onIncrement", "onDecrement"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i9.TimeAgoPipe, name: "timeAgo" }] });
|
|
396
396
|
}
|
|
397
397
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, decorators: [{
|
|
398
398
|
type: Component,
|
|
399
|
-
args: [{ selector: 'lib-create-fixture', template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value\r\n }}{{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div\r\n *ngIf=\"!isEditMode\"\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3\"\r\n (click)=\"onClickEdit()\"\r\n [disabled]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline\"\r\n (click)=\"onSubmit('draft')\"\r\n [disabled]=\"this.fixtureDetails.status === 'complete'\"\r\n >\r\n Save as draft\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n\r\n <li\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <a\r\n [class.disabled-click]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n class=\"dropdown-item cursor-pointer text-danger\"\r\n (click)=\"onDelete()\"\r\n >\r\n Delete\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall height (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header')\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ wallFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport w-100\">\r\n <!-- Header Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorPanelFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall length (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"counter-form-group\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"floor-panel-viewport w-100\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex justify-content-center w-100 gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span\r\n >{{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span\r\n >\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorPanelFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex flex-column align-items-center gap-5 mt-5\">\r\n <svg width=\"530\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorPanelFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-form-group{display:flex;align-items:center;justify-content:space-between;margin-top:16px;margin-bottom:18px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid #98a2b3;min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:6px;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(50vh - 100px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#363f72}.indicator.yetToAssign path{fill:#363f72}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:100%;max-width:516px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:70px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
399
|
+
args: [{ selector: 'lib-create-fixture', template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value\r\n }}{{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div\r\n *ngIf=\"!isEditMode\"\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline d-flex align-items-center gap-3\"\r\n (click)=\"onClickEdit()\"\r\n [disabled]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <div\r\n ngbTooltip=\"Action unavailable. This Fixture is already completed.\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'inactive')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline\"\r\n (click)=\"onSubmit('draft')\"\r\n [disabled]=\"fixtureDetails.status === 'inactive'\"\r\n >\r\n Save as draft\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n\r\n <li\r\n [ngbTooltip]=\"'Cannot Edit. Fixture used in ' + fixtureDetails.templateId + ' Templates'\"\r\n [disableTooltip]=\"!(fixtureDetails.status === 'active' || fixtureDetails.templateId)\"\r\n >\r\n <a\r\n [class.disabled-click]=\"fixtureDetails.status === 'active' || fixtureDetails.templateId\"\r\n class=\"dropdown-item cursor-pointer text-danger\"\r\n (click)=\"onDelete()\"\r\n >\r\n Delete\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall height (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header')\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer')\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Height (\" + (this.fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ wallFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport w-100\">\r\n <!-- Header Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex justify-content-center w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorPanelFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall width (\" + (this.fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"counter-form-group\">\r\n <label>{{ \"Overall length (\" + (this.fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"counter-form-group\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n\r\n <div class=\"counter-form-group\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <div class=\"counter-form-group\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div class=\"floor-panel-viewport w-100\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex justify-content-center w-100 gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span\r\n >{{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span\r\n >\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorPanelFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }} <b>Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"d-flex flex-column align-items-center gap-5 mt-5\">\r\n <svg width=\"530\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorPanelFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorPanelFixtureForm.get(\"basicDetails.length\")?.value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-form-group{display:flex;align-items:center;justify-content:space-between;margin-top:16px;margin-bottom:18px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid #98a2b3;min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:6px;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(50vh - 100px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#363f72}.indicator.yetToAssign path{fill:#363f72}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:100%;max-width:516px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:70px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
400
400
|
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.StoreBuilderService }, { type: i4.ToastService }, { type: i1.Router }, { type: i5.NgbModal }] });
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU8vRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFPekQsTUFBTSxPQUFPLHNCQUFzQjtJQW9CdkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBeEJWLGVBQWUsQ0FBWTtJQUMzQixxQkFBcUIsQ0FBWTtJQUVqQyxhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFFekIsY0FBYyxHQUEwQixFQUFFLENBQUM7SUFDM0MsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUU1QixlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLGVBQWUsR0FBWSxJQUFJLENBQUM7SUFDaEMsYUFBYSxHQUFZLElBQUksQ0FBQztJQUVyQixVQUFVLEdBQWlCO1FBQ2xDLEVBQUUsS0FBSyxFQUFF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QUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXRFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDdEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUM3QixtQkFBbUIsRUFBRSxPQUFPO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaGFVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDBEQ2pCbkMsb3hqQ0Fnc0JBOzs0RkQvcUJhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZUxpYnJhcnlEZXRhaWxzLCBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcG9wdXBzL2NvbXBsZXRlLWNvbmZpcm1hdGlvbi9jb21wbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1maXh0dXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHdhbGxGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG4gIGZsb29yUGFuZWxGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGZpeHR1cmVEZXRhaWxzOiBGaXh0dXJlTGlicmFyeURldGFpbHMgPSB7fTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGlzSGVhZGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNGb290ZXJFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0JvZHlFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcmVhZG9ubHkgc2hlbGZUeXBlczogRHJvcGRvd25JRltdID0gW1xyXG4gICAgeyBsYWJlbDogJ1NoZWxmJywgdmFsdWU6ICdzaGVsZicgfSxcclxuICAgIHsgbGFiZWw6ICdUcmF5JywgdmFsdWU6ICd0cmF5JyB9XHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuX2lkID0gcGFyYW1zWydmaXh0dXJlSWQnXSA/PyAnJztcclxuXHJcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSBwYXJhbXNbJ2lzRWRpdCddID09ICd0cnVlJztcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuX2lkKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAocGFyYW1zID0+IHBhcmFtc1snZml4dHVyZUlkJ10pLCBmaWx0ZXIoaWQgPT4gISFpZCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIGlkID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0Rml4dHVyZUxpYnJhcnlEZXRhaWxzKGlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhaWxzID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIGlmIChkZXRhaWxzKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscyA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmRldGFpbHNcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIGZldGNoIGZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignaGVhZGVyJylcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpXHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oJ2JvZHknKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53YWxsRml4dHVyZUZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG5cclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy53YWxsRml4dHVyZUZvcm0gOiB0aGlzLmZsb29yUGFuZWxGaXh0dXJlRm9ybVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoJ2JvZHkuc2hlbGYnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFuZWxBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldCgncGFuZWwnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQcm9kdWN0Q2FwYWNpdHkoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJyA/IHRoaXMuc2hlbGZBcnJheSA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4gZm9ybUFycmF5LmNvbnRyb2xzLnJlZHVjZSgodG90YWwsIGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSc7XHJcbiAgICAgIGNvbnN0IHJvd3MgPSBpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUgfHwgMTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBmaXh0dXJlIGlzIGEgZmxvb3IgcGFuZWwgb3IgdHJheSwgd2UgbmVlZCB0byBtdWx0aXBseSB0aGUgcHJvZHVjdCBjYXBhY2l0eSBieSB0aGUgbnVtYmVyIG9mIHJvd3NcclxuICAgICAgcmV0dXJuIHRvdGFsICsgKGlzVHJheSB8fCB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnZmxvb3InID8gY291bnQgKiByb3dzIDogY291bnQpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBpbml0V2FsbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBoZWFkZXI6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGhlaWdodDogW3RoaXMuZml4dHVyZURldGFpbHM/LmhlYWRlcj8uaGVpZ2h0Py52YWx1ZSA/PyAzMDAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dXHJcbiAgICAgIH0pLFxyXG4gICAgICBib2R5OiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBzaGVsZjogdGhpcy5mYi5hcnJheShbXSlcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXV1cclxuICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRTaGVsZihzKSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkU2hlbGYoKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnkgPSB2YWx1ZTtcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLmZsb29yUGFuZWxGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIHBhbmVsOiB0aGlzLmZiLmFycmF5KFtdKVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8uZm9yRWFjaChzID0+IHRoaXMuYWRkUGFuZWwocykpXHJcblxyXG4gICAgdGhpcy5mbG9vclBhbmVsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGZpeHR1cmVDYXRlZ29yeTogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVDYXRlZ29yeSB8fCAnVW50aXRsZWQnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgd2lkdGg6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXV0sXHJcbiAgICAgIGxlbmd0aDogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlID8/IDEyLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV1dXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnKSB7XHJcbiAgICBjb25zdCBzaGVsZkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFtzaGVsZj8uc2hlbGZUeXBlIHx8ICdzaGVsZicsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwcm9kdWN0Q2FwYWNpdHk6IFtzaGVsZj8ucHJvZHVjdFBlclNoZWxmID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dLFxyXG4gICAgICBub09mUm93czogW3NoZWxmPy50cmF5Um93cyA/PyAxXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXR1cFNoZWxmVHlwZUxpc3RlbmVyKHNoZWxmR3JvdXApO1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnB1c2goc2hlbGZHcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyAgd2UgbmVlZCB0byBzZXR1cCBhIGxpc3RlbmVyIHRvIHRoZSB0eXBlIG9mIHRoZSBzaGVsZiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgbm9PZlJvd3MgZmllbGRcclxuICBzZXR1cFNoZWxmVHlwZUxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCkge1xyXG4gICAgc2hlbGZHcm91cC5nZXQoJ3R5cGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0eXBlID0+IHtcclxuICAgICAgY29uc3Qgbm9PZlJvd3NDb250cm9sID0gc2hlbGZHcm91cC5nZXQoJ25vT2ZSb3dzJyk7XHJcbiAgICAgIGlmICh0eXBlID09PSAndHJheScpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZSgxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgbm9PZlJvd3NDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBzaGVsZiBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVNoZWxmKGluZGV4OiBudW1iZXIgPSB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIGFkZFBhbmVsKHBhbmVsPzogRml4dHVyZUxpYnJhcnlTaGVsZkNvbmZpZykge1xyXG4gICAgY29uc3QgcGFuZWxHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwYW5lbE5hbWU6IFtwYW5lbD8ubGFiZWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3BhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXV0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbcGFuZWw/LnRyYXlSb3dzID8/IDUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucHVzaChwYW5lbEdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBwYW5lbCBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVBhbmVsKGluZGV4OiBudW1iZXIgPSB0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgdGhpcy5wYW5lbEFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogJ2hlYWRlcicgfCAnYm9keScgfCAnZm9vdGVyJykge1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uKTtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbjogJ2hlYWRlcicgfCAnYm9keScgfCAnZm9vdGVyJykge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSBmb3JtLmdldChzZWN0aW9uKTtcclxuICAgIGlmIChncm91cCkge1xyXG4gICAgICBncm91cC5lbmFibGVkID8gZ3JvdXAuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBncm91cC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIHN3aXRjaCAoc2VjdGlvbikge1xyXG4gICAgICBjYXNlICdoZWFkZXInOlxyXG4gICAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gIXRoaXMuaXNIZWFkZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSAhdGhpcy5pc0JvZHlFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdmb290ZXInOlxyXG4gICAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gIXRoaXMuaXNGb290ZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwRm9ybVRvQXBpKGZvcm06IEZvcm1Hcm91cCwgc3RhdHVzOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybS52YWx1ZTtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJyA/IHRoaXMuc2hlbGZBcnJheSA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBcInN0YXR1c1wiOiBzdGF0dXMsXHJcbiAgICAgIFwiZml4dHVyZUNhdGVnb3J5XCI6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBcImZpeHR1cmVDYXBhY2l0eVwiOiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBcImZpeHR1cmVMZW5ndGhcIjoge1xyXG4gICAgICAgIFwidmFsdWVcIjogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgXCJ1bml0XCI6IFwiZnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImZpeHR1cmVXaWR0aFwiOiB7XHJcbiAgICAgICAgXCJ2YWx1ZVwiOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIFwidW5pdFwiOiBcImZ0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJoZWFkZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdoZWFkZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJmb290ZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdmb290ZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJpc0JvZHlFbmFibGVkXCI6ICFmb3JtLmdldCgnYm9keScpPy5kaXNhYmxlZCxcclxuICAgICAgXCJzaGVsZkNvbmZpZ1wiOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gJ3RyYXknLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRm9ybShmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChrZXkpO1xyXG5cclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZUZvcm0oY29udHJvbCkpIHtcclxuICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAnd2lkdGgnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnT3ZlcmFsbCB3aWR0aCBjYW5ub3QgYmUgemVybycpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdsZW5ndGgnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnT3ZlcmFsbCBsZW5ndGggY2Fubm90IGJlIHplcm8nKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZml4dHVyZUNhdGVnb3J5JyAmJiBjb250cm9sLmVycm9ycz8uWydyZXF1aXJlZCddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRml4dHVyZSBjYXRlZ29yeSBpcyByZXF1aXJlZCcpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoZWlnaHQnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnSGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHJvZHVjdENhcGFjaXR5JyAmJiBjb250cm9sLmVycm9ycz8uWydtaW4nXSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1Byb2R1Y3QgY2FwYWNpdHkgbXVzdCBiZSBhdCBsZWFzdCAxJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXJyb3JzPy5bJ3JlcXVpcmVkJ10pIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGAke2tleX0gaXMgcmVxdWlyZWRgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0oZm9ybSkpIHtcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMubWFwRm9ybVRvQXBpKGZvcm0sIHN0YXR1cyk7XHJcblxyXG4gICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UudXBkYXRlRml4dHVyZUxpYnJhcnkodHJhbnNmb3JtZWREYXRhLCB0aGlzLmZpeHR1cmVEZXRhaWxzPy5faWQhKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5zdGF0dXMgPSBzdGF0dXNcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPz8gXCJGYWlsZWQgdG8gc2F2ZSBGaXh0dXJlIGRldGFpbHNcIik7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBjb25maXJtQ29tcGxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnQ29tcGxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdGaXh0dXJlIGlzIG5vdyByZWFkeSBhbmQgYXZhaWxhYmxlIHRvIGNyZWF0ZSBhcyB0ZW1wbGF0ZS4nO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2Uubm90ZSA9ICdZb3UgY2FuXFwndCBlZGl0IGl0IG9uY2UgYXNzaWduZWQgdG8gdGhlIHRlbXBsYXRlLic7XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gJ29rJyk7XHJcbiAgfVxyXG5cclxuICBvbkR1cGxpY2F0ZSgpIHtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kdXBsaWNhdGVGaXh0dXJlTGlicmFyeSh7XHJcbiAgICAgIGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWRcclxuICAgIH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2NyZWF0ZS1saWJyYXJ5LWZpeHR1cmUnXSwgeyBxdWVyeVBhcmFtczogeyBmaXh0dXJlSWQ6IHJlcz8uZGF0YT8uaWQgfSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gZHVwbGljYXRlIEZpeHR1cmUnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZHVwbGljYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZml4dHVyZSA/JztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGUoKSB7XHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kZWxldGVGaXh0dXJlTGlicmFyeSh7IGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBkZWxldGUgRml4dHVyZScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdoZWFkZXInKVxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdmb290ZXInKVxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oJ2JvZHknKVxyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRWRpdDogdHJ1ZSB9LFxyXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59IiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGgyIGNsYXNzPVwibS0wXCI+XHJcbiAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5IH19IC0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgIH19e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICA8L2gyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgZHJhZnRcIj57eyBmaXh0dXJlRGV0YWlscy5zdGF0dXMgfCB0aXRsZWNhc2UgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPHAgY2xhc3M9XCJtLTBcIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzPy51cGRhdGVkQXRcIiBbbmdiVG9vbHRpcF09XCJmaXh0dXJlRGV0YWlscy51cGRhdGVkQXQgfCBkYXRlIDogJ21lZGl1bSdcIj5cclxuICAgICAgICBMYXN0IHVwZGF0ZToge3sgZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgdGltZUFnbyB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICBbbmdiVG9vbHRpcF09XCInQ2Fubm90IEVkaXQuIEZpeHR1cmUgdXNlZCBpbiAnICsgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCArICcgVGVtcGxhdGVzJ1wiXHJcbiAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cIiEoZml4dHVyZURldGFpbHMuc3RhdHVzID09PSAnYWN0aXZlJyB8fCBmaXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9PT0gJ2FjdGl2ZScgfHwgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTMyMl81MzI1KVwiPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzEzMjJfNTMyNVwiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIEVkaXRcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0TW9kZVwiIGNsYXNzPVwiZC1mbGV4IGdhcC01IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoJ2RyYWZ0JylcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID09PSAnY29tcGxldGUnXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBTYXZlIGFzIGRyYWZ0XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwib25TdWJtaXQoJ2NvbXBsZXRlJylcIj5Db21wbGV0ZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMTEgMTJDMTEgMTIuNTUyMyAxMS40NDc3IDEzIDEyIDEzQzEyLjU1MjMgMTMgMTMgMTIuNTUyMyAxMyAxMkMxMyAxMS40NDc3IDEyLjU1MjMgMTEgMTIgMTFDMTEuNDQ3NyAxMSAxMSAxMS40NDc3IDExIDEyWlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMTEgMTlDMTEgMTkuNTUyMyAxMS40NDc3IDIwIDEyIDIwQzEyLjU1MjMgMjAgMTMgMTkuNTUyMyAxMyAxOUMxMyAxOC40NDc3IDEyLjU1MjMgMTggMTIgMThDMTEuNDQ3NyAxOCAxMSAxOC40NDc3IDExIDE5WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMTEgNUMxMSA1LjU1MjI4IDExLjQ0NzcgNiAxMiA2QzEyLjU1MjMgNiAxMyA1LjU1MjI4IDEzIDVDMTMgNC40NDc3MiAxMi41NTIzIDQgMTIgNEMxMS40NDc3IDQgMTEgNC40NDc3MiAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25EdXBsaWNhdGUoKVwiICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5EdXBsaWNhdGU8L2E+PC9saT5cclxuXHJcbiAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiJ0Nhbm5vdCBFZGl0LiBGaXh0dXJlIHVzZWQgaW4gJyArIGZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQgKyAnIFRlbXBsYXRlcydcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZVRvb2x0aXBdPVwiIShmaXh0dXJlRGV0YWlscy5zdGF0dXMgPT09ICdhY3RpdmUnIHx8IGZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiZml4dHVyZURldGFpbHMuc3RhdHVzID09PSAnYWN0aXZlJyB8fCBmaXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZSgpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIERlbGV0ZVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gV2FsbCB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+Q29uZmlndXJlIHlvdXIgZml4dHVyZSBkZXRhaWxzIGhlcmU8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ3YWxsRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJBU0lDIERFVEFJTFM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNhdGVnb3J5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgaGVpZ2h0IChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImxlbmd0aFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzSGVhZGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignaGVhZGVyJylcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkhFQURFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImhlYWRlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiSGVpZ2h0IChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJoZWlnaHRcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImJvZHlcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQm9keUVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2JvZHknKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Qk9EWTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJib2R5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0JvZHlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItY29udGFpbmVyXCIgW2NsYXNzLmRpc2FibGUtY291bnRlcl09XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNoZWxmKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFNoZWxmKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzk4QTJCM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInNoZWxmVHlwZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hlbGYuZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiByb3dzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5vT2ZSb3dzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MCVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBdPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0Zvb3RlckVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5GT09URVI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJmb290ZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAodGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmhlaWdodD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyB3YWxsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8IS0tIEhlYWRlciBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0hlYWRlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgIDxwPkhFQURFUjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIEJvZHkgUHJldmlldyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCJpc0JvZHlFbmFibGVkICYmIHNoZWxmQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDAgZ2FwLTVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzaGVsZkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgQGlmKGl0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICBTSEVMRiB7eyBpICsgMSB9fSA8Yj5Qcm9kdWN0czoge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlIH19PC9iPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICBTSEVMRiB7eyBpICsgMSB9fSA8Yj5Qcm9kdWN0czoge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlICogKGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlID8/IDEpIH19PC9iPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIEZvb3RlciBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0Zvb3RlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXIgZm9vdGVyLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWluZm9cIj5cclxuICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBTaGVsdmVzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgdG90YWxQcm9kdWN0Q2FwYWNpdHkgfX08L2gzPlxyXG4gICAgICAgICAgPHA+UHJvZHVjdCBDYXBhY2l0eTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlIHwgdGl0bGVjYXNlIH19IGZpeHR1cmU8L2gzPlxyXG4gICAgICAgICAgPHA+VHlwZTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPlxyXG4gICAgICAgICAgICB7eyB3YWxsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4IHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSBmZWV0XHJcbiAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgPHA+T3ZlcmFsbCBEaW1lbnNpb248L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRmxvb3IgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcidcIj5cclxuICAgIDwhLS0gRmxvb3IgUGFuZWwgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPlRoZSBzZXR0aW5ncyBhcmUgcHJlLWNvbmZpZ3VyZWQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQ8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmbG9vclBhbmVsRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJBU0lDIERFVEFJTFM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNhdGVnb3J5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgbGVuZ3RoIChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImxlbmd0aFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFBhbmVsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlBBTkVMPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHBhbmVsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcGFuZWxBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUGFuZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjE1Mzg5IDIuOTE2NVYxMS4wODMyTTMuMDcwNTYgNi45OTk4NEgxMS4yMzcyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFuZWxBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbEFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImFycmF5LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5QYW5lbCB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUGFuZWwoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGFuZWxOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFuZWxOYW1lXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MCVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYW5lbEFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMCBnYXAtNVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgPnt7IGZsb29yUGFuZWxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW5cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yUGFuZWxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJwYW5lbCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWluZm9cIj5cclxuICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX0gPGI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSAqIChpdGVtLmdldChcIm5vT2ZSb3dzXCIpPy52YWx1ZSA/PyAxKSB9fTwvYj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC01IG10LTVcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCI1MzBcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgNTMwIDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTAuNDM5Njk3IDMxLjgwODdDMC40Mzk2OTcgMjYuODY0IDQuNDQ4MiAyMi44NTU1IDkuMzkyOTQgMjIuODU1NUg0Ny40NjgxQzUyLjQyMyAyMi44NTU1IDU2LjQzOTcgMjYuODcyMiA1Ni40Mzk3IDMxLjgyN0M1Ni40Mzk3IDM3LjMyNTUgNTEuNTM3MyA0MS40OTk0IDQ2LjA3NjUgNDAuODU3MUMzMy42MzE4IDM5LjM5MzUgMjMuNzI2NyAzOS4zMjA2IDEwLjgxODYgNDAuODM3NkM1LjM1NTQyIDQxLjQ3OTYgMC40Mzk2OTcgMzcuMzA5NSAwLjQzOTY5NyAzMS44MDg3WlwiXHJcbiAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjguNDQwOFwiIGN5PVwiMTYuNTcxNFwiIHI9XCIxNS4wNzE0XCIgZmlsbD1cIiMxRDI5MzlcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjNcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gSW5mbyBDYXJkcyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtMlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgcGFuZWxBcnJheS5sZW5ndGggfX08L2gzPlxyXG4gICAgICAgICAgPHA+Tm8gb2YgUGFuZWxzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgdG90YWxQcm9kdWN0Q2FwYWNpdHkgfX08L2gzPlxyXG4gICAgICAgICAgPHA+UHJvZHVjdCBDYXBhY2l0eTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlIHwgdGl0bGVjYXNlIH19IGZpeHR1cmU8L2gzPlxyXG4gICAgICAgICAgPHA+VHlwZTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPlxyXG4gICAgICAgICAgICB7eyBmbG9vclBhbmVsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yUGFuZWxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgPC9oMz5cclxuICAgICAgICAgIDxwPk92ZXJhbGwgRGltZW5zaW9uPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48c2VjdGlvbiBpZD1cImJ1aWxkLWZpeHR1cmUtc2tlbGV0b25cIiAqbmdJZj1cImlzUGFnZUxvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBDb21tb24gZGltZW5zaW9uIGFycm93cyAtLT5cclxuPG5nLXRlbXBsYXRlICNkaW1lbnNpb25BcnJvd3MgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpbWVuc2lvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IGxlZnRcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgIDxzcGFuPnt7IHZhbHVlIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUt6RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQzs7Ozs7Ozs7Ozs7QUFPMUcsTUFBTSxPQUFPLHNCQUFzQjtJQW9CdkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBeEJWLGVBQWUsQ0FBWTtJQUMzQixxQkFBcUIsQ0FBWTtJQUVqQyxhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFFekIsY0FBYyxHQUEwQixFQUFFLENBQUM7SUFDM0MsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUU1QixlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLGVBQWUsR0FBWSxJQUFJLENBQUM7SUFDaEMsYUFBYSxHQUFZLElBQUksQ0FBQztJQUVyQixVQUFVLEdBQWlCO1FBQ2xDLEVBQUUsS0FBSyxFQUFF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QUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUztZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXRFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDdEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUM3QixtQkFBbUIsRUFBRSxPQUFPO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaGFVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDBEQ2pCbkMsMitqQ0Fxc0JBOzs0RkRwckJhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZUxpYnJhcnlEZXRhaWxzLCBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGxhbm8tZ2VuZXJhbC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1maXh0dXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHdhbGxGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG4gIGZsb29yUGFuZWxGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGZpeHR1cmVEZXRhaWxzOiBGaXh0dXJlTGlicmFyeURldGFpbHMgPSB7fTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGlzSGVhZGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNGb290ZXJFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0JvZHlFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcmVhZG9ubHkgc2hlbGZUeXBlczogRHJvcGRvd25JRltdID0gW1xyXG4gICAgeyBsYWJlbDogJ1NoZWxmJywgdmFsdWU6ICdzaGVsZicgfSxcclxuICAgIHsgbGFiZWw6ICdUcmF5JywgdmFsdWU6ICd0cmF5JyB9XHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuX2lkID0gcGFyYW1zWydmaXh0dXJlSWQnXSA/PyAnJztcclxuXHJcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSBwYXJhbXNbJ2lzRWRpdCddID09ICd0cnVlJztcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuX2lkKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAocGFyYW1zID0+IHBhcmFtc1snZml4dHVyZUlkJ10pLCBmaWx0ZXIoaWQgPT4gISFpZCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIGlkID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0Rml4dHVyZUxpYnJhcnlEZXRhaWxzKGlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhaWxzID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIGlmIChkZXRhaWxzKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscyA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmRldGFpbHNcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIGZldGNoIGZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignaGVhZGVyJylcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpXHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oJ2JvZHknKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53YWxsRml4dHVyZUZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG5cclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy53YWxsRml4dHVyZUZvcm0gOiB0aGlzLmZsb29yUGFuZWxGaXh0dXJlRm9ybVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoJ2JvZHkuc2hlbGYnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFuZWxBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldCgncGFuZWwnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQcm9kdWN0Q2FwYWNpdHkoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJyA/IHRoaXMuc2hlbGZBcnJheSA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4gZm9ybUFycmF5LmNvbnRyb2xzLnJlZHVjZSgodG90YWwsIGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSc7XHJcbiAgICAgIGNvbnN0IHJvd3MgPSBpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUgfHwgMTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBmaXh0dXJlIGlzIGEgZmxvb3IgcGFuZWwgb3IgdHJheSwgd2UgbmVlZCB0byBtdWx0aXBseSB0aGUgcHJvZHVjdCBjYXBhY2l0eSBieSB0aGUgbnVtYmVyIG9mIHJvd3NcclxuICAgICAgcmV0dXJuIHRvdGFsICsgKGlzVHJheSB8fCB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnZmxvb3InID8gY291bnQgKiByb3dzIDogY291bnQpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBpbml0V2FsbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBoZWFkZXI6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGhlaWdodDogW3RoaXMuZml4dHVyZURldGFpbHM/LmhlYWRlcj8uaGVpZ2h0Py52YWx1ZSA/PyAzMDAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dXHJcbiAgICAgIH0pLFxyXG4gICAgICBib2R5OiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBzaGVsZjogdGhpcy5mYi5hcnJheShbXSlcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXV1cclxuICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRTaGVsZihzKSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkU2hlbGYoKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnkgPSB2YWx1ZTtcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLmZsb29yUGFuZWxGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIHBhbmVsOiB0aGlzLmZiLmFycmF5KFtdKVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8uZm9yRWFjaChzID0+IHRoaXMuYWRkUGFuZWwocykpXHJcblxyXG4gICAgdGhpcy5mbG9vclBhbmVsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGZpeHR1cmVDYXRlZ29yeTogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVDYXRlZ29yeSB8fCAnVW50aXRsZWQnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgd2lkdGg6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXV0sXHJcbiAgICAgIGxlbmd0aDogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlID8/IDEyLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV1dXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnKSB7XHJcbiAgICBjb25zdCBzaGVsZkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFtzaGVsZj8uc2hlbGZUeXBlIHx8ICdzaGVsZicsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwcm9kdWN0Q2FwYWNpdHk6IFtzaGVsZj8ucHJvZHVjdFBlclNoZWxmID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dLFxyXG4gICAgICBub09mUm93czogW3NoZWxmPy50cmF5Um93cyA/PyAxXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXR1cFNoZWxmVHlwZUxpc3RlbmVyKHNoZWxmR3JvdXApO1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnB1c2goc2hlbGZHcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyAgd2UgbmVlZCB0byBzZXR1cCBhIGxpc3RlbmVyIHRvIHRoZSB0eXBlIG9mIHRoZSBzaGVsZiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgbm9PZlJvd3MgZmllbGRcclxuICBzZXR1cFNoZWxmVHlwZUxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCkge1xyXG4gICAgc2hlbGZHcm91cC5nZXQoJ3R5cGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0eXBlID0+IHtcclxuICAgICAgY29uc3Qgbm9PZlJvd3NDb250cm9sID0gc2hlbGZHcm91cC5nZXQoJ25vT2ZSb3dzJyk7XHJcbiAgICAgIGlmICh0eXBlID09PSAndHJheScpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZSgxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgbm9PZlJvd3NDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBzaGVsZiBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVNoZWxmKGluZGV4OiBudW1iZXIgPSB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIGFkZFBhbmVsKHBhbmVsPzogRml4dHVyZUxpYnJhcnlTaGVsZkNvbmZpZykge1xyXG4gICAgY29uc3QgcGFuZWxHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwYW5lbE5hbWU6IFtwYW5lbD8ubGFiZWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3BhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXV0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbcGFuZWw/LnRyYXlSb3dzID8/IDUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV1dXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucHVzaChwYW5lbEdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBwYW5lbCBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVBhbmVsKGluZGV4OiBudW1iZXIgPSB0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgdGhpcy5wYW5lbEFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogJ2hlYWRlcicgfCAnYm9keScgfCAnZm9vdGVyJykge1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uKTtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbjogJ2hlYWRlcicgfCAnYm9keScgfCAnZm9vdGVyJykge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSBmb3JtLmdldChzZWN0aW9uKTtcclxuICAgIGlmIChncm91cCkge1xyXG4gICAgICBncm91cC5lbmFibGVkID8gZ3JvdXAuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBncm91cC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIHN3aXRjaCAoc2VjdGlvbikge1xyXG4gICAgICBjYXNlICdoZWFkZXInOlxyXG4gICAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gIXRoaXMuaXNIZWFkZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSAhdGhpcy5pc0JvZHlFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdmb290ZXInOlxyXG4gICAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gIXRoaXMuaXNGb290ZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwRm9ybVRvQXBpKGZvcm06IEZvcm1Hcm91cCwgc3RhdHVzOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybS52YWx1ZTtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJyA/IHRoaXMuc2hlbGZBcnJheSA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBcInN0YXR1c1wiOiBzdGF0dXMsXHJcbiAgICAgIFwiZml4dHVyZUNhdGVnb3J5XCI6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBcImZpeHR1cmVDYXBhY2l0eVwiOiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBcImZpeHR1cmVMZW5ndGhcIjoge1xyXG4gICAgICAgIFwidmFsdWVcIjogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgXCJ1bml0XCI6IFwiZnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImZpeHR1cmVXaWR0aFwiOiB7XHJcbiAgICAgICAgXCJ2YWx1ZVwiOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIFwidW5pdFwiOiBcImZ0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJoZWFkZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdoZWFkZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJmb290ZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdmb290ZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJpc0JvZHlFbmFibGVkXCI6ICFmb3JtLmdldCgnYm9keScpPy5kaXNhYmxlZCxcclxuICAgICAgXCJzaGVsZkNvbmZpZ1wiOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gJ3RyYXknLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRm9ybShmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChrZXkpO1xyXG5cclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZUZvcm0oY29udHJvbCkpIHtcclxuICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAnd2lkdGgnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnT3ZlcmFsbCB3aWR0aCBjYW5ub3QgYmUgemVybycpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdsZW5ndGgnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnT3ZlcmFsbCBsZW5ndGggY2Fubm90IGJlIHplcm8nKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZml4dHVyZUNhdGVnb3J5JyAmJiBjb250cm9sLmVycm9ycz8uWydyZXF1aXJlZCddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRml4dHVyZSBjYXRlZ29yeSBpcyByZXF1aXJlZCcpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoZWlnaHQnICYmIGNvbnRyb2wuZXJyb3JzPy5bJ21pbiddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnSGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHJvZHVjdENhcGFjaXR5JyAmJiBjb250cm9sLmVycm9ycz8uWydtaW4nXSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1Byb2R1Y3QgY2FwYWNpdHkgbXVzdCBiZSBhdCBsZWFzdCAxJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXJyb3JzPy5bJ3JlcXVpcmVkJ10pIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGAke2tleX0gaXMgcmVxdWlyZWRgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0oZm9ybSkpIHtcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMubWFwRm9ybVRvQXBpKGZvcm0sIHN0YXR1cyk7XHJcblxyXG4gICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UudXBkYXRlRml4dHVyZUxpYnJhcnkodHJhbnNmb3JtZWREYXRhLCB0aGlzLmZpeHR1cmVEZXRhaWxzPy5faWQhKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5zdGF0dXMgPSBzdGF0dXNcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPz8gXCJGYWlsZWQgdG8gc2F2ZSBGaXh0dXJlIGRldGFpbHNcIik7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBjb25maXJtQ29tcGxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnQ29tcGxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdGaXh0dXJlIGlzIG5vdyByZWFkeSBhbmQgYXZhaWxhYmxlIHRvIGNyZWF0ZSBhcyB0ZW1wbGF0ZS4nO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2Uubm90ZSA9ICdZb3UgY2FuXFwndCBlZGl0IGl0IG9uY2UgYXNzaWduZWQgdG8gdGhlIHRlbXBsYXRlLic7XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPGJvb2xlYW4+KChyZXN1bHQpID0+IHJlc3VsdCA9PT0gJ29rJyk7XHJcbiAgfVxyXG5cclxuICBvbkR1cGxpY2F0ZSgpIHtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kdXBsaWNhdGVGaXh0dXJlTGlicmFyeSh7XHJcbiAgICAgIGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWRcclxuICAgIH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2NyZWF0ZS1saWJyYXJ5LWZpeHR1cmUnXSwgeyBxdWVyeVBhcmFtczogeyBmaXh0dXJlSWQ6IHJlcz8uZGF0YT8uaWQgfSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gZHVwbGljYXRlIEZpeHR1cmUnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZHVwbGljYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZml4dHVyZSA/JztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGUoKSB7XHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kZWxldGVGaXh0dXJlTGlicmFyeSh7IGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBkZWxldGUgRml4dHVyZScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuZmxvb3JQYW5lbEZpeHR1cmVGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdoZWFkZXInKVxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdmb290ZXInKVxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oJ2JvZHknKVxyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRWRpdDogdHJ1ZSB9LFxyXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59IiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGgyIGNsYXNzPVwibS0wXCI+XHJcbiAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5IH19IC0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgIH19e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICA8L2gyPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgZHJhZnRcIj57eyBmaXh0dXJlRGV0YWlscy5zdGF0dXMgfCB0aXRsZWNhc2UgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPHAgY2xhc3M9XCJtLTBcIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzPy51cGRhdGVkQXRcIiBbbmdiVG9vbHRpcF09XCJmaXh0dXJlRGV0YWlscy51cGRhdGVkQXQgfCBkYXRlIDogJ21lZGl1bSdcIj5cclxuICAgICAgICBMYXN0IHVwZGF0ZToge3sgZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgdGltZUFnbyB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICBbbmdiVG9vbHRpcF09XCInQ2Fubm90IEVkaXQuIEZpeHR1cmUgdXNlZCBpbiAnICsgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCArICcgVGVtcGxhdGVzJ1wiXHJcbiAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cIiEoZml4dHVyZURldGFpbHMuc3RhdHVzID09PSAnYWN0aXZlJyB8fCBmaXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9PT0gJ2FjdGl2ZScgfHwgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTMyMl81MzI1KVwiPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzEzMjJfNTMyNVwiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIEVkaXRcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0TW9kZVwiIGNsYXNzPVwiZC1mbGV4IGdhcC01IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgbmdiVG9vbHRpcD1cIkFjdGlvbiB1bmF2YWlsYWJsZS4gVGhpcyBGaXh0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkLlwiXHJcbiAgICAgICAgICBbZGlzYWJsZVRvb2x0aXBdPVwiIShmaXh0dXJlRGV0YWlscy5zdGF0dXMgPT09ICdpbmFjdGl2ZScpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaXh0dXJlRGV0YWlscy5zdGF0dXMgPT09ICdpbmFjdGl2ZSdcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBTYXZlIGFzIGRyYWZ0XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG5cclxuICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICBbbmdiVG9vbHRpcF09XCInQ2Fubm90IEVkaXQuIEZpeHR1cmUgdXNlZCBpbiAnICsgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCArICcgVGVtcGxhdGVzJ1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlVG9vbHRpcF09XCIhKGZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9PT0gJ2FjdGl2ZScgfHwgZml4dHVyZURldGFpbHMudGVtcGxhdGVJZClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJmaXh0dXJlRGV0YWlscy5zdGF0dXMgPT09ICdhY3RpdmUnIHx8IGZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgRGVsZXRlXHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBXYWxsIHR5cGUgZml4dHVyZSBjcmVhdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwicm93IGdhcC00IGJ1aWxkZXJcIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgIDwhLS0gV2FsbCBGaXh0dXJlIEZvcm0gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aDI+Rml4dHVyZSBEZXRhaWxzPC9oMj5cclxuICAgICAgICA8cD5Db25maWd1cmUgeW91ciBmaXh0dXJlIGRldGFpbHMgaGVyZTwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIndhbGxGaXh0dXJlRm9ybVwiPlxyXG4gICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8IS0tIEJhc2ljIERldGFpbHMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpeHR1cmVDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+Rml4dHVyZSBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJPdmVyYWxsIHdpZHRoIChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBoZWlnaHQgKFwiICsgKHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+SEVBREVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiaGVhZGVyXCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0hlYWRlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKHRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNCb2R5RW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignYm9keScpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CT0RZPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImJvZHlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzQm9keUVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZS1jb3VudGVyXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU2hlbGYoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjE1Mzg5IDIuOTE2NVYxMS4wODMyTTMuMDcwNTYgNi45OTk4NEgxMS4yMzcyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGZBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2hlbGYgb2Ygc2hlbGZBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzaGVsZi10aXRsZVwiPlNoZWxmIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNoZWxmKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwic2hlbGZUeXBlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgPT09ICd0cmF5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MCVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBdPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+UHJvZHVjdCBjYXBhY2l0eSBmb3IgZWFjaCByb3c8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdENhcGFjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRm9vdGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignZm9vdGVyJylcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkZPT1RFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImZvb3RlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNGb290ZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiSGVpZ2h0IChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJoZWlnaHRcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gV2FsbCBGaXh0dXJlIFByZXZpZXcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2wtOFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnQgdy0xMDBcIj5cclxuICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1ibG9ja1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgPHA+SEVBREVSPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQm9keSBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cImlzQm9keUVuYWJsZWQgJiYgc2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMCBnYXAtNVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNoZWxmQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICBAaWYoaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19IDxiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ25vT2ZSb3dzJyk/LnZhbHVlKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19IDxiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlciBmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCBoLTEwMCBnYXAtMyB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHN1Yi1mb290ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgIDxwPkZPT1RFUjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHgge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+VGhlIHNldHRpbmdzIGFyZSBwcmUtY29uZmlndXJlZCBhbmQgY2Fubm90IGJlIGVkaXRlZDwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZsb29yUGFuZWxGaXh0dXJlRm9ybVwiPlxyXG4gICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb24gI2FjY29yZGlvbj1cIm5nYkFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8IS0tIEJhc2ljIERldGFpbHMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpeHR1cmVDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+Rml4dHVyZSBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJPdmVyYWxsIHdpZHRoIChcIiArICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBsZW5ndGggKFwiICsgKHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gUGFuZWwgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwicGFuZWxcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+UEFORUw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2YgcGFuZWxzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUGFuZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNSAxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRQYW5lbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTUzODkgMi45MTY1VjExLjA4MzJNMy4wNzA1NiA2Ljk5OTg0SDExLjIzNzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYW5lbEFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhbmVsIG9mIHBhbmVsQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzaGVsZi10aXRsZVwiPlBhbmVsIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVQYW5lbChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzk4QTJCM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwYW5lbE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJwYW5lbE5hbWVcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1mb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MCVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZsb29yIFBhbmVsIFByZXZpZXcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2wtOFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxvb3ItcGFuZWwtdmlld3BvcnQgdy0xMDBcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhbmVsQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHctMTAwIGdhcC01XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICA+e3sgZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fTwvc3BhblxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInBhbmVsIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICBQQU5FTCB7eyBpICsgMSB9fSA8Yj5Qcm9kdWN0czoge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlICogKGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlID8/IDEpIH19PC9iPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjUzMFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCA1MzAgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTUyMi42NTMgMC4yOTI4OTNDNTIyLjI2MyAtMC4wOTc2MzE1IDUyMS42MyAtMC4wOTc2MzE0IDUyMS4yMzkgMC4yOTI4OTNMNTE0Ljg3NSA2LjY1Njg1QzUxNC40ODUgNy4wNDczOCA1MTQuNDg1IDcuNjgwNTQgNTE0Ljg3NSA4LjA3MTA3QzUxNS4yNjYgOC40NjE1OSA1MTUuODk5IDguNDYxNTkgNTE2LjI4OSA4LjA3MTA3TDUyMS45NDYgMi40MTQyMUw1MjcuNjAzIDguMDcxMDdDNTI3Ljk5NCA4LjQ2MTU5IDUyOC42MjcgOC40NjE1OSA1MjkuMDE3IDguMDcxMDdDNTI5LjQwOCA3LjY4MDU0IDUyOS40MDggNy4wNDczOCA1MjkuMDE3IDYuNjU2ODVMNTIyLjY1MyAwLjI5Mjg5M1pNNTIyLjk0NiAxNEw1MjIuOTQ2IDFMNTIwLjk0NiAxTDUyMC45NDYgMTRMNTIyLjk0NiAxNFpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTM5NC4xNTMgMC4yOTI4OTNDMzkzLjc2MyAtMC4wOTc2MzE1IDM5My4xMyAtMC4wOTc2MzE0IDM5Mi43MzkgMC4yOTI4OTNMMzg2LjM3NSA2LjY1Njg1QzM4NS45ODUgNy4wNDczOCAzODUuOTg1IDcuNjgwNTQgMzg2LjM3NSA4LjA3MTA3QzM4Ni43NjYgOC40NjE1OSAzODcuMzk5IDguNDYxNTkgMzg3Ljc4OSA4LjA3MTA3TDM5My40NDYgMi40MTQyMUwzOTkuMTAzIDguMDcxMDdDMzk5LjQ5NCA4LjQ2MTU5IDQwMC4xMjcgOC40NjE1OSA0MDAuNTE3IDguMDcxMDdDNDAwLjkwOCA3LjY4MDU0IDQwMC45MDggNy4wNDczOCA0MDAuNTE3IDYuNjU2ODVMMzk0LjE1MyAwLjI5Mjg5M1pNMzk0LjQ0NiAxNEwzOTQuNDQ2IDFMMzkyLjQ0NiAxTDM5Mi40NDYgMTRMMzk0LjQ0NiAxNFpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTI2NS42NTMgMC4yOTI4OTNDMjY1LjI2MyAtMC4wOTc2MzE1IDI2NC42MyAtMC4wOTc2MzE0IDI2NC4yMzkgMC4yOTI4OTNMMjU3Ljg3NSA2LjY1Njg1QzI1Ny40ODUgNy4wNDczOCAyNTcuNDg1IDcuNjgwNTQgMjU3Ljg3NSA4LjA3MTA3QzI1OC4yNjYgOC40NjE1OSAyNTguODk5IDguNDYxNTkgMjU5LjI4OSA4LjA3MTA3TDI2NC45NDYgMi40MTQyMUwyNzAuNjAzIDguMDcxMDdDMjcwLjk5NCA4LjQ2MTU5IDI3MS42MjcgOC40NjE1OSAyNzIuMDE3IDguMDcxMDdDMjcyLjQwOCA3LjY4MDU0IDI3Mi40MDggNy4wNDczOCAyNzIuMDE3IDYuNjU2ODVMMjY1LjY1MyAwLjI5Mjg5M1pNMjY1Ljk0NiAxNEwyNjUuOTQ2IDFMMjYzLjk0NiAxTDI2My45NDYgMTRMMjY1Ljk0NiAxNFpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTEzNy4xNTMgMC4yOTI4OTNDMTM2Ljc2MyAtMC4wOTc2MzE1IDEzNi4xMyAtMC4wOTc2MzE0IDEzNS43MzkgMC4yOTI4OTNMMTI5LjM3NSA2LjY1Njg1QzEyOC45ODUgNy4wNDczOCAxMjguOTg1IDcuNjgwNTQgMTI5LjM3NSA4LjA3MTA3QzEyOS43NjYgOC40NjE1OSAxMzAuMzk5IDguNDYxNTkgMTMwLjc4OSA4LjA3MTA3TDEzNi40NDYgMi40MTQyMUwxNDIuMTAzIDguMDcxMDdDMTQyLjQ5NCA4LjQ2MTU5IDE0My4xMjcgOC40NjE1OSAxNDMuNTE3IDguMDcxMDdDMTQzLjkwOCA3LjY4MDU0IDE0My45MDggNy4wNDczOCAxNDMuNTE3IDYuNjU2ODVMMTM3LjE1MyAwLjI5Mjg5M1pNMTM3LjQ0NiAxNEwxMzcuNDQ2IDFMMTM1LjQ0NiAxTDEzNS40NDYgMTRMMTM3LjQ0NiAxNFpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTguNjUzNCAwLjI5Mjg5M0M4LjI2Mjg3IC0wLjA5NzYzMTUgNy42Mjk3MSAtMC4wOTc2MzE0IDcuMjM5MTggMC4yOTI4OTNMMC44NzUyMjEgNi42NTY4NUMwLjQ4NDY5NyA3LjA0NzM4IDAuNDg0Njk3IDcuNjgwNTQgMC44NzUyMjEgOC4wNzEwN0MxLjI2NTc1IDguNDYxNTkgMS44OTg5MSA4LjQ2MTU5IDIuMjg5NDMgOC4wNzEwN0w3Ljk0NjI5IDIuNDE0MjFMMTMuNjAzMSA4LjA3MTA3QzEzLjk5MzcgOC40NjE1OSAxNC42MjY4IDguNDYxNTkgMTUuMDE3NCA4LjA3MTA3QzE1LjQwNzkgNy42ODA1NCAxNS40MDc5IDcuMDQ3MzggMTUuMDE3NCA2LjY1Njg1TDguNjUzNCAwLjI5Mjg5M1pNOC45NDYyOSAxNEw4Ljk0NjI5IDFMNi45NDYyOSAxTDYuOTQ2MjkgMTRMOC45NDYyOSAxNFpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCI1N1wiIGhlaWdodD1cIjQzXCIgdmlld0JveD1cIjAgMCA1NyA0M1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyOC40NDA4XCIgY3k9XCIxNi41NzE0XCIgcj1cIjE1LjA3MTRcIiBmaWxsPVwiIzFEMjkzOVwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yUGFuZWxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHhcclxuICAgICAgICAgICAge3sgZmxvb3JQYW5lbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgPHA+T3ZlcmFsbCBEaW1lbnNpb248L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwiYnVpbGQtZml4dHVyZS1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|