tango-app-ui-store-builder 1.2.16 → 1.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +18 -7
  2. package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +4 -3
  3. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +5 -4
  4. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +4 -3
  5. package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +4 -3
  6. package/esm2022/lib/components/plano-tools/delete-task/delete-task.component.mjs +4 -3
  7. package/esm2022/lib/components/plano-tools/layout-touchup/layout-touchup.component.mjs +134 -0
  8. package/esm2022/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.mjs +5103 -0
  9. package/esm2022/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.mjs +4 -3
  10. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +4 -3
  11. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +4 -3
  12. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +4 -3
  13. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +4 -3
  14. package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +4 -3
  15. package/esm2022/lib/components/plano-tools/tool-page-header/tool-page-header.component.mjs +22 -0
  16. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +27 -8
  17. package/esm2022/lib/services/store-builder.service.mjs +10 -1
  18. package/esm2022/lib/tango-store-builder-routing.module.mjs +25 -55
  19. package/esm2022/lib/tango-store-builder.module.mjs +10 -1
  20. package/fesm2022/tango-app-ui-store-builder.mjs +5620 -390
  21. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  22. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
  23. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  24. package/lib/components/plano-configurations/plano-configurations.component.d.ts +9 -1
  25. package/lib/components/plano-tools/layout-touchup/layout-touchup.component.d.ts +50 -0
  26. package/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.d.ts +331 -0
  27. package/lib/components/plano-tools/tool-page-header/tool-page-header.component.d.ts +8 -0
  28. package/lib/components/plano-tools/tools-parent/tools-parent.component.d.ts +4 -2
  29. package/lib/services/store-builder.service.d.ts +10 -0
  30. package/lib/tango-store-builder.module.d.ts +61 -58
  31. package/package.json +1 -1
@@ -8,7 +8,8 @@ import * as i3 from "tango-app-ui-global";
8
8
  import * as i4 from "../../services/store-builder.service";
9
9
  import * as i5 from "tango-app-ui-shared";
10
10
  import * as i6 from "@ng-bootstrap/ng-bootstrap";
11
- import * as i7 from "@angular/common";
11
+ import * as i7 from "@angular/router";
12
+ import * as i8 from "@angular/common";
12
13
  export class PlanoConfigurationsComponent {
13
14
  fb;
14
15
  dataService;
@@ -18,6 +19,7 @@ export class PlanoConfigurationsComponent {
18
19
  modelService;
19
20
  cd;
20
21
  pageInfo;
22
+ router;
21
23
  formRef;
22
24
  brandMetaRef;
23
25
  selectedTab = "brand";
@@ -31,7 +33,7 @@ export class PlanoConfigurationsComponent {
31
33
  brandMetaList = [];
32
34
  isBrandMetaEdit = true;
33
35
  brandMetaSearch = "";
34
- constructor(fb, dataService, gs, builderService, toast, modelService, cd, pageInfo) {
36
+ constructor(fb, dataService, gs, builderService, toast, modelService, cd, pageInfo, router) {
35
37
  this.fb = fb;
36
38
  this.dataService = dataService;
37
39
  this.gs = gs;
@@ -40,6 +42,15 @@ export class PlanoConfigurationsComponent {
40
42
  this.modelService = modelService;
41
43
  this.cd = cd;
42
44
  this.pageInfo = pageInfo;
45
+ this.router = router;
46
+ }
47
+ /**
48
+ * Hidden entry point to the internal plano-tools page.
49
+ * Triggered from an invisible 1×1 hit-area below the config side card —
50
+ * for ops/devs who know it's there. Not discoverable in the UI.
51
+ */
52
+ goToPlanoTools() {
53
+ this.router.navigateByUrl("/manage/planogram/plano-tools");
43
54
  }
44
55
  async ngOnInit() {
45
56
  this.setPageData();
@@ -419,17 +430,17 @@ export class PlanoConfigurationsComponent {
419
430
  get filteredBrandMetaCount() {
420
431
  return this.brandMetaData.controls.filter((c) => this.matchesBrandMetaSearch(c)).length;
421
432
  }
422
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlanoConfigurationsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PlanoDataService }, { token: i3.GlobalStateService }, { token: i4.StoreBuilderService }, { token: i5.ToastService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: i3.PageInfoService }], target: i0.ɵɵFactoryTarget.Component });
423
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PlanoConfigurationsComponent, selector: "lib-plano-configurations", viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "brandMetaRef", first: true, predicate: ["brandMetaRef"], descendants: true }], ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"col-md-3 planoConfig\">\r\n <div class=\"s-card\">\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brand' ? 'active' : ''\" (click)=\"selectedTab ='brand';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M14.1755 4.22225C14.1766 2.99445 11.6731 2 8.58832 2C5.50357 2 3.00224 2.99557 3 4.22225M3 4.22225C3 5.45004 5.50133 6.44449 8.58832 6.44449C11.6753 6.44449 14.1766 5.45004 14.1766 4.22225L14.1766 12.8445M3 4.22225V17.5556C3.00112 18.7834 5.50245 19.7779 8.58832 19.7779C10.0849 19.7779 11.4361 19.5412 12.4387 19.1601M3.00112 8.66672C3.00112 9.89451 5.50245 10.889 8.58944 10.889C11.6764 10.889 14.1778 9.89451 14.1778 8.66672M12.5057 14.6946C11.4976 15.0891 10.115 15.3335 8.58832 15.3335C5.50245 15.3335 3.00112 14.3391 3.00112 13.1113M20.5272 13.4646C22.4909 15.4169 22.4909 18.5836 20.5272 20.5358C18.5635 22.4881 15.3781 22.4881 13.4144 20.5358C11.4507 18.5836 11.4507 15.4169 13.4144 13.4646C15.3781 11.5124 18.5635 11.5124 20.5272 13.4646Z\" [attr.stroke]=\"selectedTab === 'brand' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand and Product Mapping\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'task' ? 'active' : ''\" (click)=\"selectedTab ='task';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1775_37931)\">\r\n <path d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37931\">\r\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Task Configuration\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brandMeta' ? 'active' : ''\" (click)=\"selectedTab='brandMeta';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 7.5L12 3L21 7.5M3 7.5L12 12M3 7.5V16.5L12 21M21 7.5L12 12M21 7.5V16.5L12 21M12 12V21\" [attr.stroke]=\"selectedTab === 'brandMeta' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand Meta Data\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9\" id=\"config\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 <div class=\"m-card\" *ngIf=\"!loading\">\r\n <div *ngIf=\"selectedTab === 'brand'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Brand and product information</h3>\r\n <p>Define the brand and map products to their respective categories.</p>\r\n </div>\r\n <div>\r\n <!-- <button type=\"button\" class=\"btn btn-outline\" (click)=\"bulkUpload()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button> -->\r\n </div>\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"form\" class=\"mt-10\" #formRef>\r\n <div formArrayName=\"brandConfig\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Brand</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Category</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Sub-Category</div>\r\n </div>\r\n </div>\r\n <div style=\"height:calc(75vh - 250px);overflow-y:Scroll\">\r\n <div *ngFor=\"let brandGroup of brandConfig?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100\" [id]=\"'text'+i\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('brand')?.hasError('required') ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"category\">\r\n <div class=\"input-container form-control\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('category')?.hasError('required') ? 'danger' : ''\">\r\n <ng-container *ngFor=\"let item of getCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' :removeCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? 'disabledText':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addCategory($event,i)\" [id]=\"'categoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"subCategory\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let item of getSubCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' : removeSubCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? '':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addSubCategory($event,i)\" [id]=\"'subCategoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\" (click)=\"checkUsed(i) || isEdit ? '' : removeBrand(i)\" *ngIf=\"brandConfig.value.length > 1\" [ngClass]=\"checkUsed(i) || isEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrand()\" [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;formEnable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateBrand()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'brandMeta'\">\r\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Brand Meta Data</h3>\r\n <p class=\"mb-0\">Maintain the Pid Cat &#8594; Brand / Category / Band mapping used during planogram export.</p>\r\n </div>\r\n <div style=\"width:360px;flex-shrink:0\">\r\n <div class=\"position-relative\">\r\n <span class=\"position-absolute\" style=\"left:12px;top:50%;transform:translateY(-50%)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control\" style=\"padding-left:38px\" placeholder=\"Search Pid Cat, Temp Group, Category, Brand or Band\" [(ngModel)]=\"brandMetaSearch\" [ngModelOptions]=\"{standalone: true}\"/>\r\n </div>\r\n <div class=\"text-end mt-1\" *ngIf=\"brandMetaData?.controls?.length\">\r\n <small class=\"text-muted\">{{ filteredBrandMetaCount }} of {{ brandMetaData.controls.length }} row(s)</small>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container>\r\n <form [formGroup]=\"brandMetaForm\" class=\"mt-3\" #brandMetaRef>\r\n <div formArrayName=\"brandMetaData\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Pid Cat</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Temp Group</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Category</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Brand</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Band</div></div>\r\n </div>\r\n <div style=\"height:calc(75vh - 280px);overflow-y:scroll\">\r\n <div *ngIf=\"!brandMetaData?.controls?.length\" class=\"text-center p-5 text-muted\">\r\n No brand meta data found. Click \"Edit\" then \"Add\" to create a row.\r\n </div>\r\n <div *ngIf=\"brandMetaData?.controls?.length && !filteredBrandMetaCount\" class=\"text-center p-5 text-muted\">\r\n No rows match \"{{ brandMetaSearch }}\"\r\n </div>\r\n <div *ngFor=\"let metaGroup of brandMetaData?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\" [id]=\"'metaRow' + i\" [hidden]=\"!matchesBrandMetaSearch(metaGroup)\">\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"pidCat\" [id]=\"'metaRow' + i + '-pidCat'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('pidCat')?.hasError('required') && metaGroup.get('pidCat')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"tempGroup\" [id]=\"'metaRow' + i + '-tempGroup'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('tempGroup')?.hasError('required') && metaGroup.get('tempGroup')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"category\" [id]=\"'metaRow' + i + '-category'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('category')?.hasError('required') && metaGroup.get('category')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [id]=\"'metaRow' + i + '-brand'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('brand')?.hasError('required') && metaGroup.get('brand')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2 d-flex\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"band\" [id]=\"'metaRow' + i + '-band'\"/>\r\n <div class=\"ms-3 mt-3\" (click)=\"isBrandMetaEdit ? '' : removeBrandMetaRow(i)\" [ngClass]=\"isBrandMetaEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrandMetaRow()\" [disabled]=\"isBrandMetaEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"!isBrandMetaEdit\" (click)=\"cancelBrandMetaEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-outline ms-2\" *ngIf=\"isBrandMetaEdit\" (click)=\"enableBrandMetaForm()\">\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_1775_37990)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37990\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary ms-2\" *ngIf=\"!isBrandMetaEdit\" (click)=\"updateBrandMetaData()\">Save</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'task'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Global configuration for tasks</h3>\r\n <p>The following configuration applies to all published tasks.</p>\r\n </div>\r\n <!-- <div>\r\n <button type=\"button\" class=\"btn btn-outline\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button>\r\n </div> -->\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"taskForm\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due days (to complete task)\r\n </label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"dueDay\"/>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due time\r\n </label>\r\n <input type=\"time\" class=\"form-control\" formControlName=\"dueTime\"/>\r\n </div>\r\n <div\r\n class=\"checklistturnoff ms-3 mt-4 fv-plugins-icon-containe col-md-8 divWidth\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input mt-3\" type=\"checkbox\"\r\n id=\"geoFencing\" [checked]=\"taskForm.get('allowedStoreLocation')?.value\" formControlName=\"allowedStoreLocation\">\r\n <label class=\"form-check-label sub\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">Geo\r\n fencing\r\n </label><br>\r\n <label class=\"form-check-label subtext\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">By\r\n enabling, the checklist can be filled by the user only when\r\n inside the store.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;taskForm.enable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateTask()\">\r\n Save\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".s-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;overflow-y:auto}.m-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;max-height:75vh;overflow-y:auto}.planoConfig{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}::ng-deep .planoConfig .active,.active .configText{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.configText{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.chip-box{position:relative}.chip-box .form-control{padding-top:0;padding-bottom:0}.chip-box .input-container{min-height:auto;max-height:100px!important;overflow:auto;width:100%;display:flex;flex-wrap:wrap}.chip-box .input-container input{all:unset;flex:1;min-width:50px}.chip-box .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.chip-box .input-container .chip:nth-child(1){margin-left:0}.checklistturnoff{border-radius:8px;border:1px solid var(--gray-200, #EAECF0);background:var(--white, #FFF);display:flex;padding:16px;align-items:flex-start;align-self:stretch}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subText{color:var(--gray-700, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.sub.active,.subtext.active{color:var(--Primary-800, #008EDF)!important}.divWidth{width:65%}.brandCat{width:30%;margin-left:1%}.danger{border:1px solid red!important}.danger-flash{animation:danger-flash 1.4s ease-out}@keyframes danger-flash{0%{background-color:#fee4e2;box-shadow:0 0 0 3px #f0443859}to{background-color:transparent;box-shadow:0 0 #f0443800}}.disabledText{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }] });
433
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlanoConfigurationsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PlanoDataService }, { token: i3.GlobalStateService }, { token: i4.StoreBuilderService }, { token: i5.ToastService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: i3.PageInfoService }, { token: i7.Router }], target: i0.ɵɵFactoryTarget.Component });
434
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PlanoConfigurationsComponent, selector: "lib-plano-configurations", viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "brandMetaRef", first: true, predicate: ["brandMetaRef"], descendants: true }], ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"col-md-3 planoConfig\">\r\n <!-- Hidden plano-tools entry. Sized 120\u00D740 px, transparent \u2014 invisible\r\n to regular users but reachable by ops/devs who know the spot.\r\n Placed at the bottom-left, below the config side card. -->\r\n <button\r\n type=\"button\"\r\n aria-label=\"Open plano tools\"\r\n tabindex=\"-1\"\r\n class=\"plano-tools-hidden-entry\"\r\n (click)=\"goToPlanoTools()\"></button>\r\n <div class=\"s-card\">\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brand' ? 'active' : ''\" (click)=\"selectedTab ='brand';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M14.1755 4.22225C14.1766 2.99445 11.6731 2 8.58832 2C5.50357 2 3.00224 2.99557 3 4.22225M3 4.22225C3 5.45004 5.50133 6.44449 8.58832 6.44449C11.6753 6.44449 14.1766 5.45004 14.1766 4.22225L14.1766 12.8445M3 4.22225V17.5556C3.00112 18.7834 5.50245 19.7779 8.58832 19.7779C10.0849 19.7779 11.4361 19.5412 12.4387 19.1601M3.00112 8.66672C3.00112 9.89451 5.50245 10.889 8.58944 10.889C11.6764 10.889 14.1778 9.89451 14.1778 8.66672M12.5057 14.6946C11.4976 15.0891 10.115 15.3335 8.58832 15.3335C5.50245 15.3335 3.00112 14.3391 3.00112 13.1113M20.5272 13.4646C22.4909 15.4169 22.4909 18.5836 20.5272 20.5358C18.5635 22.4881 15.3781 22.4881 13.4144 20.5358C11.4507 18.5836 11.4507 15.4169 13.4144 13.4646C15.3781 11.5124 18.5635 11.5124 20.5272 13.4646Z\" [attr.stroke]=\"selectedTab === 'brand' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand and Product Mapping\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'task' ? 'active' : ''\" (click)=\"selectedTab ='task';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1775_37931)\">\r\n <path d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37931\">\r\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Task Configuration\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brandMeta' ? 'active' : ''\" (click)=\"selectedTab='brandMeta';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 7.5L12 3L21 7.5M3 7.5L12 12M3 7.5V16.5L12 21M21 7.5L12 12M21 7.5V16.5L12 21M12 12V21\" [attr.stroke]=\"selectedTab === 'brandMeta' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand Meta Data\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9\" id=\"config\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 <div class=\"m-card\" *ngIf=\"!loading\">\r\n <div *ngIf=\"selectedTab === 'brand'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Brand and product information</h3>\r\n <p>Define the brand and map products to their respective categories.</p>\r\n </div>\r\n <div>\r\n <!-- <button type=\"button\" class=\"btn btn-outline\" (click)=\"bulkUpload()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button> -->\r\n </div>\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"form\" class=\"mt-10\" #formRef>\r\n <div formArrayName=\"brandConfig\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Brand</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Category</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Sub-Category</div>\r\n </div>\r\n </div>\r\n <div style=\"height:calc(75vh - 250px);overflow-y:Scroll\">\r\n <div *ngFor=\"let brandGroup of brandConfig?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100\" [id]=\"'text'+i\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('brand')?.hasError('required') ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"category\">\r\n <div class=\"input-container form-control\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('category')?.hasError('required') ? 'danger' : ''\">\r\n <ng-container *ngFor=\"let item of getCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' :removeCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? 'disabledText':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addCategory($event,i)\" [id]=\"'categoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"subCategory\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let item of getSubCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' : removeSubCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? '':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addSubCategory($event,i)\" [id]=\"'subCategoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\" (click)=\"checkUsed(i) || isEdit ? '' : removeBrand(i)\" *ngIf=\"brandConfig.value.length > 1\" [ngClass]=\"checkUsed(i) || isEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrand()\" [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;formEnable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateBrand()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'brandMeta'\">\r\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Brand Meta Data</h3>\r\n <p class=\"mb-0\">Maintain the Pid Cat &#8594; Brand / Category / Band mapping used during planogram export.</p>\r\n </div>\r\n <div style=\"width:360px;flex-shrink:0\">\r\n <div class=\"position-relative\">\r\n <span class=\"position-absolute\" style=\"left:12px;top:50%;transform:translateY(-50%)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control\" style=\"padding-left:38px\" placeholder=\"Search Pid Cat, Temp Group, Category, Brand or Band\" [(ngModel)]=\"brandMetaSearch\" [ngModelOptions]=\"{standalone: true}\"/>\r\n </div>\r\n <div class=\"text-end mt-1\" *ngIf=\"brandMetaData?.controls?.length\">\r\n <small class=\"text-muted\">{{ filteredBrandMetaCount }} of {{ brandMetaData.controls.length }} row(s)</small>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container>\r\n <form [formGroup]=\"brandMetaForm\" class=\"mt-3\" #brandMetaRef>\r\n <div formArrayName=\"brandMetaData\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Pid Cat</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Temp Group</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Category</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Brand</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Band</div></div>\r\n </div>\r\n <div style=\"height:calc(75vh - 280px);overflow-y:scroll\">\r\n <div *ngIf=\"!brandMetaData?.controls?.length\" class=\"text-center p-5 text-muted\">\r\n No brand meta data found. Click \"Edit\" then \"Add\" to create a row.\r\n </div>\r\n <div *ngIf=\"brandMetaData?.controls?.length && !filteredBrandMetaCount\" class=\"text-center p-5 text-muted\">\r\n No rows match \"{{ brandMetaSearch }}\"\r\n </div>\r\n <div *ngFor=\"let metaGroup of brandMetaData?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\" [id]=\"'metaRow' + i\" [hidden]=\"!matchesBrandMetaSearch(metaGroup)\">\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"pidCat\" [id]=\"'metaRow' + i + '-pidCat'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('pidCat')?.hasError('required') && metaGroup.get('pidCat')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"tempGroup\" [id]=\"'metaRow' + i + '-tempGroup'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('tempGroup')?.hasError('required') && metaGroup.get('tempGroup')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"category\" [id]=\"'metaRow' + i + '-category'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('category')?.hasError('required') && metaGroup.get('category')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [id]=\"'metaRow' + i + '-brand'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('brand')?.hasError('required') && metaGroup.get('brand')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2 d-flex\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"band\" [id]=\"'metaRow' + i + '-band'\"/>\r\n <div class=\"ms-3 mt-3\" (click)=\"isBrandMetaEdit ? '' : removeBrandMetaRow(i)\" [ngClass]=\"isBrandMetaEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrandMetaRow()\" [disabled]=\"isBrandMetaEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"!isBrandMetaEdit\" (click)=\"cancelBrandMetaEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-outline ms-2\" *ngIf=\"isBrandMetaEdit\" (click)=\"enableBrandMetaForm()\">\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_1775_37990)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37990\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary ms-2\" *ngIf=\"!isBrandMetaEdit\" (click)=\"updateBrandMetaData()\">Save</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'task'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Global configuration for tasks</h3>\r\n <p>The following configuration applies to all published tasks.</p>\r\n </div>\r\n <!-- <div>\r\n <button type=\"button\" class=\"btn btn-outline\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button>\r\n </div> -->\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"taskForm\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due days (to complete task)\r\n </label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"dueDay\"/>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due time\r\n </label>\r\n <input type=\"time\" class=\"form-control\" formControlName=\"dueTime\"/>\r\n </div>\r\n <div\r\n class=\"checklistturnoff ms-3 mt-4 fv-plugins-icon-containe col-md-8 divWidth\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input mt-3\" type=\"checkbox\"\r\n id=\"geoFencing\" [checked]=\"taskForm.get('allowedStoreLocation')?.value\" formControlName=\"allowedStoreLocation\">\r\n <label class=\"form-check-label sub\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">Geo\r\n fencing\r\n </label><br>\r\n <label class=\"form-check-label subtext\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">By\r\n enabling, the checklist can be filled by the user only when\r\n inside the store.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;taskForm.enable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateTask()\">\r\n Save\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".s-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;overflow-y:auto}.planoConfig{position:relative}.plano-tools-hidden-entry{position:absolute;bottom:12px;left:16px;width:120px;height:40px;padding:0;border:none;outline:none;background:transparent;cursor:pointer;z-index:2}.plano-tools-hidden-entry:focus,.plano-tools-hidden-entry:active{outline:none;box-shadow:none}.m-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;max-height:75vh;overflow-y:auto}.planoConfig{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}::ng-deep .planoConfig .active,.active .configText{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.configText{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.chip-box{position:relative}.chip-box .form-control{padding-top:0;padding-bottom:0}.chip-box .input-container{min-height:auto;max-height:100px!important;overflow:auto;width:100%;display:flex;flex-wrap:wrap}.chip-box .input-container input{all:unset;flex:1;min-width:50px}.chip-box .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.chip-box .input-container .chip:nth-child(1){margin-left:0}.checklistturnoff{border-radius:8px;border:1px solid var(--gray-200, #EAECF0);background:var(--white, #FFF);display:flex;padding:16px;align-items:flex-start;align-self:stretch}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subText{color:var(--gray-700, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.sub.active,.subtext.active{color:var(--Primary-800, #008EDF)!important}.divWidth{width:65%}.brandCat{width:30%;margin-left:1%}.danger{border:1px solid red!important}.danger-flash{animation:danger-flash 1.4s ease-out}@keyframes danger-flash{0%{background-color:#fee4e2;box-shadow:0 0 0 3px #f0443859}to{background-color:transparent;box-shadow:0 0 #f0443800}}.disabledText{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }] });
424
435
  }
425
436
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PlanoConfigurationsComponent, decorators: [{
426
437
  type: Component,
427
- args: [{ selector: "lib-plano-configurations", template: "<div class=\"row\">\r\n <div class=\"col-md-3 planoConfig\">\r\n <div class=\"s-card\">\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brand' ? 'active' : ''\" (click)=\"selectedTab ='brand';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M14.1755 4.22225C14.1766 2.99445 11.6731 2 8.58832 2C5.50357 2 3.00224 2.99557 3 4.22225M3 4.22225C3 5.45004 5.50133 6.44449 8.58832 6.44449C11.6753 6.44449 14.1766 5.45004 14.1766 4.22225L14.1766 12.8445M3 4.22225V17.5556C3.00112 18.7834 5.50245 19.7779 8.58832 19.7779C10.0849 19.7779 11.4361 19.5412 12.4387 19.1601M3.00112 8.66672C3.00112 9.89451 5.50245 10.889 8.58944 10.889C11.6764 10.889 14.1778 9.89451 14.1778 8.66672M12.5057 14.6946C11.4976 15.0891 10.115 15.3335 8.58832 15.3335C5.50245 15.3335 3.00112 14.3391 3.00112 13.1113M20.5272 13.4646C22.4909 15.4169 22.4909 18.5836 20.5272 20.5358C18.5635 22.4881 15.3781 22.4881 13.4144 20.5358C11.4507 18.5836 11.4507 15.4169 13.4144 13.4646C15.3781 11.5124 18.5635 11.5124 20.5272 13.4646Z\" [attr.stroke]=\"selectedTab === 'brand' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand and Product Mapping\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'task' ? 'active' : ''\" (click)=\"selectedTab ='task';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1775_37931)\">\r\n <path d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37931\">\r\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Task Configuration\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brandMeta' ? 'active' : ''\" (click)=\"selectedTab='brandMeta';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 7.5L12 3L21 7.5M3 7.5L12 12M3 7.5V16.5L12 21M21 7.5L12 12M21 7.5V16.5L12 21M12 12V21\" [attr.stroke]=\"selectedTab === 'brandMeta' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand Meta Data\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9\" id=\"config\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 <div class=\"m-card\" *ngIf=\"!loading\">\r\n <div *ngIf=\"selectedTab === 'brand'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Brand and product information</h3>\r\n <p>Define the brand and map products to their respective categories.</p>\r\n </div>\r\n <div>\r\n <!-- <button type=\"button\" class=\"btn btn-outline\" (click)=\"bulkUpload()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button> -->\r\n </div>\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"form\" class=\"mt-10\" #formRef>\r\n <div formArrayName=\"brandConfig\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Brand</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Category</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Sub-Category</div>\r\n </div>\r\n </div>\r\n <div style=\"height:calc(75vh - 250px);overflow-y:Scroll\">\r\n <div *ngFor=\"let brandGroup of brandConfig?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100\" [id]=\"'text'+i\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('brand')?.hasError('required') ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"category\">\r\n <div class=\"input-container form-control\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('category')?.hasError('required') ? 'danger' : ''\">\r\n <ng-container *ngFor=\"let item of getCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' :removeCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? 'disabledText':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addCategory($event,i)\" [id]=\"'categoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"subCategory\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let item of getSubCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' : removeSubCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? '':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addSubCategory($event,i)\" [id]=\"'subCategoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\" (click)=\"checkUsed(i) || isEdit ? '' : removeBrand(i)\" *ngIf=\"brandConfig.value.length > 1\" [ngClass]=\"checkUsed(i) || isEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrand()\" [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;formEnable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateBrand()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'brandMeta'\">\r\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Brand Meta Data</h3>\r\n <p class=\"mb-0\">Maintain the Pid Cat &#8594; Brand / Category / Band mapping used during planogram export.</p>\r\n </div>\r\n <div style=\"width:360px;flex-shrink:0\">\r\n <div class=\"position-relative\">\r\n <span class=\"position-absolute\" style=\"left:12px;top:50%;transform:translateY(-50%)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control\" style=\"padding-left:38px\" placeholder=\"Search Pid Cat, Temp Group, Category, Brand or Band\" [(ngModel)]=\"brandMetaSearch\" [ngModelOptions]=\"{standalone: true}\"/>\r\n </div>\r\n <div class=\"text-end mt-1\" *ngIf=\"brandMetaData?.controls?.length\">\r\n <small class=\"text-muted\">{{ filteredBrandMetaCount }} of {{ brandMetaData.controls.length }} row(s)</small>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container>\r\n <form [formGroup]=\"brandMetaForm\" class=\"mt-3\" #brandMetaRef>\r\n <div formArrayName=\"brandMetaData\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Pid Cat</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Temp Group</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Category</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Brand</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Band</div></div>\r\n </div>\r\n <div style=\"height:calc(75vh - 280px);overflow-y:scroll\">\r\n <div *ngIf=\"!brandMetaData?.controls?.length\" class=\"text-center p-5 text-muted\">\r\n No brand meta data found. Click \"Edit\" then \"Add\" to create a row.\r\n </div>\r\n <div *ngIf=\"brandMetaData?.controls?.length && !filteredBrandMetaCount\" class=\"text-center p-5 text-muted\">\r\n No rows match \"{{ brandMetaSearch }}\"\r\n </div>\r\n <div *ngFor=\"let metaGroup of brandMetaData?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\" [id]=\"'metaRow' + i\" [hidden]=\"!matchesBrandMetaSearch(metaGroup)\">\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"pidCat\" [id]=\"'metaRow' + i + '-pidCat'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('pidCat')?.hasError('required') && metaGroup.get('pidCat')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"tempGroup\" [id]=\"'metaRow' + i + '-tempGroup'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('tempGroup')?.hasError('required') && metaGroup.get('tempGroup')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"category\" [id]=\"'metaRow' + i + '-category'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('category')?.hasError('required') && metaGroup.get('category')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [id]=\"'metaRow' + i + '-brand'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('brand')?.hasError('required') && metaGroup.get('brand')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2 d-flex\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"band\" [id]=\"'metaRow' + i + '-band'\"/>\r\n <div class=\"ms-3 mt-3\" (click)=\"isBrandMetaEdit ? '' : removeBrandMetaRow(i)\" [ngClass]=\"isBrandMetaEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrandMetaRow()\" [disabled]=\"isBrandMetaEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"!isBrandMetaEdit\" (click)=\"cancelBrandMetaEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-outline ms-2\" *ngIf=\"isBrandMetaEdit\" (click)=\"enableBrandMetaForm()\">\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_1775_37990)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37990\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary ms-2\" *ngIf=\"!isBrandMetaEdit\" (click)=\"updateBrandMetaData()\">Save</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'task'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Global configuration for tasks</h3>\r\n <p>The following configuration applies to all published tasks.</p>\r\n </div>\r\n <!-- <div>\r\n <button type=\"button\" class=\"btn btn-outline\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button>\r\n </div> -->\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"taskForm\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due days (to complete task)\r\n </label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"dueDay\"/>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due time\r\n </label>\r\n <input type=\"time\" class=\"form-control\" formControlName=\"dueTime\"/>\r\n </div>\r\n <div\r\n class=\"checklistturnoff ms-3 mt-4 fv-plugins-icon-containe col-md-8 divWidth\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input mt-3\" type=\"checkbox\"\r\n id=\"geoFencing\" [checked]=\"taskForm.get('allowedStoreLocation')?.value\" formControlName=\"allowedStoreLocation\">\r\n <label class=\"form-check-label sub\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">Geo\r\n fencing\r\n </label><br>\r\n <label class=\"form-check-label subtext\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">By\r\n enabling, the checklist can be filled by the user only when\r\n inside the store.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;taskForm.enable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateTask()\">\r\n Save\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".s-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;overflow-y:auto}.m-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;max-height:75vh;overflow-y:auto}.planoConfig{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}::ng-deep .planoConfig .active,.active .configText{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.configText{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.chip-box{position:relative}.chip-box .form-control{padding-top:0;padding-bottom:0}.chip-box .input-container{min-height:auto;max-height:100px!important;overflow:auto;width:100%;display:flex;flex-wrap:wrap}.chip-box .input-container input{all:unset;flex:1;min-width:50px}.chip-box .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.chip-box .input-container .chip:nth-child(1){margin-left:0}.checklistturnoff{border-radius:8px;border:1px solid var(--gray-200, #EAECF0);background:var(--white, #FFF);display:flex;padding:16px;align-items:flex-start;align-self:stretch}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subText{color:var(--gray-700, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.sub.active,.subtext.active{color:var(--Primary-800, #008EDF)!important}.divWidth{width:65%}.brandCat{width:30%;margin-left:1%}.danger{border:1px solid red!important}.danger-flash{animation:danger-flash 1.4s ease-out}@keyframes danger-flash{0%{background-color:#fee4e2;box-shadow:0 0 0 3px #f0443859}to{background-color:transparent;box-shadow:0 0 #f0443800}}.disabledText{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}\n"] }]
428
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.PlanoDataService }, { type: i3.GlobalStateService }, { type: i4.StoreBuilderService }, { type: i5.ToastService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: i3.PageInfoService }], propDecorators: { formRef: [{
438
+ args: [{ selector: "lib-plano-configurations", template: "<div class=\"row\">\r\n <div class=\"col-md-3 planoConfig\">\r\n <!-- Hidden plano-tools entry. Sized 120\u00D740 px, transparent \u2014 invisible\r\n to regular users but reachable by ops/devs who know the spot.\r\n Placed at the bottom-left, below the config side card. -->\r\n <button\r\n type=\"button\"\r\n aria-label=\"Open plano tools\"\r\n tabindex=\"-1\"\r\n class=\"plano-tools-hidden-entry\"\r\n (click)=\"goToPlanoTools()\"></button>\r\n <div class=\"s-card\">\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brand' ? 'active' : ''\" (click)=\"selectedTab ='brand';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M14.1755 4.22225C14.1766 2.99445 11.6731 2 8.58832 2C5.50357 2 3.00224 2.99557 3 4.22225M3 4.22225C3 5.45004 5.50133 6.44449 8.58832 6.44449C11.6753 6.44449 14.1766 5.45004 14.1766 4.22225L14.1766 12.8445M3 4.22225V17.5556C3.00112 18.7834 5.50245 19.7779 8.58832 19.7779C10.0849 19.7779 11.4361 19.5412 12.4387 19.1601M3.00112 8.66672C3.00112 9.89451 5.50245 10.889 8.58944 10.889C11.6764 10.889 14.1778 9.89451 14.1778 8.66672M12.5057 14.6946C11.4976 15.0891 10.115 15.3335 8.58832 15.3335C5.50245 15.3335 3.00112 14.3391 3.00112 13.1113M20.5272 13.4646C22.4909 15.4169 22.4909 18.5836 20.5272 20.5358C18.5635 22.4881 15.3781 22.4881 13.4144 20.5358C11.4507 18.5836 11.4507 15.4169 13.4144 13.4646C15.3781 11.5124 18.5635 11.5124 20.5272 13.4646Z\" [attr.stroke]=\"selectedTab === 'brand' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand and Product Mapping\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'task' ? 'active' : ''\" (click)=\"selectedTab ='task';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1775_37931)\">\r\n <path d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37931\">\r\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Task Configuration\r\n </div>\r\n </div>\r\n <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brandMeta' ? 'active' : ''\" (click)=\"selectedTab='brandMeta';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n <div class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 7.5L12 3L21 7.5M3 7.5L12 12M3 7.5V16.5L12 21M21 7.5L12 12M21 7.5V16.5L12 21M12 12V21\" [attr.stroke]=\"selectedTab === 'brandMeta' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"configText\">\r\n Brand Meta Data\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9\" id=\"config\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\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 <div class=\"m-card\" *ngIf=\"!loading\">\r\n <div *ngIf=\"selectedTab === 'brand'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Brand and product information</h3>\r\n <p>Define the brand and map products to their respective categories.</p>\r\n </div>\r\n <div>\r\n <!-- <button type=\"button\" class=\"btn btn-outline\" (click)=\"bulkUpload()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button> -->\r\n </div>\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"form\" class=\"mt-10\" #formRef>\r\n <div formArrayName=\"brandConfig\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Brand</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Category</div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"form-label\">Product Sub-Category</div>\r\n </div>\r\n </div>\r\n <div style=\"height:calc(75vh - 250px);overflow-y:Scroll\">\r\n <div *ngFor=\"let brandGroup of brandConfig?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\">\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100\" [id]=\"'text'+i\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('brand')?.hasError('required') ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"category\">\r\n <div class=\"input-container form-control\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('category')?.hasError('required') ? 'danger' : ''\">\r\n <ng-container *ngFor=\"let item of getCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' :removeCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? 'disabledText':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addCategory($event,i)\" [id]=\"'categoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 p-0 ps-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"w-100 chip-box\" formArrayName=\"subCategory\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let item of getSubCategory(i)?.controls;let j=index\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n <span (click)=\"isEdit || checkUsed(i) ? '' : removeSubCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? '':'cursor-pointer'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addSubCategory($event,i)\" [id]=\"'subCategoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n </div>\r\n <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n </div>\r\n <div class=\"ms-3 mt-4\" (click)=\"checkUsed(i) || isEdit ? '' : removeBrand(i)\" *ngIf=\"brandConfig.value.length > 1\" [ngClass]=\"checkUsed(i) || isEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrand()\" [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;formEnable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateBrand()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'brandMeta'\">\r\n <div class=\"d-flex justify-content-between align-items-center gap-3\">\r\n <div class=\"flex-grow-1\">\r\n <h3>Brand Meta Data</h3>\r\n <p class=\"mb-0\">Maintain the Pid Cat &#8594; Brand / Category / Band mapping used during planogram export.</p>\r\n </div>\r\n <div style=\"width:360px;flex-shrink:0\">\r\n <div class=\"position-relative\">\r\n <span class=\"position-absolute\" style=\"left:12px;top:50%;transform:translateY(-50%)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control\" style=\"padding-left:38px\" placeholder=\"Search Pid Cat, Temp Group, Category, Brand or Band\" [(ngModel)]=\"brandMetaSearch\" [ngModelOptions]=\"{standalone: true}\"/>\r\n </div>\r\n <div class=\"text-end mt-1\" *ngIf=\"brandMetaData?.controls?.length\">\r\n <small class=\"text-muted\">{{ filteredBrandMetaCount }} of {{ brandMetaData.controls.length }} row(s)</small>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container>\r\n <form [formGroup]=\"brandMetaForm\" class=\"mt-3\" #brandMetaRef>\r\n <div formArrayName=\"brandMetaData\">\r\n <div class=\"row mx-0\">\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Pid Cat</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Temp Group</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Category</div></div>\r\n <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Brand</div></div>\r\n <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Band</div></div>\r\n </div>\r\n <div style=\"height:calc(75vh - 280px);overflow-y:scroll\">\r\n <div *ngIf=\"!brandMetaData?.controls?.length\" class=\"text-center p-5 text-muted\">\r\n No brand meta data found. Click \"Edit\" then \"Add\" to create a row.\r\n </div>\r\n <div *ngIf=\"brandMetaData?.controls?.length && !filteredBrandMetaCount\" class=\"text-center p-5 text-muted\">\r\n No rows match \"{{ brandMetaSearch }}\"\r\n </div>\r\n <div *ngFor=\"let metaGroup of brandMetaData?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\" [id]=\"'metaRow' + i\" [hidden]=\"!matchesBrandMetaSearch(metaGroup)\">\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"pidCat\" [id]=\"'metaRow' + i + '-pidCat'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('pidCat')?.hasError('required') && metaGroup.get('pidCat')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"tempGroup\" [id]=\"'metaRow' + i + '-tempGroup'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('tempGroup')?.hasError('required') && metaGroup.get('tempGroup')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"category\" [id]=\"'metaRow' + i + '-category'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('category')?.hasError('required') && metaGroup.get('category')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-3 p-0 ps-2\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [id]=\"'metaRow' + i + '-brand'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('brand')?.hasError('required') && metaGroup.get('brand')?.touched ? 'danger' : ''\"/>\r\n </div>\r\n <div class=\"col-md-2 p-0 ps-2 d-flex\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"band\" [id]=\"'metaRow' + i + '-band'\"/>\r\n <div class=\"ms-3 mt-3\" (click)=\"isBrandMetaEdit ? '' : removeBrandMetaRow(i)\" [ngClass]=\"isBrandMetaEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrandMetaRow()\" [disabled]=\"isBrandMetaEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Add\r\n </button>\r\n </div>\r\n <div>\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"!isBrandMetaEdit\" (click)=\"cancelBrandMetaEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-outline ms-2\" *ngIf=\"isBrandMetaEdit\" (click)=\"enableBrandMetaForm()\">\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_1775_37990)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37990\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary ms-2\" *ngIf=\"!isBrandMetaEdit\" (click)=\"updateBrandMetaData()\">Save</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"selectedTab === 'task'\" >\r\n <div class=\"d-flex justify-content-between\">\r\n <div>\r\n <h3>Global configuration for tasks</h3>\r\n <p>The following configuration applies to all published tasks.</p>\r\n </div>\r\n <!-- <div>\r\n <button type=\"button\" class=\"btn btn-outline\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Upload Brands\r\n </button>\r\n </div> -->\r\n </div>\r\n <ng-container >\r\n <form [formGroup]=\"taskForm\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due days (to complete task)\r\n </label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"dueDay\"/>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label\">\r\n Due time\r\n </label>\r\n <input type=\"time\" class=\"form-control\" formControlName=\"dueTime\"/>\r\n </div>\r\n <div\r\n class=\"checklistturnoff ms-3 mt-4 fv-plugins-icon-containe col-md-8 divWidth\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input mt-3\" type=\"checkbox\"\r\n id=\"geoFencing\" [checked]=\"taskForm.get('allowedStoreLocation')?.value\" formControlName=\"allowedStoreLocation\">\r\n <label class=\"form-check-label sub\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">Geo\r\n fencing\r\n </label><br>\r\n <label class=\"form-check-label subtext\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">By\r\n enabling, the checklist can be filled by the user only when\r\n inside the store.</label>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"d-flex justify-content-between mt-10\">\r\n <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;taskForm.enable()\">\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_1775_37985)\">\r\n <path 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\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1775_37985\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n </clipPath>\r\n </defs>\r\n </svg> Edit\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateTask()\">\r\n Save\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".s-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;overflow-y:auto}.planoConfig{position:relative}.plano-tools-hidden-entry{position:absolute;bottom:12px;left:16px;width:120px;height:40px;padding:0;border:none;outline:none;background:transparent;cursor:pointer;z-index:2}.plano-tools-hidden-entry:focus,.plano-tools-hidden-entry:active{outline:none;box-shadow:none}.m-card{border-radius:8px;background:#fff;padding:20px 16px;height:75vh;max-height:75vh;overflow-y:auto}.planoConfig{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}::ng-deep .planoConfig .active,.active .configText{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.configText{color:var(--Gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.chip-box{position:relative}.chip-box .form-control{padding-top:0;padding-bottom:0}.chip-box .input-container{min-height:auto;max-height:100px!important;overflow:auto;width:100%;display:flex;flex-wrap:wrap}.chip-box .input-container input{all:unset;flex:1;min-width:50px}.chip-box .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.chip-box .input-container .chip:nth-child(1){margin-left:0}.checklistturnoff{border-radius:8px;border:1px solid var(--gray-200, #EAECF0);background:var(--white, #FFF);display:flex;padding:16px;align-items:flex-start;align-self:stretch}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subText{color:var(--gray-700, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.sub.active,.subtext.active{color:var(--Primary-800, #008EDF)!important}.divWidth{width:65%}.brandCat{width:30%;margin-left:1%}.danger{border:1px solid red!important}.danger-flash{animation:danger-flash 1.4s ease-out}@keyframes danger-flash{0%{background-color:#fee4e2;box-shadow:0 0 0 3px #f0443859}to{background-color:transparent;box-shadow:0 0 #f0443800}}.disabledText{color:var(--bs-gray-500);background-color:var(--bs-gray-200);border-color:var(--bs-gray-300);opacity:1}\n"] }]
439
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.PlanoDataService }, { type: i3.GlobalStateService }, { type: i4.StoreBuilderService }, { type: i5.ToastService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: i3.PageInfoService }, { type: i7.Router }], propDecorators: { formRef: [{
429
440
  type: ViewChild,
430
441
  args: ['formRef']
431
442
  }], brandMetaRef: [{
432
443
  type: ViewChild,
433
444
  args: ['brandMetaRef']
434
445
  }] } });
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tY29uZmlndXJhdGlvbnMvcGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tY29uZmlndXJhdGlvbnMvcGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBSUwsV0FBVyxFQUVYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBTXhCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7O0FBUTVELE1BQU0sT0FBTyw0QkFBNEI7SUFlN0I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXJCYSxPQUFPLENBQWE7SUFDZixZQUFZLENBQWE7SUFDckQsV0FBVyxHQUFXLE9BQU8sQ0FBQztJQUM5QixJQUFJLENBQWE7SUFDakIsUUFBUSxDQUFTO0lBQ2pCLFVBQVUsR0FBbUIsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLENBQVk7SUFDcEIsYUFBYSxDQUFhO0lBQzFCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsZUFBZSxHQUFZLElBQUksQ0FBQztJQUNoQyxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLFlBQ1UsRUFBZSxFQUNmLFdBQTZCLEVBQzdCLEVBQXNCLEVBQ3RCLGNB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QztZQUNsQyxPQUFPLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FDL0IsQ0FBQyxNQUFNLENBQUM7SUFDWCxDQUFDO3dHQTllVSw0QkFBNEI7NEZBQTVCLDRCQUE0QixtUUN0QnpDLDRrbENBcVdBOzs0RkQvVWEsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDBCQUEwQjtrU0FLYixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ08sWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgUGxhbm9EYXRhU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9wdXBzQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXBzL3BvcHVwcy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQnJhbmREZXRhaWxzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdm0tbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1wbGFuby1jb25maWd1cmF0aW9uc1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3BsYW5vLWNvbmZpZ3VyYXRpb25zLmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQbGFub0NvbmZpZ3VyYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgQFZpZXdDaGlsZCgnZm9ybVJlZicpIGZvcm1SZWY6IEVsZW1lbnRSZWY7XHJcbiAgIEBWaWV3Q2hpbGQoJ2JyYW5kTWV0YVJlZicpIGJyYW5kTWV0YVJlZjogRWxlbWVudFJlZjtcclxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gXCJicmFuZFwiO1xyXG4gIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBicmFuZHNMaXN0OiBCcmFuZERldGFpbHNbXSA9IFtdO1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRhc2tGb3JtOiBGb3JtR3JvdXA7XHJcbiAgYnJhbmRNZXRhRm9ybSE6IEZvcm1Hcm91cDtcclxuICBicmFuZE1ldGFMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGlzQnJhbmRNZXRhRWRpdDogYm9vbGVhbiA9IHRydWU7XHJcbiAgYnJhbmRNZXRhU2VhcmNoOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBQbGFub0RhdGFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBidWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kZWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcclxuICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUuc3Vic2NyaWJlKGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB0aGlzLmxvYWRCcmFuZERhdGEoKTtcclxuICAgICAgICB0aGlzLmxvYWRUYXNrRGF0YSgpO1xyXG4gICAgICAgIHRoaXMubG9hZEJyYW5kTWV0YURhdGEoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5sb2FkQnJhbmREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkVGFza0RhdGEoKTtcclxuICAgICAgICB0aGlzLmxvYWRCcmFuZE1ldGFEYXRhKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ29uZmlndXJhdGlvblwiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZEJyYW5kRGF0YSgpIHtcclxuICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQpO1xyXG4gICAgdGhpcy5kYXRhU2VydmljZS5icmFuZHNMaXN0LnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICB0aGlzLmJyYW5kc0xpc3QgPSBlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYnJhbmRzTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRCcmFuZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRUYXNrRGF0YSgpIHtcclxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0VGFza0NvbmZpZyh0aGlzLmNsaWVudElkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGFza0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIGR1ZURheTogW3Jlcy5kYXRhLmR1ZURheSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBkdWVUaW1lOiBbcmVzLmRhdGEuZHVlVGltZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBhbGxvd2VkU3RvcmVMb2NhdGlvbjogW1xyXG4gICAgICAgICAgICByZXMuZGF0YS5hbGxvd2VkU3RvcmVMb2NhdGlvbixcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50YXNrRm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0YSgpIHtcclxuICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBicmFuZENvbmZpZzogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJyYW5kc0xpc3QuZm9yRWFjaCgoZTogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgYnJhbmRHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGJyYW5kOiBbXHJcbiAgICAgICAgICB7IHZhbHVlOiBlLmJyYW5kTmFtZSwgZGlzYWJsZWQ6IGUuaXNVc2VkIH0sXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZmIuYXJyYXkoZT8uY2F0ZWdvcnkpLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiB0aGlzLmZiLmFycmF5KGU/LnN1YkNhdGVnb3J5KSxcclxuICAgICAgICBpc1VzZWQ6IFtlPy5pc1VzZWRdLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWcucHVzaChicmFuZEdyb3VwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm0oKSB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYnJhbmRDb25maWc6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50YXNrRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBkdWVEYXk6IFsxLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgZHVlVGltZTogW1wiMjM6NTlcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGFsbG93ZWRTdG9yZUxvY2F0aW9uOiBbZmFsc2UsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5icmFuZE1ldGFGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kTWV0YURhdGE6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYnJhbmRDb25maWcoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiYnJhbmRDb25maWdcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkQnJhbmQoKSB7XHJcbiAgICB0aGlzLmJyYW5kQ29uZmlnLnB1c2goXHJcbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgYnJhbmRFbGVtZW50ID0gdGhpcy5mb3JtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICBgI3RleHQke3RoaXMuYnJhbmRDb25maWcubGVuZ3RoIC0gMX1gXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoYnJhbmRFbGVtZW50KSB7XHJcbiAgICAgICAgYnJhbmRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiY2VudGVyXCIsIGJlaGF2aW9yOiBcInNtb290aFwiIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQnJhbmQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5icmFuZENvbmZpZy5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBnZXRDYXRlZ29yeShjYXRJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuYnJhbmRDb25maWcuYXQoY2F0SW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICBcImNhdGVnb3J5XCJcclxuICAgICkgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2F0ZWdvcnkoaW5kZXg6IG51bWJlciwgY2F0SW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2F0ZWdvcnlBcnJheSA9ICh0aGlzLmJyYW5kQ29uZmlnLmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldChcclxuICAgICAgXCJjYXRlZ29yeVwiXHJcbiAgICApIGFzIEZvcm1BcnJheTtcclxuICAgIGNhdGVnb3J5QXJyYXkucmVtb3ZlQXQoY2F0SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ2F0ZWdvcnkoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU/LnRyaW0oKTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBjYXRlZ29yeUFycmF5ID0gKHRoaXMuYnJhbmRDb25maWcuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICAgIFwiY2F0ZWdvcnlcIlxyXG4gICAgICApIGFzIEZvcm1BcnJheTtcclxuICAgICAgY2F0ZWdvcnlBcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbCh2YWx1ZSkpO1xyXG5cclxuICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICAgIGBjYXRlZ29yeUlucHV0JHtpbmRleH1gXHJcbiAgICAgICkgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgIGlmIChpbnB1dFZhbHVlKSB7XHJcbiAgICAgICAgaW5wdXRWYWx1ZS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN1YkNhdGVnb3J5KGNhdEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5icmFuZENvbmZpZy5hdChjYXRJbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoXHJcbiAgICAgIFwic3ViQ2F0ZWdvcnlcIlxyXG4gICAgKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTdWJDYXRlZ29yeShpbmRleDogbnVtYmVyLCBjYXRJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjYXRlZ29yeUFycmF5ID0gKHRoaXMuYnJhbmRDb25maWcuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICBcInN1YkNhdGVnb3J5XCJcclxuICAgICkgYXMgRm9ybUFycmF5O1xyXG4gICAgY2F0ZWdvcnlBcnJheS5yZW1vdmVBdChjYXRJbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRTdWJDYXRlZ29yeShldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZT8udHJpbSgpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5QXJyYXkgPSAodGhpcy5icmFuZENvbmZpZy5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoXHJcbiAgICAgICAgXCJzdWJDYXRlZ29yeVwiXHJcbiAgICAgICkgYXMgRm9ybUFycmF5O1xyXG4gICAgICBjYXRlZ29yeUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKHZhbHVlKSk7XHJcblxyXG4gICAgICBjb25zdCBpbnB1dFZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgYHN1YkNhdGVnb3J5SW5wdXQke2luZGV4fWBcclxuICAgICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgICAgaWYgKGlucHV0VmFsdWUpIHtcclxuICAgICAgICBpbnB1dFZhbHVlLnZhbHVlID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tVc2VkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmJyYW5kQ29uZmlnLmF0KGluZGV4KS5nZXQoXCJpc1VzZWRcIik/LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlQnJhbmQoKSB7XHJcbiAgICBsZXQgYnJhbmREYXRhID0gdGhpcy5icmFuZENvbmZpZy52YWx1ZTtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJSZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZHVwbGljYXRlczogYW55ID0gW107XHJcbiAgICBsZXQgZXJyb3I6IGFueSA9IFtdO1xyXG4gICAgbGV0IGJyYW5kOiBhbnkgPSBicmFuZERhdGEuZmxhdE1hcCgoZWxlOiBhbnkpID0+IGVsZS5icmFuZCk7XHJcbiAgICBkdXBsaWNhdGVzID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgIGJyYW5kLmZpbHRlcigoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiBicmFuZC5pbmRleE9mKGl0ZW0pICE9PSBpbmRleClcclxuICAgICAgKSxcclxuICAgIF07XHJcbiAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGgpIHtcclxuICAgICAgZXJyb3IucHVzaChgJHtkdXBsaWNhdGVzLnRvU3RyaW5nKCl9IC0gYnJhbmQgaXMgZHVwbGljYXRlZGApO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhdGVnb3J5OiBhbnkgPSBicmFuZERhdGEuZmxhdE1hcCgoZWxlOiBhbnkpID0+IGVsZS5jYXRlZ29yeSk7XHJcbiAgICBsZXQgZHVwbGljYXRlQ2F0ID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgIGNhdGVnb3J5LmZpbHRlcihcclxuICAgICAgICAgIChpdGVtOiBhbnksIGluZGV4OiBhbnkpID0+IGNhdGVnb3J5LmluZGV4T2YoaXRlbSkgIT09IGluZGV4XHJcbiAgICAgICAgKVxyXG4gICAgICApLFxyXG4gICAgXTtcclxuICAgIGlmIChkdXBsaWNhdGVDYXQubGVuZ3RoKSB7XHJcbiAgICAgIGVycm9yLnB1c2goXHJcbiAgICAgICAgYCR7QXJyYXkuZnJvbShkdXBsaWNhdGVDYXQpLnRvU3RyaW5nKCl9IC0gYnJhbmQgY2F0ZWdvcnkgaXMgZHVwbGljYXRlZGBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgJHtlcnJvci50b1N0cmluZygpfSBgKTtcclxuICAgIH1cclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgYnJhbmREYXRhOiBicmFuZERhdGEsXHJcbiAgICAgIGJyYW5kVXNlZExpc3Q6IHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgIC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuaXNVc2VkKVxyXG4gICAgICAgIC5tYXAoKGVsZTogYW55KSA9PiBlbGUuX2lkKSxcclxuICAgIH07XHJcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmFkZFVwZGF0ZUJyYW5kKGRhdGEpLnN1YnNjcmliZShcclxuICAgICAgYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiQnJhbmQgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uXCIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGFzaygpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgLi4udGhpcy50YXNrRm9ybS52YWx1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS51cGRhdGVUYXNrKGRhdGEpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudGFza0Zvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcIlRhc2sgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLlwiKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJ1bGtVcGxvYWQoKSB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kZWxTZXJ2aWNlLm9wZW4oUG9wdXBzQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b3RhbEl0ZW1Db3VudCA9IHRoaXMuYnJhbmRzTGlzdC5sZW5ndGg7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b3RhbEl0ZW1Db3VudCA9IHRoaXMuYnJhbmRzTGlzdC5sZW5ndGg7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5icmFuZExpc3QgPSB0aGlzLmJyYW5kc0xpc3Q7XHJcblxyXG4gICAgbW9kZWxSZWYucmVzdWx0LnRoZW4oYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5mZXRjaEJyYW5kc0xpc3QodGhpcy5jbGllbnRJZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9ybUVuYWJsZSgpIHtcclxuICAgIGxldCBicmFuZEluZm8gPSB0aGlzLmZvcm0uZ2V0KFwiYnJhbmRDb25maWdcIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgIGJyYW5kSW5mby5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLmdldChcImlzVXNlZFwiKT8udmFsdWUpIHtcclxuICAgICAgICBjb250cm9sLmdldChcImJyYW5kXCIpPy5lbmFibGUoKTtcclxuICAgICAgICBjb250cm9sLmdldChcImNhdGVnb3J5XCIpPy5lbmFibGUoKTtcclxuICAgICAgICBjb250cm9sLmdldChcInN1YkNhdGVnb3J5XCIpPy5lbmFibGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYnJhbmRNZXRhRGF0YSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuYnJhbmRNZXRhRm9ybS5nZXQoXCJicmFuZE1ldGFEYXRhXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGxvYWRCcmFuZE1ldGFEYXRhKCkge1xyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmVzPy5kYXRhKSA/IHJlcy5kYXRhIDogW107XHJcbiAgICAgICAgdGhpcy5icmFuZE1ldGFMaXN0ID0gcm93cztcclxuICAgICAgICB0aGlzLmJ1aWxkQnJhbmRNZXRhRm9ybShyb3dzKTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYnJhbmRNZXRhTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuYnVpbGRCcmFuZE1ldGFGb3JtKFtdKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkQnJhbmRNZXRhRm9ybShyb3dzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5icmFuZE1ldGFGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kTWV0YURhdGE6IHRoaXMuZmIuYXJyYXkoXHJcbiAgICAgICAgcm93cy5tYXAoKHJvdykgPT5cclxuICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBwaWRDYXQ6IFtyb3c/LnBpZENhdCA/PyBcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgdGVtcEdyb3VwOiBbcm93Py50ZW1wR3JvdXAgPz8gXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiBbcm93Py5jYXRlZ29yeSA/PyBcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgYnJhbmQ6IFtyb3c/LmJyYW5kID8/IFwiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBiYW5kOiBbcm93Py5iYW5kID8/IFwiXCJdLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICksXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaXNCcmFuZE1ldGFFZGl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuYnJhbmRNZXRhRm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGFkZEJyYW5kTWV0YVJvdygpIHtcclxuICAgIHRoaXMuYnJhbmRNZXRhRGF0YS5wdXNoKFxyXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBwaWRDYXQ6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB0ZW1wR3JvdXA6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICBjYXRlZ29yeTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgYmFuZDogW1wiXCJdLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBsYXN0Um93ID0gdGhpcy5icmFuZE1ldGFSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgYCNtZXRhUm93JHt0aGlzLmJyYW5kTWV0YURhdGEubGVuZ3RoIC0gMX1gXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChsYXN0Um93KSB7XHJcbiAgICAgICAgbGFzdFJvdy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiBcImNlbnRlclwiLCBiZWhhdmlvcjogXCJzbW9vdGhcIiB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUJyYW5kTWV0YVJvdyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmJyYW5kTWV0YURhdGEucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQnJhbmRNZXRhRm9ybSgpIHtcclxuICAgIHRoaXMuaXNCcmFuZE1ldGFFZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmJyYW5kTWV0YUZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEJyYW5kTWV0YUVkaXQoKSB7XHJcbiAgICB0aGlzLmJ1aWxkQnJhbmRNZXRhRm9ybSh0aGlzLmJyYW5kTWV0YUxpc3QpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQnJhbmRNZXRhRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmJyYW5kTWV0YUZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmJyYW5kTWV0YUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLmZvY3VzRmlyc3RJbnZhbGlkQnJhbmRNZXRhRmllbGQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuYnJhbmRNZXRhRGF0YS52YWx1ZTtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IGR1cGVzOiB7IHJvdzogbnVtYmVyOyBjb21ibzogc3RyaW5nIH1bXSA9IFtdO1xyXG4gICAgcm93cy5mb3JFYWNoKChyOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBgJHsoci5waWRDYXQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCl9fCR7KHIudGVtcEdyb3VwIHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWA7XHJcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgZHVwZXMucHVzaCh7IHJvdzogaSwgY29tYm86IGAke3IucGlkQ2F0fSAvICR7ci50ZW1wR3JvdXB9YCB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChkdXBlcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZmlyc3QgPSBkdXBlc1swXTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGBSb3cgJHtmaXJzdC5yb3cgKyAxfTogZHVwbGljYXRlIFBpZCBDYXQgKyBUZW1wIEdyb3VwIFwiJHtmaXJzdC5jb21ib31cImBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zY3JvbGxBbmRGbGFzaEJyYW5kTWV0YUZpZWxkKGZpcnN0LnJvdywgXCJwaWRDYXRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBicmFuZE1ldGFEYXRhOiByb3dzLFxyXG4gICAgfTtcclxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudXBkYXRlQnJhbmRNZXRhRGF0YShwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcIkJyYW5kIE1ldGEgRGF0YSB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuYnJhbmRNZXRhTGlzdCA9IHJvd3M7XHJcbiAgICAgICAgICB0aGlzLmlzQnJhbmRNZXRhRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmJyYW5kTWV0YUZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLlwiKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQlJBTkRfTUVUQV9GSUVMRF9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBwaWRDYXQ6IFwiUGlkIENhdFwiLFxyXG4gICAgdGVtcEdyb3VwOiBcIlRlbXAgR3JvdXBcIixcclxuICAgIGNhdGVnb3J5OiBcIkNhdGVnb3J5XCIsXHJcbiAgICBicmFuZDogXCJCcmFuZFwiLFxyXG4gICAgYmFuZDogXCJCYW5kXCIsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c0ZpcnN0SW52YWxpZEJyYW5kTWV0YUZpZWxkKCkge1xyXG4gICAgY29uc3QgY29udHJvbHMgPSB0aGlzLmJyYW5kTWV0YURhdGEuY29udHJvbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbHNbaV0gYXMgRm9ybUdyb3VwO1xyXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkS2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuQlJBTkRfTUVUQV9GSUVMRF9MQUJFTFMpKSB7XHJcbiAgICAgICAgY29uc3QgY3RybCA9IGdyb3VwLmdldChmaWVsZEtleSk7XHJcbiAgICAgICAgaWYgKGN0cmwgJiYgY3RybC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGBSb3cgJHtpICsgMX06ICR7dGhpcy5CUkFORF9NRVRBX0ZJRUxEX0xBQkVMU1tmaWVsZEtleV19IGlzIHJlcXVpcmVkYFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsQW5kRmxhc2hCcmFuZE1ldGFGaWVsZChpLCBmaWVsZEtleSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJSZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxBbmRGbGFzaEJyYW5kTWV0YUZpZWxkKHJvd0luZGV4OiBudW1iZXIsIGZpZWxkS2V5OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmJyYW5kTWV0YVNlYXJjaD8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMuYnJhbmRNZXRhU2VhcmNoID0gXCJcIjtcclxuICAgIH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICAgIGBtZXRhUm93JHtyb3dJbmRleH0tJHtmaWVsZEtleX1gXHJcbiAgICAgICkgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgIGlmICghZWwpIHJldHVybjtcclxuICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJjZW50ZXJcIiwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBlbC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJkYW5nZXItZmxhc2hcIik7XHJcbiAgICAgIHZvaWQgZWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJkYW5nZXItZmxhc2hcIik7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZShcImRhbmdlci1mbGFzaFwiKSwgMTUwMCk7XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBtYXRjaGVzQnJhbmRNZXRhU2VhcmNoKGdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmJyYW5kTWV0YVNlYXJjaD8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXEpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgZmllbGRzID0gW1wicGlkQ2F0XCIsIFwidGVtcEdyb3VwXCIsIFwiY2F0ZWdvcnlcIiwgXCJicmFuZFwiLCBcImJhbmRcIl07XHJcbiAgICByZXR1cm4gZmllbGRzLnNvbWUoKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB2YWwgPSBncm91cC5nZXQoa2V5KT8udmFsdWU7XHJcbiAgICAgIHJldHVybiAodmFsID8/IFwiXCIpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkQnJhbmRNZXRhQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmJyYW5kTWV0YURhdGEuY29udHJvbHMuZmlsdGVyKChjKSA9PlxyXG4gICAgICB0aGlzLm1hdGNoZXNCcmFuZE1ldGFTZWFyY2goYylcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcGxhbm9Db25maWdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicy1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY3Vyc29yLXBvaW50ZXIgcC0zIG1iLTNcIiBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2JyYW5kJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWIgPSdicmFuZCc7aXNFZGl0PXRydWU7aXNCcmFuZE1ldGFFZGl0PXRydWU7Zm9ybS5kaXNhYmxlKCk7dGFza0Zvcm0uZGlzYWJsZSgpO2JyYW5kTWV0YUZvcm0uZGlzYWJsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjE3NTUgNC4yMjIyNUMxNC4xNzY2IDIuOTk0NDUgMTEuNjczMSAyIDguNTg4MzIgMkM1LjUwMzU3IDIgMy4wMDIyNCAyLjk5NTU3IDMgNC4yMjIyNU0zIDQuMjIyMjVDMyA1LjQ1MDA0IDUuNTAxMzMgNi40NDQ0OSA4LjU4ODMyIDYuNDQ0NDlDMTEuNjc1MyA2LjQ0NDQ5IDE0LjE3NjYgNS40NTAwNCAxNC4xNzY2IDQuMjIyMjVMMTQuMTc2NiAxMi44NDQ1TTMgNC4yMjIyNVYxNy41NTU2QzMuMDAxMTIgMTguNzgzNCA1LjUwMjQ1IDE5Ljc3NzkgOC41ODgzMiAxOS43Nzc5QzEwLjA4NDkgMTkuNzc3OSAxMS40MzYxIDE5LjU0MTIgMTIuNDM4NyAxOS4xNjAxTTMuMDAxMTIgOC42NjY3MkMzLjAwMTEyIDkuODk0NTEgNS41MDI0NSAxMC44ODkgOC41ODk0NCAxMC44ODlDMTEuNjc2NCAxMC44ODkgMTQuMTc3OCA5Ljg5NDUxIDE0LjE3NzggOC42NjY3Mk0xMi41MDU3IDE0LjY5NDZDMTEuNDk3NiAxNS4wODkxIDEwLjExNSAxNS4zMzM1IDguNTg4MzIgMTUuMzMzNUM1LjUwMjQ1IDE1LjMzMzUgMy4wMDExMiAxNC4zMzkxIDMuMDAxMTIgMTMuMTExM00yMC41MjcyIDEzLjQ2NDZDMjIuNDkwOSAxNS40MTY5IDIyLjQ5MDkgMTguNTgzNiAyMC41MjcyIDIwLjUzNThDMTguNTYzNSAyMi40ODgxIDE1LjM3ODEgMjIuNDg4MSAxMy40MTQ0IDIwLjUzNThDMTEuNDUwNyAxOC41ODM2IDExLjQ1MDcgMTUuNDE2OSAxMy40MTQ0IDEzLjQ2NDZDMTUuMzc4MSAxMS41MTI0IDE4LjU2MzUgMTEuNTEyNCAyMC41MjcyIDEzLjQ2NDZaXCIgW2F0dHIuc3Ryb2tlXT1cInNlbGVjdGVkVGFiID09PSAnYnJhbmQnID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWdUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQnJhbmQgYW5kIFByb2R1Y3QgTWFwcGluZ1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGN1cnNvci1wb2ludGVyIHAtMyBtYi0zXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWIgPSd0YXNrJztpc0VkaXQ9dHJ1ZTtpc0JyYW5kTWV0YUVkaXQ9dHJ1ZTtmb3JtLmRpc2FibGUoKTt0YXNrRm9ybS5kaXNhYmxlKCk7YnJhbmRNZXRhRm9ybS5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTc3NV8zNzkzMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiAxNUMxMy42NTY5IDE1IDE1IDEzLjY1NjkgMTUgMTJDMTUgMTAuMzQzMSAxMy42NTY5IDkgMTIgOUMxMC4zNDMxIDkgOSAxMC4zNDMxIDkgMTJDOSAxMy42NTY5IDEwLjM0MzEgMTUgMTIgMTVaXCIgW2F0dHIuc3Ryb2tlXT1cInNlbGVjdGVkVGFiID09PSAndGFzaycgPyAnIzAwQTNGRicgOiAnIzM0NDA1NCdcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5LjQgMTVDMTkuMjY2OSAxNS4zMDE2IDE5LjIyNzIgMTUuNjM2MiAxOS4yODYgMTUuOTYwNkMxOS4zNDQ4IDE2LjI4NSAxOS40OTk1IDE2LjU4NDMgMTkuNzMgMTYuODJMMTkuNzkgMTYuODhDMTkuOTc2IDE3LjA2NTcgMjAuMTIzNSAxNy4yODYzIDIwLjIyNDEgMTcuNTI5MUMyMC4zMjQ4IDE3Ljc3MTkgMjAuMzc2NiAxOC4wMzIyIDIwLjM3NjYgMTguMjk1QzIwLjM3NjYgMTguNTU3OCAyMC4zMjQ4IDE4LjgxODEgMjAuMjI0MSAxOS4wNjA5QzIwLjEyMzUgMTkuMzAzNyAxOS45NzYgMTkuNTI0MyAxOS43OSAxOS43MUMxOS42MDQzIDE5Ljg5NiAxOS4zODM3IDIwLjA0MzUgMTkuMTQwOSAyMC4xNDQxQzE4Ljg5ODEgMjAuMjQ0OCAxOC42Mzc4IDIwLjI5NjYgMTguMzc1IDIwLjI5NjZDMTguMTEyMiAyMC4yOTY2IDE3Ljg1MTkgMjAuMjQ0OCAxNy42MDkxIDIwLjE0NDFDMTcuMzY2MyAyMC4wNDM1IDE3LjE0NTcgMTkuODk2IDE2Ljk2IDE5LjcxTDE2LjkgMTkuNjVDMTYuNjY0MyAxOS40MTk1IDE2LjM2NSAxOS4yNjQ4IDE2LjA0MDYgMTkuMjA2QzE1LjcxNjIgMTkuMTQ3MiAxNS4zODE2IDE5LjE4NjkgMTUuMDggMTkuMzJDMTQuNzg0MiAxOS40NDY4IDE0LjUzMiAxOS42NTcyIDE0LjM1NDMgMTkuOTI1NUMxNC4xNzY2IDIwLjE5MzggMTQuMDgxMyAyMC41MDgyIDE0LjA4IDIwLjgzVjIxQzE0LjA4IDIxLjUzMDQgMTMuODY5MyAyMi4wMzkxIDEzLjQ5NDIgMjIuNDE0MkMxMy4xMTkxIDIyLjc4OTMgMTIuNjEwNCAyMyAxMi4wOCAyM0MxMS41NDk2IDIzIDExLjA0MDkgMjIuNzg5MyAxMC42NjU4IDIyLjQxNDJDMTAuMjkwNyAyMi4wMzkxIDEwLjA4IDIxLjUzMDQgMTAuMDggMjFWMjAuOTFDMTAuMDcyMyAyMC41NzkgOS45NjUxMiAyMC4yNTggOS43NzI1MSAxOS45ODg3QzkuNTc5OSAxOS43MTk0IDkuMzEwNzQgMTkuNTE0MyA5IDE5LjRDOC42OTgzOCAxOS4yNjY5IDguMzYzODEgMTkuMjI3MiA4LjAzOTQxIDE5LjI4NkM3LjcxNTAyIDE5LjM0NDggNy40MTU2OCAxOS40OTk1IDcuMTggMTkuNzNMNy4xMiAxOS43OUM2LjkzNDI1IDE5Ljk3NiA2LjcxMzY4IDIwLjEyMzUgNi40NzA4OCAyMC4yMjQxQzYuMjI4MDggMjAuMzI0OCA1Ljk2NzgzIDIwLjM3NjYgNS43MDUgMjAuMzc2NkM1LjQ0MjE3IDIwLjM3NjYgNS4xODE5MiAyMC4zMjQ4IDQuOTM5MTIgMjAuMjI0MUM0LjY5NjMyIDIwLjEyMzUgNC40NzU3NSAxOS45NzYgNC4yOSAxOS43OUM0LjEwNDA1IDE5LjYwNDMgMy45NTY1MyAxOS4zODM3IDMuODU1ODggMTkuMTQwOUMzLjc1NTIzIDE4Ljg5ODEgMy43MDM0MyAxOC42Mzc4IDMuNzAzNDMgMTguMzc1QzMuNzAzNDMgMTguMTEyMiAzLjc1NTIzIDE3Ljg1MTkgMy44NTU4OCAxNy42MDkxQzMuOTU2NTMgMTcuMzY2MyA0LjEwNDA1IDE3LjE0NTcgNC4yOSAxNi45Nkw0LjM1IDE2LjlDNC41ODA1NCAxNi42NjQzIDQuNzM1MTkgMTYuMzY1IDQuNzk0IDE2LjA0MDZDNC44NTI4MiAxNS43MTYyIDQuODEzMTIgMTUuMzgxNiA0LjY4IDE1LjA4QzQuNTUzMjQgMTQuNzg0MiA0LjM0Mjc2IDE0LjUzMiA0LjA3NDQ3IDE0LjM1NDNDMy44MDYxOCAxNC4xNzY2IDMuNDkxNzkgMTQuMDgxMyAzLjE3IDE0LjA4SDNDMi40Njk1NyAxNC4wOCAxLjk2MDg2IDEzLjg2OTMgMS41ODU3OSAxMy40OTQyQzEuMjEwNzEgMTMuMTE5MSAxIDEyLjYxMDQgMSAxMi4wOEMxIDExLjU0OTYgMS4yMTA3MSAxMS4wNDA5IDEuNTg1NzkgMTAuNjY1OEMxLjk2MDg2IDEwLjI5MDcgMi40Njk1NyAxMC4wOCAzIDEwLjA4SDMuMDlDMy40MjA5OSAxMC4wNzIzIDMuNzQyIDkuOTY1MTIgNC4wMTEzIDkuNzcyNTFDNC4yODA1OSA5LjU3OTkgNC40ODU3MiA5LjMxMDc0IDQuNiA5QzQuNzMzMTIgOC42OTgzOCA0Ljc3MjgyIDguMzYzODEgNC43MTQgOC4wMzk0MUM0LjY1NTE5IDcuNzE1MDIgNC41MDA1NCA3LjQxNTY4IDQuMjcgNy4xOEw0LjIxIDcuMTJDNC4wMjQwNSA2LjkzNDI1IDMuODc2NTMgNi43MTM2OCAzLjc3NTg4IDYuNDcwODhDMy42NzUyMyA2LjIyODA4IDMuNjIzNDMgNS45Njc4MyAzLjYyMzQzIDUuNzA1QzMuNjIzNDMgNS40NDIxNyAzLjY3NTIzIDUuMTgxOTIgMy43NzU4OCA0LjkzOTEyQzMuODc2NTMgNC42OTYzMiA0LjAyNDA1IDQuNDc1NzUgNC4yMSA0LjI5QzQuMzk1NzUgNC4xMDQwNSA0LjYxNjMyIDMuOTU2NTMgNC44NTkxMiAzLjg1NTg4QzUuMTAxOTIgMy43NTUyMyA1LjM2MjE3IDMuNzAzNDMgNS42MjUgMy43MDM0M0M1Ljg4NzgzIDMuNzAzNDMgNi4xNDgwOCAzLjc1NTIzIDYuMzkwODggMy44NTU4OEM2LjYzMzY4IDMuOTU2NTMgNi44NTQyNSA0LjEwNDA1IDcuMDQgNC4yOUw3LjEgNC4zNUM3LjMzNTY4IDQuNTgwNTQgNy42MzUwMiA0LjczNTE5IDcuOTU5NDEgNC43OTRDOC4yODM4MSA0Ljg1MjgyIDguNjE4MzggNC44MTMxMiA4LjkyIDQuNjhIOUM5LjI5NTc3IDQuNTUzMjQgOS41NDgwMiA0LjM0Mjc2IDkuNzI1NjkgNC4wNzQ0N0M5LjkwMzM3IDMuODA2MTggOS45OTg3MiAzLjQ5MTc5IDEwIDMuMTdWM0MxMCAyLjQ2OTU3IDEwLjIxMDcgMS45NjA4NiAxMC41ODU4IDEuNTg1NzlDMTAuOTYwOSAxLjIxMDcxIDExLjQ2OTYgMSAxMiAxQzEyLjUzMDQgMSAxMy4wMzkxIDEuMjEwNzEgMTMuNDE0MiAxLjU4NTc5QzEzLjc4OTMgMS45NjA4NiAxNCAyLjQ2OTU3IDE0IDNWMy4wOUMxNC4wMDEzIDMuNDExNzkgMTQuMDk2NiAzLjcyNjE4IDE0LjI3NDMgMy45OTQ0N0MxNC40NTIgNC4yNjI3NiAxNC43MDQyIDQuNDczMjQgMTUgNC42QzE1LjMwMTYgNC43MzMxMiAxNS42MzYyIDQuNzcyODIgMTUuOTYwNiA0LjcxNEMxNi4yODUgNC42NTUxOSAxNi41ODQzIDQuNTAwNTQgMTYuODIgNC4yN0wxNi44OCA0LjIxQzE3LjA2NTcgNC4wMjQwNSAxNy4yODYzIDMuODc2NTMgMTcuNTI5MSAzLjc3NTg4QzE3Ljc3MTkgMy42NzUyMyAxOC4wMzIyIDMuNjIzNDMgMTguMjk1IDMuNjIzNDNDMTguNTU3OCAzLjYyMzQzIDE4LjgxODEgMy42NzUyMyAxOS4wNjA5IDMuNzc1ODhDMTkuMzAzNyAzLjg3NjUzIDE5LjUyNDMgNC4wMjQwNSAxOS43MSA0LjIxQzE5Ljg5NiA0LjM5NTc1IDIwLjA0MzUgNC42MTYzMiAyMC4xNDQxIDQuODU5MTJDMjAuMjQ0OCA1LjEwMTkyIDIwLjI5NjYgNS4zNjIxNyAyMC4yOTY2IDUuNjI1QzIwLjI5NjYgNS44ODc4MyAyMC4yNDQ4IDYuMTQ4MDggMjAuMTQ0MSA2LjM5MDg4QzIwLjA0MzUgNi42MzM2OCAxOS44OTYgNi44NTQyNSAxOS43MSA3LjA0TDE5LjY1IDcuMUMxOS40MTk1IDcuMzM1NjggMTkuMjY0OCA3LjYzNTAyIDE5LjIwNiA3Ljk1OTQxQzE5LjE0NzIgOC4yODM4MSAxOS4xODY5IDguNjE4MzggMTkuMzIgOC45MlY5QzE5LjQ0NjggOS4yOTU3NyAxOS42NTcyIDkuNTQ4MDIgMTkuOTI1NSA5LjcyNTY5QzIwLjE5MzggOS45MDMzNyAyMC41MDgyIDkuOTk4NzIgMjAuODMgMTBIMjFDMjEuNTMwNCAxMCAyMi4wMzkxIDEwLjIxMDcgMjIuNDE0MiAxMC41ODU4QzIyLjc4OTMgMTAuOTYwOSAyMyAxMS40Njk2IDIzIDEyQzIzIDEyLjUzMDQgMjIuNzg5MyAxMy4wMzkxIDIyLjQxNDIgMTMuNDE0MkMyMi4wMzkxIDEzLjc4OTMgMjEuNTMwNCAxNCAyMSAxNEgyMC45MUMyMC41ODgyIDE0LjAwMTMgMjAuMjczOCAxNC4wOTY2IDIwLjAwNTUgMTQuMjc0M0MxOS43MzcyIDE0LjQ1MiAxOS41MjY4IDE0LjcwNDIgMTkuNCAxNVpcIiBbYXR0ci5zdHJva2VdPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJyA/ICcjMDBBM0ZGJyA6ICcjMzQ0MDU0J1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE3NzVfMzc5MzFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFRhc2sgQ29uZmlndXJhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGN1cnNvci1wb2ludGVyIHAtMyBtYi0zXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnID8gJ2FjdGl2ZScgOiAnJ1wiIChjbGljayk9XCJzZWxlY3RlZFRhYj0nYnJhbmRNZXRhJztpc0VkaXQ9dHJ1ZTtpc0JyYW5kTWV0YUVkaXQ9dHJ1ZTtmb3JtLmRpc2FibGUoKTt0YXNrRm9ybS5kaXNhYmxlKCk7YnJhbmRNZXRhRm9ybS5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA3LjVMMTIgM0wyMSA3LjVNMyA3LjVMMTIgMTJNMyA3LjVWMTYuNUwxMiAyMU0yMSA3LjVMMTIgMTJNMjEgNy41VjE2LjVMMTIgMjFNMTIgMTJWMjFcIiBbYXR0ci5zdHJva2VdPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZ1RleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICBCcmFuZCBNZXRhIERhdGFcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCIgaWQ9XCJjb25maWdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWNhcmRcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2JyYW5kJ1wiID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+QnJhbmQgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb248L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5EZWZpbmUgdGhlIGJyYW5kIGFuZCBtYXAgcHJvZHVjdHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBjYXRlZ29yaWVzLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImJ1bGtVcGxvYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBVcGxvYWQgQnJhbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJtdC0xMFwiICNmb3JtUmVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJicmFuZENvbmZpZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QnJhbmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Qcm9kdWN0IENhdGVnb3J5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UHJvZHVjdCBTdWItQ2F0ZWdvcnk8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDpjYWxjKDc1dmggLSAyNTBweCk7b3ZlcmZsb3cteTpTY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBicmFuZEdyb3VwIG9mIGJyYW5kQ29uZmlnPy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cInJvdyBtdC0zIG14LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCIgW2lkXT1cIid0ZXh0JytpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBbbmdDbGFzc109XCJicmFuZHNMaXN0Lmxlbmd0aCAmJiAhaXNFZGl0ICYmICFjaGVja1VzZWQoaSkgJiYgYnJhbmRHcm91cC5nZXQoJ2JyYW5kJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ2RhbmdlcicgOiAnJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXMtMyBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTUgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNC43MDcxIDguNzA3MTFDMTUuMDk3NiA4LjMxNjU4IDE1LjA5NzYgNy42ODM0MiAxNC43MDcxIDcuMjkyODlMOC4zNDMxNSAwLjkyODkzMkM3Ljk1MjYyIDAuNTM4NDA4IDcuMzE5NDYgMC41Mzg0MDggNi45Mjg5MyAwLjkyODkzMkM2LjUzODQxIDEuMzE5NDYgNi41Mzg0MSAxLjk1MjYyIDYuOTI4OTMgMi4zNDMxNUwxMi41ODU4IDhMNi45Mjg5MyAxMy42NTY5QzYuNTM4NDEgMTQuMDQ3NCA2LjUzODQxIDE0LjY4MDUgNi45Mjg5MyAxNS4wNzExQzcuMzE5NDYgMTUuNDYxNiA3Ljk1MjYyIDE1LjQ2MTYgOC4zNDMxNSAxNS4wNzExTDE0LjcwNzEgOC43MDcxMVpNMCA4VjlIMTRWOFY3SDBWOFpcIiBmaWxsPVwiI0QwRDVERFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgY2hpcC1ib3hcIiBmb3JtQXJyYXlOYW1lPVwiY2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIiBbbmdDbGFzc109XCJicmFuZHNMaXN0Lmxlbmd0aCAmJiAhaXNFZGl0ICYmICFjaGVja1VzZWQoaSkgJiYgYnJhbmRHcm91cC5nZXQoJ2NhdGVnb3J5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ2RhbmdlcicgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRDYXRlZ29yeShpKT8uY29udHJvbHM7bGV0IGo9aW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCIgW25nQ2xhc3NdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICdkaXNhYmxlZFRleHQnIDogJydcIj57e2l0ZW0udmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSkgPyAnJyA6cmVtb3ZlQ2F0ZWdvcnkoaSxqKVwiIFtjbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJ2Rpc2FibGVkVGV4dCc6J2N1cnNvci1wb2ludGVyJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBbYXR0ci5zdHJva2VdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcjYWViNGM1JyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IHBzLTMgbWUtM1wiIChjaGFuZ2UpPVwiYWRkQ2F0ZWdvcnkoJGV2ZW50LGkpXCIgW2lkXT1cIidjYXRlZ29yeUlucHV0JytpXCIgW2Rpc2FibGVkXT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeVwiIC8+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNSAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjcwNzEgOC43MDcxMUMxNS4wOTc2IDguMzE2NTggMTUuMDk3NiA3LjY4MzQyIDE0LjcwNzEgNy4yOTI4OUw4LjM0MzE1IDAuOTI4OTMyQzcuOTUyNjIgMC41Mzg0MDggNy4zMTk0NiAwLjUzODQwOCA2LjkyODkzIDAuOTI4OTMyQzYuNTM4NDEgMS4zMTk0NiA2LjUzODQxIDEuOTUyNjIgNi45Mjg5MyAyLjM0MzE1TDEyLjU4NTggOEw2LjkyODkzIDEzLjY1NjlDNi41Mzg0MSAxNC4wNDc0IDYuNTM4NDEgMTQuNjgwNSA2LjkyODkzIDE1LjA3MTFDNy4zMTk0NiAxNS40NjE2IDcuOTUyNjIgMTUuNDYxNiA4LjM0MzE1IDE1LjA3MTFMMTQuNzA3MSA4LjcwNzExWk0wIDhWOUgxNFY4VjdIMFY4WlwiIGZpbGw9XCIjRDBENUREXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGNoaXAtYm94XCIgZm9ybUFycmF5TmFtZT1cInN1YkNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldFN1YkNhdGVnb3J5KGkpPy5jb250cm9scztsZXQgaj1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIiBbbmdDbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJ2Rpc2FibGVkVGV4dCcgOiAnJ1wiPnt7aXRlbS52YWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcnIDogcmVtb3ZlU3ViQ2F0ZWdvcnkoaSxqKVwiIFtjbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJyc6J2N1cnNvci1wb2ludGVyJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBbYXR0ci5zdHJva2VdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcjYWViNGM1JyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IHBzLTMgbWUtM1wiIChjaGFuZ2UpPVwiYWRkU3ViQ2F0ZWdvcnkoJGV2ZW50LGkpXCIgW2lkXT1cIidzdWJDYXRlZ29yeUlucHV0JytpXCIgW2Rpc2FibGVkXT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeVwiIC8+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTRcIiAoY2xpY2spPVwiY2hlY2tVc2VkKGkpIHx8IGlzRWRpdCA/ICcnIDogcmVtb3ZlQnJhbmQoaSlcIiAqbmdJZj1cImJyYW5kQ29uZmlnLnZhbHVlLmxlbmd0aCA+IDFcIiBbbmdDbGFzc109XCJjaGVja1VzZWQoaSkgfHwgaXNFZGl0ID8gJ2N1cnNvci1kZWZhdWx0JyA6ICdjdXJzb3ItcG9pbnRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjUgNC41TDQuNSAxMy41TTQuNSA0LjVMMTMuNSAxMy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG10LTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJhZGRCcmFuZCgpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjY3NVYxNS44MzM0TTQuMTY2NzUgMTAuMDAwMUgxNS44MzM0XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEFkZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cImlzRWRpdFwiIChjbGljayk9XCJpc0VkaXQgPSBmYWxzZTtmb3JtRW5hYmxlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNzc1XzM3OTg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTc3NV8zNzk4NVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gRWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiICpuZ0lmPVwiIWlzRWRpdFwiIChjbGljayk9XCJ1cGRhdGVCcmFuZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+QnJhbmQgTWV0YSBEYXRhPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+TWFpbnRhaW4gdGhlIFBpZCBDYXQgJiM4NTk0OyBCcmFuZCAvIENhdGVnb3J5IC8gQmFuZCBtYXBwaW5nIHVzZWQgZHVyaW5nIHBsYW5vZ3JhbSBleHBvcnQuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozNjBweDtmbGV4LXNocmluazowXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiIHN0eWxlPVwibGVmdDoxMnB4O3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMSAyMUwxNi42NSAxNi42NU0xOSAxMUMxOSAxNS40MTgzIDE1LjQxODMgMTkgMTEgMTlDNi41ODE3MiAxOSAzIDE1LjQxODMgMyAxMUMzIDYuNTgxNzIgNi41ODE3MiAzIDExIDNDMTUuNDE4MyAzIDE5IDYuNTgxNzIgMTkgMTFaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjM4cHhcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQaWQgQ2F0LCBUZW1wIEdyb3VwLCBDYXRlZ29yeSwgQnJhbmQgb3IgQmFuZFwiIFsobmdNb2RlbCldPVwiYnJhbmRNZXRhU2VhcmNoXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBtdC0xXCIgKm5nSWY9XCJicmFuZE1ldGFEYXRhPy5jb250cm9scz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgZmlsdGVyZWRCcmFuZE1ldGFDb3VudCB9fSBvZiB7eyBicmFuZE1ldGFEYXRhLmNvbnRyb2xzLmxlbmd0aCB9fSByb3cocyk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImJyYW5kTWV0YUZvcm1cIiBjbGFzcz1cIm10LTNcIiAjYnJhbmRNZXRhUmVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJicmFuZE1ldGFEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG14LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpZCBDYXQ8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRlbXAgR3JvdXA8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNhdGVnb3J5PC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHAtMCBwcy0yXCI+PGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj5CcmFuZDwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBwLTAgcHMtMlwiPjxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QmFuZDwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OmNhbGMoNzV2aCAtIDI4MHB4KTtvdmVyZmxvdy15OnNjcm9sbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYnJhbmRNZXRhRGF0YT8uY29udHJvbHM/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcC01IHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gYnJhbmQgbWV0YSBkYXRhIGZvdW5kLiBDbGljayBcIkVkaXRcIiB0aGVuIFwiQWRkXCIgdG8gY3JlYXRlIGEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJicmFuZE1ldGFEYXRhPy5jb250cm9scz8ubGVuZ3RoICYmICFmaWx0ZXJlZEJyYW5kTWV0YUNvdW50XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwLTUgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByb3dzIG1hdGNoIFwie3sgYnJhbmRNZXRhU2VhcmNoIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZXRhR3JvdXAgb2YgYnJhbmRNZXRhRGF0YT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJyb3cgbXQtMyBteC0wXCIgW2lkXT1cIidtZXRhUm93JyArIGlcIiBbaGlkZGVuXT1cIiFtYXRjaGVzQnJhbmRNZXRhU2VhcmNoKG1ldGFHcm91cClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBpZENhdFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy1waWRDYXQnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCdwaWRDYXQnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgncGlkQ2F0Jyk/LnRvdWNoZWQgPyAnZGFuZ2VyJyA6ICcnXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRlbXBHcm91cFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy10ZW1wR3JvdXAnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCd0ZW1wR3JvdXAnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgndGVtcEdyb3VwJyk/LnRvdWNoZWQgPyAnZGFuZ2VyJyA6ICcnXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5XCIgW2lkXT1cIidtZXRhUm93JyArIGkgKyAnLWNhdGVnb3J5J1wiIFtuZ0NsYXNzXT1cIiFpc0JyYW5kTWV0YUVkaXQgJiYgbWV0YUdyb3VwLmdldCgnY2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgnY2F0ZWdvcnknKT8udG91Y2hlZCA/ICdkYW5nZXInIDogJydcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBbaWRdPVwiJ21ldGFSb3cnICsgaSArICctYnJhbmQnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCdicmFuZCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBtZXRhR3JvdXAuZ2V0KCdicmFuZCcpPy50b3VjaGVkID8gJ2RhbmdlcicgOiAnJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBwLTAgcHMtMiBkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYmFuZFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy1iYW5kJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTNcIiAoY2xpY2spPVwiaXNCcmFuZE1ldGFFZGl0ID8gJycgOiByZW1vdmVCcmFuZE1ldGFSb3coaSlcIiBbbmdDbGFzc109XCJpc0JyYW5kTWV0YUVkaXQgPyAnY3Vyc29yLWRlZmF1bHQnIDogJ2N1cnNvci1wb2ludGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjUgNC41TDQuNSAxMy41TTQuNSA0LjVMMTMuNSAxMy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImFkZEJyYW5kTWV0YVJvdygpXCIgW2Rpc2FibGVkXT1cImlzQnJhbmRNZXRhRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjY3NVYxNS44MzM0TTQuMTY2NzUgMTAuMDAwMUgxNS44MzM0XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEFkZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cIiFpc0JyYW5kTWV0YUVkaXRcIiAoY2xpY2spPVwiY2FuY2VsQnJhbmRNZXRhRWRpdCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtcy0yXCIgKm5nSWY9XCJpc0JyYW5kTWV0YUVkaXRcIiAoY2xpY2spPVwiZW5hYmxlQnJhbmRNZXRhRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTc3NV8zNzk5MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQuMTY2NyAyLjQ5OTkzQzE0LjM4NTYgMi4yODEwNiAxNC42NDU1IDIuMTA3NDQgMTQuOTMxNCAxLjk4ODk5QzE1LjIxNzQgMS44NzA1NCAxNS41MjM5IDEuODA5NTcgMTUuODMzNCAxLjgwOTU3QzE2LjE0MjkgMS44MDk1NyAxNi40NDk0IDEuODcwNTQgMTYuNzM1NCAxLjk4ODk5QzE3LjAyMTQgMi4xMDc0NCAxNy4yODEyIDIuMjgxMDYgMTcuNTAwMSAyLjQ5OTkzQzE3LjcxOSAyLjcxODggMTcuODkyNiAyLjk3ODYzIDE4LjAxMSAzLjI2NDZDMTguMTI5NSAzLjU1MDU3IDE4LjE5MDQgMy44NTcwNiAxOC4xOTA0IDQuMTY2NTlDMTguMTkwNCA0LjQ3NjEyIDE4LjEyOTUgNC43ODI2MiAxOC4wMTEgNS4wNjg1OUMxNy44OTI2IDUuMzU0NTUgMTcuNzE5IDUuNjE0MzkgMTcuNTAwMSA1LjgzMzI2TDYuMjUwMDggMTcuMDgzM0wxLjY2Njc1IDE4LjMzMzNMMi45MTY3NSAxMy43NDk5TDE0LjE2NjcgMi40OTk5M1pcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE3NzVfMzc5OTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMlwiICpuZ0lmPVwiIWlzQnJhbmRNZXRhRWRpdFwiIChjbGljayk9XCJ1cGRhdGVCcmFuZE1ldGFEYXRhKClcIj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJ1wiID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+R2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRhc2tzPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGFwcGxpZXMgdG8gYWxsIHB1Ymxpc2hlZCB0YXNrcy48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBVcGxvYWQgQnJhbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ0YXNrRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1ZSBkYXlzICh0byBjb21wbGV0ZSB0YXNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkdWVEYXlcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVlIHRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVlVGltZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tsaXN0dHVybm9mZiBtcy0zIG10LTQgZnYtcGx1Z2lucy1pY29uLWNvbnRhaW5lIGNvbC1tZC04IGRpdldpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZ2VvRmVuY2luZ1wiIFtjaGVja2VkXT1cInRhc2tGb3JtLmdldCgnYWxsb3dlZFN0b3JlTG9jYXRpb24nKT8udmFsdWVcIiBmb3JtQ29udHJvbE5hbWU9XCJhbGxvd2VkU3RvcmVMb2NhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHN1YlwiIFtuZ0NsYXNzXT1cInRhc2tGb3JtLmdldCgnYWxsb3dlZFN0b3JlTG9jYXRpb24nKT8udmFsdWUgPyAnYWN0aXZlJyA6ICcnXCIgZm9yPVwiZ2VvRmVuY2luZ1wiPkdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPjxicj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBzdWJ0ZXh0XCIgW25nQ2xhc3NdPVwidGFza0Zvcm0uZ2V0KCdhbGxvd2VkU3RvcmVMb2NhdGlvbicpPy52YWx1ZSA/ICdhY3RpdmUnIDogJydcIiBmb3I9XCJnZW9GZW5jaW5nXCI+QnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsaW5nLCB0aGUgY2hlY2tsaXN0IGNhbiBiZSBmaWxsZWQgYnkgdGhlIHVzZXIgb25seSB3aGVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIHN0b3JlLjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cImlzRWRpdFwiIChjbGljayk9XCJpc0VkaXQgPSBmYWxzZTt0YXNrRm9ybS5lbmFibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNzc1XzM3OTg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNzc1XzM3OTg1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCIhaXNFZGl0XCIgKGNsaWNrKT1cInVwZGF0ZVRhc2soKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiJdfQ==
446
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tY29uZmlndXJhdGlvbnMvcGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tY29uZmlndXJhdGlvbnMvcGxhbm8tY29uZmlndXJhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBSUwsV0FBVyxFQUVYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBT3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7OztBQVE1RCxNQUFNLE9BQU8sNEJBQTRCO0lBZTdCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXRCYSxPQUFPLENBQWE7SUFDZixZQUFZLENBQWE7SUFDckQsV0FBVyxHQUFXLE9BQU8sQ0FBQztJQUM5QixJQUFJLENBQWE7SUFDakIsUUFBUSxDQUFTO0lBQ2pCLFVBQVUsR0FBbUIsRUFBRSxDQUFDO0lBQ2hDLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLENBQVk7SUFDcEIsYUFBYSxDQUFhO0lBQzFCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsZUFBZSxHQUFZLElBQUksQ0FBQztJQUNoQyxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLFlBQ1UsRUFBZSxFQUNmLFdBQTZCLEVBQzdCLEVBQXNCLEVB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QU0sQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUMvQixDQUFDLE1BQU0sQ0FBQztJQUNYLENBQUM7d0dBeGZVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLG1RQ3ZCekMsMGltQ0E4V0E7OzRGRHZWYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0UsMEJBQTBCO3VUQUtiLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDTyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEZvcm1BcnJheSxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvcGxhbm8tZGF0YS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBvcHVwc0NvbXBvbmVudCB9IGZyb20gXCIuL3BvcHVwcy9wb3B1cHMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEJyYW5kRGV0YWlscyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItcGxhbm8tY29uZmlndXJhdGlvbnNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3BsYW5vLWNvbmZpZ3VyYXRpb25zLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9wbGFuby1jb25maWd1cmF0aW9ucy5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGxhbm9Db25maWd1cmF0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgIEBWaWV3Q2hpbGQoJ2Zvcm1SZWYnKSBmb3JtUmVmOiBFbGVtZW50UmVmO1xyXG4gICBAVmlld0NoaWxkKCdicmFuZE1ldGFSZWYnKSBicmFuZE1ldGFSZWY6IEVsZW1lbnRSZWY7XHJcbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyA9IFwiYnJhbmRcIjtcclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgYnJhbmRzTGlzdDogQnJhbmREZXRhaWxzW10gPSBbXTtcclxuICBsb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0VkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0YXNrRm9ybTogRm9ybUdyb3VwO1xyXG4gIGJyYW5kTWV0YUZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgYnJhbmRNZXRhTGlzdDogYW55W10gPSBbXTtcclxuICBpc0JyYW5kTWV0YUVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGJyYW5kTWV0YVNlYXJjaDogc3RyaW5nID0gXCJcIjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogUGxhbm9EYXRhU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGVsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxuICApIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhpZGRlbiBlbnRyeSBwb2ludCB0byB0aGUgaW50ZXJuYWwgcGxhbm8tdG9vbHMgcGFnZS5cclxuICAgKiBUcmlnZ2VyZWQgZnJvbSBhbiBpbnZpc2libGUgMcOXMSBoaXQtYXJlYSBiZWxvdyB0aGUgY29uZmlnIHNpZGUgY2FyZCDigJRcclxuICAgKiBmb3Igb3BzL2RldnMgd2hvIGtub3cgaXQncyB0aGVyZS4gTm90IGRpc2NvdmVyYWJsZSBpbiB0aGUgVUkuXHJcbiAgICovXHJcbiAgZ29Ub1BsYW5vVG9vbHMoKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHNcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcclxuICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUuc3Vic2NyaWJlKGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB0aGlzLmxvYWRCcmFuZERhdGEoKTtcclxuICAgICAgICB0aGlzLmxvYWRUYXNrRGF0YSgpO1xyXG4gICAgICAgIHRoaXMubG9hZEJyYW5kTWV0YURhdGEoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5sb2FkQnJhbmREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkVGFza0RhdGEoKTtcclxuICAgICAgICB0aGlzLmxvYWRCcmFuZE1ldGFEYXRhKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ29uZmlndXJhdGlvblwiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZEJyYW5kRGF0YSgpIHtcclxuICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQpO1xyXG4gICAgdGhpcy5kYXRhU2VydmljZS5icmFuZHNMaXN0LnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICB0aGlzLmJyYW5kc0xpc3QgPSBlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYnJhbmRzTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRCcmFuZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRUYXNrRGF0YSgpIHtcclxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0VGFza0NvbmZpZyh0aGlzLmNsaWVudElkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGFza0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIGR1ZURheTogW3Jlcy5kYXRhLmR1ZURheSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBkdWVUaW1lOiBbcmVzLmRhdGEuZHVlVGltZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBhbGxvd2VkU3RvcmVMb2NhdGlvbjogW1xyXG4gICAgICAgICAgICByZXMuZGF0YS5hbGxvd2VkU3RvcmVMb2NhdGlvbixcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50YXNrRm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0YSgpIHtcclxuICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBicmFuZENvbmZpZzogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJyYW5kc0xpc3QuZm9yRWFjaCgoZTogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgYnJhbmRHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGJyYW5kOiBbXHJcbiAgICAgICAgICB7IHZhbHVlOiBlLmJyYW5kTmFtZSwgZGlzYWJsZWQ6IGUuaXNVc2VkIH0sXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZmIuYXJyYXkoZT8uY2F0ZWdvcnkpLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiB0aGlzLmZiLmFycmF5KGU/LnN1YkNhdGVnb3J5KSxcclxuICAgICAgICBpc1VzZWQ6IFtlPy5pc1VzZWRdLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWcucHVzaChicmFuZEdyb3VwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEZvcm0oKSB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYnJhbmRDb25maWc6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50YXNrRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBkdWVEYXk6IFsxLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgZHVlVGltZTogW1wiMjM6NTlcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGFsbG93ZWRTdG9yZUxvY2F0aW9uOiBbZmFsc2UsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5icmFuZE1ldGFGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kTWV0YURhdGE6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYnJhbmRDb25maWcoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiYnJhbmRDb25maWdcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkQnJhbmQoKSB7XHJcbiAgICB0aGlzLmJyYW5kQ29uZmlnLnB1c2goXHJcbiAgICAgIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgYnJhbmRFbGVtZW50ID0gdGhpcy5mb3JtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICBgI3RleHQke3RoaXMuYnJhbmRDb25maWcubGVuZ3RoIC0gMX1gXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoYnJhbmRFbGVtZW50KSB7XHJcbiAgICAgICAgYnJhbmRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiY2VudGVyXCIsIGJlaGF2aW9yOiBcInNtb290aFwiIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQnJhbmQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5icmFuZENvbmZpZy5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBnZXRDYXRlZ29yeShjYXRJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuYnJhbmRDb25maWcuYXQoY2F0SW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICBcImNhdGVnb3J5XCJcclxuICAgICkgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2F0ZWdvcnkoaW5kZXg6IG51bWJlciwgY2F0SW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2F0ZWdvcnlBcnJheSA9ICh0aGlzLmJyYW5kQ29uZmlnLmF0KGluZGV4KSBhcyBGb3JtR3JvdXApLmdldChcclxuICAgICAgXCJjYXRlZ29yeVwiXHJcbiAgICApIGFzIEZvcm1BcnJheTtcclxuICAgIGNhdGVnb3J5QXJyYXkucmVtb3ZlQXQoY2F0SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ2F0ZWdvcnkoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU/LnRyaW0oKTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBjYXRlZ29yeUFycmF5ID0gKHRoaXMuYnJhbmRDb25maWcuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICAgIFwiY2F0ZWdvcnlcIlxyXG4gICAgICApIGFzIEZvcm1BcnJheTtcclxuICAgICAgY2F0ZWdvcnlBcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbCh2YWx1ZSkpO1xyXG5cclxuICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICAgIGBjYXRlZ29yeUlucHV0JHtpbmRleH1gXHJcbiAgICAgICkgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgIGlmIChpbnB1dFZhbHVlKSB7XHJcbiAgICAgICAgaW5wdXRWYWx1ZS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN1YkNhdGVnb3J5KGNhdEluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAodGhpcy5icmFuZENvbmZpZy5hdChjYXRJbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoXHJcbiAgICAgIFwic3ViQ2F0ZWdvcnlcIlxyXG4gICAgKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTdWJDYXRlZ29yeShpbmRleDogbnVtYmVyLCBjYXRJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjYXRlZ29yeUFycmF5ID0gKHRoaXMuYnJhbmRDb25maWcuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KFxyXG4gICAgICBcInN1YkNhdGVnb3J5XCJcclxuICAgICkgYXMgRm9ybUFycmF5O1xyXG4gICAgY2F0ZWdvcnlBcnJheS5yZW1vdmVBdChjYXRJbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRTdWJDYXRlZ29yeShldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZT8udHJpbSgpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5QXJyYXkgPSAodGhpcy5icmFuZENvbmZpZy5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoXHJcbiAgICAgICAgXCJzdWJDYXRlZ29yeVwiXHJcbiAgICAgICkgYXMgRm9ybUFycmF5O1xyXG4gICAgICBjYXRlZ29yeUFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKHZhbHVlKSk7XHJcblxyXG4gICAgICBjb25zdCBpbnB1dFZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgYHN1YkNhdGVnb3J5SW5wdXQke2luZGV4fWBcclxuICAgICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgICAgaWYgKGlucHV0VmFsdWUpIHtcclxuICAgICAgICBpbnB1dFZhbHVlLnZhbHVlID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tVc2VkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmJyYW5kQ29uZmlnLmF0KGluZGV4KS5nZXQoXCJpc1VzZWRcIik/LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlQnJhbmQoKSB7XHJcbiAgICBsZXQgYnJhbmREYXRhID0gdGhpcy5icmFuZENvbmZpZy52YWx1ZTtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJSZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZHVwbGljYXRlczogYW55ID0gW107XHJcbiAgICBsZXQgZXJyb3I6IGFueSA9IFtdO1xyXG4gICAgbGV0IGJyYW5kOiBhbnkgPSBicmFuZERhdGEuZmxhdE1hcCgoZWxlOiBhbnkpID0+IGVsZS5icmFuZCk7XHJcbiAgICBkdXBsaWNhdGVzID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgIGJyYW5kLmZpbHRlcigoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiBicmFuZC5pbmRleE9mKGl0ZW0pICE9PSBpbmRleClcclxuICAgICAgKSxcclxuICAgIF07XHJcbiAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGgpIHtcclxuICAgICAgZXJyb3IucHVzaChgJHtkdXBsaWNhdGVzLnRvU3RyaW5nKCl9IC0gYnJhbmQgaXMgZHVwbGljYXRlZGApO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhdGVnb3J5OiBhbnkgPSBicmFuZERhdGEuZmxhdE1hcCgoZWxlOiBhbnkpID0+IGVsZS5jYXRlZ29yeSk7XHJcbiAgICBsZXQgZHVwbGljYXRlQ2F0ID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgIGNhdGVnb3J5LmZpbHRlcihcclxuICAgICAgICAgIChpdGVtOiBhbnksIGluZGV4OiBhbnkpID0+IGNhdGVnb3J5LmluZGV4T2YoaXRlbSkgIT09IGluZGV4XHJcbiAgICAgICAgKVxyXG4gICAgICApLFxyXG4gICAgXTtcclxuICAgIGlmIChkdXBsaWNhdGVDYXQubGVuZ3RoKSB7XHJcbiAgICAgIGVycm9yLnB1c2goXHJcbiAgICAgICAgYCR7QXJyYXkuZnJvbShkdXBsaWNhdGVDYXQpLnRvU3RyaW5nKCl9IC0gYnJhbmQgY2F0ZWdvcnkgaXMgZHVwbGljYXRlZGBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgJHtlcnJvci50b1N0cmluZygpfSBgKTtcclxuICAgIH1cclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgYnJhbmREYXRhOiBicmFuZERhdGEsXHJcbiAgICAgIGJyYW5kVXNlZExpc3Q6IHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgIC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUuaXNVc2VkKVxyXG4gICAgICAgIC5tYXAoKGVsZTogYW55KSA9PiBlbGUuX2lkKSxcclxuICAgIH07XHJcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmFkZFVwZGF0ZUJyYW5kKGRhdGEpLnN1YnNjcmliZShcclxuICAgICAgYXN5bmMgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiQnJhbmQgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uXCIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGFzaygpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgLi4udGhpcy50YXNrRm9ybS52YWx1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS51cGRhdGVUYXNrKGRhdGEpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudGFza0Zvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcIlRhc2sgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLlwiKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJ1bGtVcGxvYWQoKSB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubW9kZWxTZXJ2aWNlLm9wZW4oUG9wdXBzQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b3RhbEl0ZW1Db3VudCA9IHRoaXMuYnJhbmRzTGlzdC5sZW5ndGg7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b3RhbEl0ZW1Db3VudCA9IHRoaXMuYnJhbmRzTGlzdC5sZW5ndGg7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5icmFuZExpc3QgPSB0aGlzLmJyYW5kc0xpc3Q7XHJcblxyXG4gICAgbW9kZWxSZWYucmVzdWx0LnRoZW4oYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5mZXRjaEJyYW5kc0xpc3QodGhpcy5jbGllbnRJZCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9ybUVuYWJsZSgpIHtcclxuICAgIGxldCBicmFuZEluZm8gPSB0aGlzLmZvcm0uZ2V0KFwiYnJhbmRDb25maWdcIikgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgIGJyYW5kSW5mby5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLmdldChcImlzVXNlZFwiKT8udmFsdWUpIHtcclxuICAgICAgICBjb250cm9sLmdldChcImJyYW5kXCIpPy5lbmFibGUoKTtcclxuICAgICAgICBjb250cm9sLmdldChcImNhdGVnb3J5XCIpPy5lbmFibGUoKTtcclxuICAgICAgICBjb250cm9sLmdldChcInN1YkNhdGVnb3J5XCIpPy5lbmFibGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYnJhbmRNZXRhRGF0YSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuYnJhbmRNZXRhRm9ybS5nZXQoXCJicmFuZE1ldGFEYXRhXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGxvYWRCcmFuZE1ldGFEYXRhKCkge1xyXG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmVzPy5kYXRhKSA/IHJlcy5kYXRhIDogW107XHJcbiAgICAgICAgdGhpcy5icmFuZE1ldGFMaXN0ID0gcm93cztcclxuICAgICAgICB0aGlzLmJ1aWxkQnJhbmRNZXRhRm9ybShyb3dzKTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYnJhbmRNZXRhTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuYnVpbGRCcmFuZE1ldGFGb3JtKFtdKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkQnJhbmRNZXRhRm9ybShyb3dzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5icmFuZE1ldGFGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kTWV0YURhdGE6IHRoaXMuZmIuYXJyYXkoXHJcbiAgICAgICAgcm93cy5tYXAoKHJvdykgPT5cclxuICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBwaWRDYXQ6IFtyb3c/LnBpZENhdCA/PyBcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgdGVtcEdyb3VwOiBbcm93Py50ZW1wR3JvdXAgPz8gXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiBbcm93Py5jYXRlZ29yeSA/PyBcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgYnJhbmQ6IFtyb3c/LmJyYW5kID8/IFwiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBiYW5kOiBbcm93Py5iYW5kID8/IFwiXCJdLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICksXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaXNCcmFuZE1ldGFFZGl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuYnJhbmRNZXRhRm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGFkZEJyYW5kTWV0YVJvdygpIHtcclxuICAgIHRoaXMuYnJhbmRNZXRhRGF0YS5wdXNoKFxyXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBwaWRDYXQ6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB0ZW1wR3JvdXA6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICBjYXRlZ29yeTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgYmFuZDogW1wiXCJdLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBsYXN0Um93ID0gdGhpcy5icmFuZE1ldGFSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgYCNtZXRhUm93JHt0aGlzLmJyYW5kTWV0YURhdGEubGVuZ3RoIC0gMX1gXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChsYXN0Um93KSB7XHJcbiAgICAgICAgbGFzdFJvdy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiBcImNlbnRlclwiLCBiZWhhdmlvcjogXCJzbW9vdGhcIiB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUJyYW5kTWV0YVJvdyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmJyYW5kTWV0YURhdGEucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQnJhbmRNZXRhRm9ybSgpIHtcclxuICAgIHRoaXMuaXNCcmFuZE1ldGFFZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmJyYW5kTWV0YUZvcm0uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEJyYW5kTWV0YUVkaXQoKSB7XHJcbiAgICB0aGlzLmJ1aWxkQnJhbmRNZXRhRm9ybSh0aGlzLmJyYW5kTWV0YUxpc3QpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQnJhbmRNZXRhRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmJyYW5kTWV0YUZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmJyYW5kTWV0YUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLmZvY3VzRmlyc3RJbnZhbGlkQnJhbmRNZXRhRmllbGQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuYnJhbmRNZXRhRGF0YS52YWx1ZTtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IGR1cGVzOiB7IHJvdzogbnVtYmVyOyBjb21ibzogc3RyaW5nIH1bXSA9IFtdO1xyXG4gICAgcm93cy5mb3JFYWNoKChyOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBgJHsoci5waWRDYXQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCl9fCR7KHIudGVtcEdyb3VwIHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWA7XHJcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgZHVwZXMucHVzaCh7IHJvdzogaSwgY29tYm86IGAke3IucGlkQ2F0fSAvICR7ci50ZW1wR3JvdXB9YCB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChkdXBlcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZmlyc3QgPSBkdXBlc1swXTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGBSb3cgJHtmaXJzdC5yb3cgKyAxfTogZHVwbGljYXRlIFBpZCBDYXQgKyBUZW1wIEdyb3VwIFwiJHtmaXJzdC5jb21ib31cImBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zY3JvbGxBbmRGbGFzaEJyYW5kTWV0YUZpZWxkKGZpcnN0LnJvdywgXCJwaWRDYXRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBicmFuZE1ldGFEYXRhOiByb3dzLFxyXG4gICAgfTtcclxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudXBkYXRlQnJhbmRNZXRhRGF0YShwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcIkJyYW5kIE1ldGEgRGF0YSB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuYnJhbmRNZXRhTGlzdCA9IHJvd3M7XHJcbiAgICAgICAgICB0aGlzLmlzQnJhbmRNZXRhRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmJyYW5kTWV0YUZvcm0uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLlwiKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQlJBTkRfTUVUQV9GSUVMRF9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBwaWRDYXQ6IFwiUGlkIENhdFwiLFxyXG4gICAgdGVtcEdyb3VwOiBcIlRlbXAgR3JvdXBcIixcclxuICAgIGNhdGVnb3J5OiBcIkNhdGVnb3J5XCIsXHJcbiAgICBicmFuZDogXCJCcmFuZFwiLFxyXG4gICAgYmFuZDogXCJCYW5kXCIsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c0ZpcnN0SW52YWxpZEJyYW5kTWV0YUZpZWxkKCkge1xyXG4gICAgY29uc3QgY29udHJvbHMgPSB0aGlzLmJyYW5kTWV0YURhdGEuY29udHJvbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbHNbaV0gYXMgRm9ybUdyb3VwO1xyXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkS2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuQlJBTkRfTUVUQV9GSUVMRF9MQUJFTFMpKSB7XHJcbiAgICAgICAgY29uc3QgY3RybCA9IGdyb3VwLmdldChmaWVsZEtleSk7XHJcbiAgICAgICAgaWYgKGN0cmwgJiYgY3RybC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGBSb3cgJHtpICsgMX06ICR7dGhpcy5CUkFORF9NRVRBX0ZJRUxEX0xBQkVMU1tmaWVsZEtleV19IGlzIHJlcXVpcmVkYFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsQW5kRmxhc2hCcmFuZE1ldGFGaWVsZChpLCBmaWVsZEtleSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJSZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxBbmRGbGFzaEJyYW5kTWV0YUZpZWxkKHJvd0luZGV4OiBudW1iZXIsIGZpZWxkS2V5OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmJyYW5kTWV0YVNlYXJjaD8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMuYnJhbmRNZXRhU2VhcmNoID0gXCJcIjtcclxuICAgIH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICAgIGBtZXRhUm93JHtyb3dJbmRleH0tJHtmaWVsZEtleX1gXHJcbiAgICAgICkgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgIGlmICghZWwpIHJldHVybjtcclxuICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJjZW50ZXJcIiwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBlbC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJkYW5nZXItZmxhc2hcIik7XHJcbiAgICAgIHZvaWQgZWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJkYW5nZXItZmxhc2hcIik7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZShcImRhbmdlci1mbGFzaFwiKSwgMTUwMCk7XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBtYXRjaGVzQnJhbmRNZXRhU2VhcmNoKGdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmJyYW5kTWV0YVNlYXJjaD8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXEpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgZmllbGRzID0gW1wicGlkQ2F0XCIsIFwidGVtcEdyb3VwXCIsIFwiY2F0ZWdvcnlcIiwgXCJicmFuZFwiLCBcImJhbmRcIl07XHJcbiAgICByZXR1cm4gZmllbGRzLnNvbWUoKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB2YWwgPSBncm91cC5nZXQoa2V5KT8udmFsdWU7XHJcbiAgICAgIHJldHVybiAodmFsID8/IFwiXCIpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkQnJhbmRNZXRhQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmJyYW5kTWV0YURhdGEuY29udHJvbHMuZmlsdGVyKChjKSA9PlxyXG4gICAgICB0aGlzLm1hdGNoZXNCcmFuZE1ldGFTZWFyY2goYylcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcGxhbm9Db25maWdcIj5cclxuICAgICAgICA8IS0tIEhpZGRlbiBwbGFuby10b29scyBlbnRyeS4gU2l6ZWQgMTIww5c0MCBweCwgdHJhbnNwYXJlbnQg4oCUIGludmlzaWJsZVxyXG4gICAgICAgICAgICAgdG8gcmVndWxhciB1c2VycyBidXQgcmVhY2hhYmxlIGJ5IG9wcy9kZXZzIHdobyBrbm93IHRoZSBzcG90LlxyXG4gICAgICAgICAgICAgUGxhY2VkIGF0IHRoZSBib3R0b20tbGVmdCwgYmVsb3cgdGhlIGNvbmZpZyBzaWRlIGNhcmQuIC0tPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIHBsYW5vIHRvb2xzXCJcclxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicGxhbm8tdG9vbHMtaGlkZGVuLWVudHJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QbGFub1Rvb2xzKClcIj48L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicy1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY3Vyc29yLXBvaW50ZXIgcC0zIG1iLTNcIiBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2JyYW5kJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWIgPSdicmFuZCc7aXNFZGl0PXRydWU7aXNCcmFuZE1ldGFFZGl0PXRydWU7Zm9ybS5kaXNhYmxlKCk7dGFza0Zvcm0uZGlzYWJsZSgpO2JyYW5kTWV0YUZvcm0uZGlzYWJsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjE3NTUgNC4yMjIyNUMxNC4xNzY2IDIuOTk0NDUgMTEuNjczMSAyIDguNTg4MzIgMkM1LjUwMzU3IDIgMy4wMDIyNCAyLjk5NTU3IDMgNC4yMjIyNU0zIDQuMjIyMjVDMyA1LjQ1MDA0IDUuNTAxMzMgNi40NDQ0OSA4LjU4ODMyIDYuNDQ0NDlDMTEuNjc1MyA2LjQ0NDQ5IDE0LjE3NjYgNS40NTAwNCAxNC4xNzY2IDQuMjIyMjVMMTQuMTc2NiAxMi44NDQ1TTMgNC4yMjIyNVYxNy41NTU2QzMuMDAxMTIgMTguNzgzNCA1LjUwMjQ1IDE5Ljc3NzkgOC41ODgzMiAxOS43Nzc5QzEwLjA4NDkgMTkuNzc3OSAxMS40MzYxIDE5LjU0MTIgMTIuNDM4NyAxOS4xNjAxTTMuMDAxMTIgOC42NjY3MkMzLjAwMTEyIDkuODk0NTEgNS41MDI0NSAxMC44ODkgOC41ODk0NCAxMC44ODlDMTEuNjc2NCAxMC44ODkgMTQuMTc3OCA5Ljg5NDUxIDE0LjE3NzggOC42NjY3Mk0xMi41MDU3IDE0LjY5NDZDMTEuNDk3NiAxNS4wODkxIDEwLjExNSAxNS4zMzM1IDguNTg4MzIgMTUuMzMzNUM1LjUwMjQ1IDE1LjMzMzUgMy4wMDExMiAxNC4zMzkxIDMuMDAxMTIgMTMuMTExM00yMC41MjcyIDEzLjQ2NDZDMjIuNDkwOSAxNS40MTY5IDIyLjQ5MDkgMTguNTgzNiAyMC41MjcyIDIwLjUzNThDMTguNTYzNSAyMi40ODgxIDE1LjM3ODEgMjIuNDg4MSAxMy40MTQ0IDIwLjUzNThDMTEuNDUwNyAxOC41ODM2IDExLjQ1MDcgMTUuNDE2OSAxMy40MTQ0IDEzLjQ2NDZDMTUuMzc4MSAxMS41MTI0IDE4LjU2MzUgMTEuNTEyNCAyMC41MjcyIDEzLjQ2NDZaXCIgW2F0dHIuc3Ryb2tlXT1cInNlbGVjdGVkVGFiID09PSAnYnJhbmQnID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWdUZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQnJhbmQgYW5kIFByb2R1Y3QgTWFwcGluZ1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGN1cnNvci1wb2ludGVyIHAtMyBtYi0zXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWIgPSd0YXNrJztpc0VkaXQ9dHJ1ZTtpc0JyYW5kTWV0YUVkaXQ9dHJ1ZTtmb3JtLmRpc2FibGUoKTt0YXNrRm9ybS5kaXNhYmxlKCk7YnJhbmRNZXRhRm9ybS5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTc3NV8zNzkzMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiAxNUMxMy42NTY5IDE1IDE1IDEzLjY1NjkgMTUgMTJDMTUgMTAuMzQzMSAxMy42NTY5IDkgMTIgOUMxMC4zNDMxIDkgOSAxMC4zNDMxIDkgMTJDOSAxMy42NTY5IDEwLjM0MzEgMTUgMTIgMTVaXCIgW2F0dHIuc3Ryb2tlXT1cInNlbGVjdGVkVGFiID09PSAndGFzaycgPyAnIzAwQTNGRicgOiAnIzM0NDA1NCdcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5LjQgMTVDMTkuMjY2OSAxNS4zMDE2IDE5LjIyNzIgMTUuNjM2MiAxOS4yODYgMTUuOTYwNkMxOS4zNDQ4IDE2LjI4NSAxOS40OTk1IDE2LjU4NDMgMTkuNzMgMTYuODJMMTkuNzkgMTYuODhDMTkuOTc2IDE3LjA2NTcgMjAuMTIzNSAxNy4yODYzIDIwLjIyNDEgMTcuNTI5MUMyMC4zMjQ4IDE3Ljc3MTkgMjAuMzc2NiAxOC4wMzIyIDIwLjM3NjYgMTguMjk1QzIwLjM3NjYgMTguNTU3OCAyMC4zMjQ4IDE4LjgxODEgMjAuMjI0MSAxOS4wNjA5QzIwLjEyMzUgMTkuMzAzNyAxOS45NzYgMTkuNTI0MyAxOS43OSAxOS43MUMxOS42MDQzIDE5Ljg5NiAxOS4zODM3IDIwLjA0MzUgMTkuMTQwOSAyMC4xNDQxQzE4Ljg5ODEgMjAuMjQ0OCAxOC42Mzc4IDIwLjI5NjYgMTguMzc1IDIwLjI5NjZDMTguMTEyMiAyMC4yOTY2IDE3Ljg1MTkgMjAuMjQ0OCAxNy42MDkxIDIwLjE0NDFDMTcuMzY2MyAyMC4wNDM1IDE3LjE0NTcgMTkuODk2IDE2Ljk2IDE5LjcxTDE2LjkgMTkuNjVDMTYuNjY0MyAxOS40MTk1IDE2LjM2NSAxOS4yNjQ4IDE2LjA0MDYgMTkuMjA2QzE1LjcxNjIgMTkuMTQ3MiAxNS4zODE2IDE5LjE4NjkgMTUuMDggMTkuMzJDMTQuNzg0MiAxOS40NDY4IDE0LjUzMiAxOS42NTcyIDE0LjM1NDMgMTkuOTI1NUMxNC4xNzY2IDIwLjE5MzggMTQuMDgxMyAyMC41MDgyIDE0LjA4IDIwLjgzVjIxQzE0LjA4IDIxLjUzMDQgMTMuODY5MyAyMi4wMzkxIDEzLjQ5NDIgMjIuNDE0MkMxMy4xMTkxIDIyLjc4OTMgMTIuNjEwNCAyMyAxMi4wOCAyM0MxMS41NDk2IDIzIDExLjA0MDkgMjIuNzg5MyAxMC42NjU4IDIyLjQxNDJDMTAuMjkwNyAyMi4wMzkxIDEwLjA4IDIxLjUzMDQgMTAuMDggMjFWMjAuOTFDMTAuMDcyMyAyMC41NzkgOS45NjUxMiAyMC4yNTggOS43NzI1MSAxOS45ODg3QzkuNTc5OSAxOS43MTk0IDkuMzEwNzQgMTkuNTE0MyA5IDE5LjRDOC42OTgzOCAxOS4yNjY5IDguMzYzODEgMTkuMjI3MiA4LjAzOTQxIDE5LjI4NkM3LjcxNTAyIDE5LjM0NDggNy40MTU2OCAxOS40OTk1IDcuMTggMTkuNzNMNy4xMiAxOS43OUM2LjkzNDI1IDE5Ljk3NiA2LjcxMzY4IDIwLjEyMzUgNi40NzA4OCAyMC4yMjQxQzYuMjI4MDggMjAuMzI0OCA1Ljk2NzgzIDIwLjM3NjYgNS43MDUgMjAuMzc2NkM1LjQ0MjE3IDIwLjM3NjYgNS4xODE5MiAyMC4zMjQ4IDQuOTM5MTIgMjAuMjI0MUM0LjY5NjMyIDIwLjEyMzUgNC40NzU3NSAxOS45NzYgNC4yOSAxOS43OUM0LjEwNDA1IDE5LjYwNDMgMy45NTY1MyAxOS4zODM3IDMuODU1ODggMTkuMTQwOUMzLjc1NTIzIDE4Ljg5ODEgMy43MDM0MyAxOC42Mzc4IDMuNzAzNDMgMTguMzc1QzMuNzAzNDMgMTguMTEyMiAzLjc1NTIzIDE3Ljg1MTkgMy44NTU4OCAxNy42MDkxQzMuOTU2NTMgMTcuMzY2MyA0LjEwNDA1IDE3LjE0NTcgNC4yOSAxNi45Nkw0LjM1IDE2LjlDNC41ODA1NCAxNi42NjQzIDQuNzM1MTkgMTYuMzY1IDQuNzk0IDE2LjA0MDZDNC44NTI4MiAxNS43MTYyIDQuODEzMTIgMTUuMzgxNiA0LjY4IDE1LjA4QzQuNTUzMjQgMTQuNzg0MiA0LjM0Mjc2IDE0LjUzMiA0LjA3NDQ3IDE0LjM1NDNDMy44MDYxOCAxNC4xNzY2IDMuNDkxNzkgMTQuMDgxMyAzLjE3IDE0LjA4SDNDMi40Njk1NyAxNC4wOCAxLjk2MDg2IDEzLjg2OTMgMS41ODU3OSAxMy40OTQyQzEuMjEwNzEgMTMuMTE5MSAxIDEyLjYxMDQgMSAxMi4wOEMxIDExLjU0OTYgMS4yMTA3MSAxMS4wNDA5IDEuNTg1NzkgMTAuNjY1OEMxLjk2MDg2IDEwLjI5MDcgMi40Njk1NyAxMC4wOCAzIDEwLjA4SDMuMDlDMy40MjA5OSAxMC4wNzIzIDMuNzQyIDkuOTY1MTIgNC4wMTEzIDkuNzcyNTFDNC4yODA1OSA5LjU3OTkgNC40ODU3MiA5LjMxMDc0IDQuNiA5QzQuNzMzMTIgOC42OTgzOCA0Ljc3MjgyIDguMzYzODEgNC43MTQgOC4wMzk0MUM0LjY1NTE5IDcuNzE1MDIgNC41MDA1NCA3LjQxNTY4IDQuMjcgNy4xOEw0LjIxIDcuMTJDNC4wMjQwNSA2LjkzNDI1IDMuODc2NTMgNi43MTM2OCAzLjc3NTg4IDYuNDcwODhDMy42NzUyMyA2LjIyODA4IDMuNjIzNDMgNS45Njc4MyAzLjYyMzQzIDUuNzA1QzMuNjIzNDMgNS40NDIxNyAzLjY3NTIzIDUuMTgxOTIgMy43NzU4OCA0LjkzOTEyQzMuODc2NTMgNC42OTYzMiA0LjAyNDA1IDQuNDc1NzUgNC4yMSA0LjI5QzQuMzk1NzUgNC4xMDQwNSA0LjYxNjMyIDMuOTU2NTMgNC44NTkxMiAzLjg1NTg4QzUuMTAxOTIgMy43NTUyMyA1LjM2MjE3IDMuNzAzNDMgNS42MjUgMy43MDM0M0M1Ljg4NzgzIDMuNzAzNDMgNi4xNDgwOCAzLjc1NTIzIDYuMzkwODggMy44NTU4OEM2LjYzMzY4IDMuOTU2NTMgNi44NTQyNSA0LjEwNDA1IDcuMDQgNC4yOUw3LjEgNC4zNUM3LjMzNTY4IDQuNTgwNTQgNy42MzUwMiA0LjczNTE5IDcuOTU5NDEgNC43OTRDOC4yODM4MSA0Ljg1MjgyIDguNjE4MzggNC44MTMxMiA4LjkyIDQuNjhIOUM5LjI5NTc3IDQuNTUzMjQgOS41NDgwMiA0LjM0Mjc2IDkuNzI1NjkgNC4wNzQ0N0M5LjkwMzM3IDMuODA2MTggOS45OTg3MiAzLjQ5MTc5IDEwIDMuMTdWM0MxMCAyLjQ2OTU3IDEwLjIxMDcgMS45NjA4NiAxMC41ODU4IDEuNTg1NzlDMTAuOTYwOSAxLjIxMDcxIDExLjQ2OTYgMSAxMiAxQzEyLjUzMDQgMSAxMy4wMzkxIDEuMjEwNzEgMTMuNDE0MiAxLjU4NTc5QzEzLjc4OTMgMS45NjA4NiAxNCAyLjQ2OTU3IDE0IDNWMy4wOUMxNC4wMDEzIDMuNDExNzkgMTQuMDk2NiAzLjcyNjE4IDE0LjI3NDMgMy45OTQ0N0MxNC40NTIgNC4yNjI3NiAxNC43MDQyIDQuNDczMjQgMTUgNC42QzE1LjMwMTYgNC43MzMxMiAxNS42MzYyIDQuNzcyODIgMTUuOTYwNiA0LjcxNEMxNi4yODUgNC42NTUxOSAxNi41ODQzIDQuNTAwNTQgMTYuODIgNC4yN0wxNi44OCA0LjIxQzE3LjA2NTcgNC4wMjQwNSAxNy4yODYzIDMuODc2NTMgMTcuNTI5MSAzLjc3NTg4QzE3Ljc3MTkgMy42NzUyMyAxOC4wMzIyIDMuNjIzNDMgMTguMjk1IDMuNjIzNDNDMTguNTU3OCAzLjYyMzQzIDE4LjgxODEgMy42NzUyMyAxOS4wNjA5IDMuNzc1ODhDMTkuMzAzNyAzLjg3NjUzIDE5LjUyNDMgNC4wMjQwNSAxOS43MSA0LjIxQzE5Ljg5NiA0LjM5NTc1IDIwLjA0MzUgNC42MTYzMiAyMC4xNDQxIDQuODU5MTJDMjAuMjQ0OCA1LjEwMTkyIDIwLjI5NjYgNS4zNjIxNyAyMC4yOTY2IDUuNjI1QzIwLjI5NjYgNS44ODc4MyAyMC4yNDQ4IDYuMTQ4MDggMjAuMTQ0MSA2LjM5MDg4QzIwLjA0MzUgNi42MzM2OCAxOS44OTYgNi44NTQyNSAxOS43MSA3LjA0TDE5LjY1IDcuMUMxOS40MTk1IDcuMzM1NjggMTkuMjY0OCA3LjYzNTAyIDE5LjIwNiA3Ljk1OTQxQzE5LjE0NzIgOC4yODM4MSAxOS4xODY5IDguNjE4MzggMTkuMzIgOC45MlY5QzE5LjQ0NjggOS4yOTU3NyAxOS42NTcyIDkuNTQ4MDIgMTkuOTI1NSA5LjcyNTY5QzIwLjE5MzggOS45MDMzNyAyMC41MDgyIDkuOTk4NzIgMjAuODMgMTBIMjFDMjEuNTMwNCAxMCAyMi4wMzkxIDEwLjIxMDcgMjIuNDE0MiAxMC41ODU4QzIyLjc4OTMgMTAuOTYwOSAyMyAxMS40Njk2IDIzIDEyQzIzIDEyLjUzMDQgMjIuNzg5MyAxMy4wMzkxIDIyLjQxNDIgMTMuNDE0MkMyMi4wMzkxIDEzLjc4OTMgMjEuNTMwNCAxNCAyMSAxNEgyMC45MUMyMC41ODgyIDE0LjAwMTMgMjAuMjczOCAxNC4wOTY2IDIwLjAwNTUgMTQuMjc0M0MxOS43MzcyIDE0LjQ1MiAxOS41MjY4IDE0LjcwNDIgMTkuNCAxNVpcIiBbYXR0ci5zdHJva2VdPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJyA/ICcjMDBBM0ZGJyA6ICcjMzQ0MDU0J1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE3NzVfMzc5MzFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFRhc2sgQ29uZmlndXJhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGN1cnNvci1wb2ludGVyIHAtMyBtYi0zXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnID8gJ2FjdGl2ZScgOiAnJ1wiIChjbGljayk9XCJzZWxlY3RlZFRhYj0nYnJhbmRNZXRhJztpc0VkaXQ9dHJ1ZTtpc0JyYW5kTWV0YUVkaXQ9dHJ1ZTtmb3JtLmRpc2FibGUoKTt0YXNrRm9ybS5kaXNhYmxlKCk7YnJhbmRNZXRhRm9ybS5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA3LjVMMTIgM0wyMSA3LjVNMyA3LjVMMTIgMTJNMyA3LjVWMTYuNUwxMiAyMU0yMSA3LjVMMTIgMTJNMjEgNy41VjE2LjVMMTIgMjFNMTIgMTJWMjFcIiBbYXR0ci5zdHJva2VdPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZ1RleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICBCcmFuZCBNZXRhIERhdGFcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCIgaWQ9XCJjb25maWdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLWNhcmRcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2JyYW5kJ1wiID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+QnJhbmQgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb248L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5EZWZpbmUgdGhlIGJyYW5kIGFuZCBtYXAgcHJvZHVjdHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBjYXRlZ29yaWVzLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImJ1bGtVcGxvYWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBVcGxvYWQgQnJhbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJtdC0xMFwiICNmb3JtUmVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJicmFuZENvbmZpZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QnJhbmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Qcm9kdWN0IENhdGVnb3J5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UHJvZHVjdCBTdWItQ2F0ZWdvcnk8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDpjYWxjKDc1dmggLSAyNTBweCk7b3ZlcmZsb3cteTpTY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBicmFuZEdyb3VwIG9mIGJyYW5kQ29uZmlnPy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cInJvdyBtdC0zIG14LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCIgW2lkXT1cIid0ZXh0JytpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBbbmdDbGFzc109XCJicmFuZHNMaXN0Lmxlbmd0aCAmJiAhaXNFZGl0ICYmICFjaGVja1VzZWQoaSkgJiYgYnJhbmRHcm91cC5nZXQoJ2JyYW5kJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ2RhbmdlcicgOiAnJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXMtMyBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTUgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNC43MDcxIDguNzA3MTFDMTUuMDk3NiA4LjMxNjU4IDE1LjA5NzYgNy42ODM0MiAxNC43MDcxIDcuMjkyODlMOC4zNDMxNSAwLjkyODkzMkM3Ljk1MjYyIDAuNTM4NDA4IDcuMzE5NDYgMC41Mzg0MDggNi45Mjg5MyAwLjkyODkzMkM2LjUzODQxIDEuMzE5NDYgNi41Mzg0MSAxLjk1MjYyIDYuOTI4OTMgMi4zNDMxNUwxMi41ODU4IDhMNi45Mjg5MyAxMy42NTY5QzYuNTM4NDEgMTQuMDQ3NCA2LjUzODQxIDE0LjY4MDUgNi45Mjg5MyAxNS4wNzExQzcuMzE5NDYgMTUuNDYxNiA3Ljk1MjYyIDE1LjQ2MTYgOC4zNDMxNSAxNS4wNzExTDE0LjcwNzEgOC43MDcxMVpNMCA4VjlIMTRWOFY3SDBWOFpcIiBmaWxsPVwiI0QwRDVERFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgY2hpcC1ib3hcIiBmb3JtQXJyYXlOYW1lPVwiY2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIiBbbmdDbGFzc109XCJicmFuZHNMaXN0Lmxlbmd0aCAmJiAhaXNFZGl0ICYmICFjaGVja1VzZWQoaSkgJiYgYnJhbmRHcm91cC5nZXQoJ2NhdGVnb3J5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ2RhbmdlcicgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRDYXRlZ29yeShpKT8uY29udHJvbHM7bGV0IGo9aW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCIgW25nQ2xhc3NdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICdkaXNhYmxlZFRleHQnIDogJydcIj57e2l0ZW0udmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSkgPyAnJyA6cmVtb3ZlQ2F0ZWdvcnkoaSxqKVwiIFtjbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJ2Rpc2FibGVkVGV4dCc6J2N1cnNvci1wb2ludGVyJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBbYXR0ci5zdHJva2VdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcjYWViNGM1JyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IHBzLTMgbWUtM1wiIChjaGFuZ2UpPVwiYWRkQ2F0ZWdvcnkoJGV2ZW50LGkpXCIgW2lkXT1cIidjYXRlZ29yeUlucHV0JytpXCIgW2Rpc2FibGVkXT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeVwiIC8+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNSAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjcwNzEgOC43MDcxMUMxNS4wOTc2IDguMzE2NTggMTUuMDk3NiA3LjY4MzQyIDE0LjcwNzEgNy4yOTI4OUw4LjM0MzE1IDAuOTI4OTMyQzcuOTUyNjIgMC41Mzg0MDggNy4zMTk0NiAwLjUzODQwOCA2LjkyODkzIDAuOTI4OTMyQzYuNTM4NDEgMS4zMTk0NiA2LjUzODQxIDEuOTUyNjIgNi45Mjg5MyAyLjM0MzE1TDEyLjU4NTggOEw2LjkyODkzIDEzLjY1NjlDNi41Mzg0MSAxNC4wNDc0IDYuNTM4NDEgMTQuNjgwNSA2LjkyODkzIDE1LjA3MTFDNy4zMTk0NiAxNS40NjE2IDcuOTUyNjIgMTUuNDYxNiA4LjM0MzE1IDE1LjA3MTFMMTQuNzA3MSA4LjcwNzExWk0wIDhWOUgxNFY4VjdIMFY4WlwiIGZpbGw9XCIjRDBENUREXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGNoaXAtYm94XCIgZm9ybUFycmF5TmFtZT1cInN1YkNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldFN1YkNhdGVnb3J5KGkpPy5jb250cm9scztsZXQgaj1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIiBbbmdDbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJ2Rpc2FibGVkVGV4dCcgOiAnJ1wiPnt7aXRlbS52YWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcnIDogcmVtb3ZlU3ViQ2F0ZWdvcnkoaSxqKVwiIFtjbGFzc109XCJpc0VkaXQgfHwgY2hlY2tVc2VkKGkpID8gJyc6J2N1cnNvci1wb2ludGVyJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBbYXR0ci5zdHJva2VdPVwiaXNFZGl0IHx8IGNoZWNrVXNlZChpKSA/ICcjYWViNGM1JyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IHBzLTMgbWUtM1wiIChjaGFuZ2UpPVwiYWRkU3ViQ2F0ZWdvcnkoJGV2ZW50LGkpXCIgW2lkXT1cIidzdWJDYXRlZ29yeUlucHV0JytpXCIgW2Rpc2FibGVkXT1cImlzRWRpdCB8fCBjaGVja1VzZWQoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeVwiIC8+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTRcIiAoY2xpY2spPVwiY2hlY2tVc2VkKGkpIHx8IGlzRWRpdCA/ICcnIDogcmVtb3ZlQnJhbmQoaSlcIiAqbmdJZj1cImJyYW5kQ29uZmlnLnZhbHVlLmxlbmd0aCA+IDFcIiBbbmdDbGFzc109XCJjaGVja1VzZWQoaSkgfHwgaXNFZGl0ID8gJ2N1cnNvci1kZWZhdWx0JyA6ICdjdXJzb3ItcG9pbnRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjUgNC41TDQuNSAxMy41TTQuNSA0LjVMMTMuNSAxMy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG10LTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJhZGRCcmFuZCgpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjY3NVYxNS44MzM0TTQuMTY2NzUgMTAuMDAwMUgxNS44MzM0XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEFkZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cImlzRWRpdFwiIChjbGljayk9XCJpc0VkaXQgPSBmYWxzZTtmb3JtRW5hYmxlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNzc1XzM3OTg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTc3NV8zNzk4NVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gRWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiICpuZ0lmPVwiIWlzRWRpdFwiIChjbGljayk9XCJ1cGRhdGVCcmFuZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdicmFuZE1ldGEnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+QnJhbmQgTWV0YSBEYXRhPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+TWFpbnRhaW4gdGhlIFBpZCBDYXQgJiM4NTk0OyBCcmFuZCAvIENhdGVnb3J5IC8gQmFuZCBtYXBwaW5nIHVzZWQgZHVyaW5nIHBsYW5vZ3JhbSBleHBvcnQuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozNjBweDtmbGV4LXNocmluazowXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiIHN0eWxlPVwibGVmdDoxMnB4O3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMSAyMUwxNi42NSAxNi42NU0xOSAxMUMxOSAxNS40MTgzIDE1LjQxODMgMTkgMTEgMTlDNi41ODE3MiAxOSAzIDE1LjQxODMgMyAxMUMzIDYuNTgxNzIgNi41ODE3MiAzIDExIDNDMTUuNDE4MyAzIDE5IDYuNTgxNzIgMTkgMTFaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjM4cHhcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQaWQgQ2F0LCBUZW1wIEdyb3VwLCBDYXRlZ29yeSwgQnJhbmQgb3IgQmFuZFwiIFsobmdNb2RlbCldPVwiYnJhbmRNZXRhU2VhcmNoXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBtdC0xXCIgKm5nSWY9XCJicmFuZE1ldGFEYXRhPy5jb250cm9scz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgZmlsdGVyZWRCcmFuZE1ldGFDb3VudCB9fSBvZiB7eyBicmFuZE1ldGFEYXRhLmNvbnRyb2xzLmxlbmd0aCB9fSByb3cocyk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImJyYW5kTWV0YUZvcm1cIiBjbGFzcz1cIm10LTNcIiAjYnJhbmRNZXRhUmVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJicmFuZE1ldGFEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG14LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpZCBDYXQ8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRlbXAgR3JvdXA8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcC0wIHBzLTJcIj48ZGl2IGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNhdGVnb3J5PC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHAtMCBwcy0yXCI+PGRpdiBjbGFzcz1cImZvcm0tbGFiZWxcIj5CcmFuZDwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBwLTAgcHMtMlwiPjxkaXYgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QmFuZDwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OmNhbGMoNzV2aCAtIDI4MHB4KTtvdmVyZmxvdy15OnNjcm9sbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYnJhbmRNZXRhRGF0YT8uY29udHJvbHM/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcC01IHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gYnJhbmQgbWV0YSBkYXRhIGZvdW5kLiBDbGljayBcIkVkaXRcIiB0aGVuIFwiQWRkXCIgdG8gY3JlYXRlIGEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJicmFuZE1ldGFEYXRhPy5jb250cm9scz8ubGVuZ3RoICYmICFmaWx0ZXJlZEJyYW5kTWV0YUNvdW50XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwLTUgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByb3dzIG1hdGNoIFwie3sgYnJhbmRNZXRhU2VhcmNoIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZXRhR3JvdXAgb2YgYnJhbmRNZXRhRGF0YT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJyb3cgbXQtMyBteC0wXCIgW2lkXT1cIidtZXRhUm93JyArIGlcIiBbaGlkZGVuXT1cIiFtYXRjaGVzQnJhbmRNZXRhU2VhcmNoKG1ldGFHcm91cClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBpZENhdFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy1waWRDYXQnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCdwaWRDYXQnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgncGlkQ2F0Jyk/LnRvdWNoZWQgPyAnZGFuZ2VyJyA6ICcnXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRlbXBHcm91cFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy10ZW1wR3JvdXAnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCd0ZW1wR3JvdXAnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgndGVtcEdyb3VwJyk/LnRvdWNoZWQgPyAnZGFuZ2VyJyA6ICcnXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHAtMCBwcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5XCIgW2lkXT1cIidtZXRhUm93JyArIGkgKyAnLWNhdGVnb3J5J1wiIFtuZ0NsYXNzXT1cIiFpc0JyYW5kTWV0YUVkaXQgJiYgbWV0YUdyb3VwLmdldCgnY2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgbWV0YUdyb3VwLmdldCgnY2F0ZWdvcnknKT8udG91Y2hlZCA/ICdkYW5nZXInIDogJydcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcC0wIHBzLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBbaWRdPVwiJ21ldGFSb3cnICsgaSArICctYnJhbmQnXCIgW25nQ2xhc3NdPVwiIWlzQnJhbmRNZXRhRWRpdCAmJiBtZXRhR3JvdXAuZ2V0KCdicmFuZCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBtZXRhR3JvdXAuZ2V0KCdicmFuZCcpPy50b3VjaGVkID8gJ2RhbmdlcicgOiAnJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBwLTAgcHMtMiBkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYmFuZFwiIFtpZF09XCInbWV0YVJvdycgKyBpICsgJy1iYW5kJ1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0zIG10LTNcIiAoY2xpY2spPVwiaXNCcmFuZE1ldGFFZGl0ID8gJycgOiByZW1vdmVCcmFuZE1ldGFSb3coaSlcIiBbbmdDbGFzc109XCJpc0JyYW5kTWV0YUVkaXQgPyAnY3Vyc29yLWRlZmF1bHQnIDogJ2N1cnNvci1wb2ludGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjUgNC41TDQuNSAxMy41TTQuNSA0LjVMMTMuNSAxMy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImFkZEJyYW5kTWV0YVJvdygpXCIgW2Rpc2FibGVkXT1cImlzQnJhbmRNZXRhRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjY3NVYxNS44MzM0TTQuMTY2NzUgMTAuMDAwMUgxNS44MzM0XCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEFkZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cIiFpc0JyYW5kTWV0YUVkaXRcIiAoY2xpY2spPVwiY2FuY2VsQnJhbmRNZXRhRWRpdCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtcy0yXCIgKm5nSWY9XCJpc0JyYW5kTWV0YUVkaXRcIiAoY2xpY2spPVwiZW5hYmxlQnJhbmRNZXRhRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTc3NV8zNzk5MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQuMTY2NyAyLjQ5OTkzQzE0LjM4NTYgMi4yODEwNiAxNC42NDU1IDIuMTA3NDQgMTQuOTMxNCAxLjk4ODk5QzE1LjIxNzQgMS44NzA1NCAxNS41MjM5IDEuODA5NTcgMTUuODMzNCAxLjgwOTU3QzE2LjE0MjkgMS44MDk1NyAxNi40NDk0IDEuODcwNTQgMTYuNzM1NCAxLjk4ODk5QzE3LjAyMTQgMi4xMDc0NCAxNy4yODEyIDIuMjgxMDYgMTcuNTAwMSAyLjQ5OTkzQzE3LjcxOSAyLjcxODggMTcuODkyNiAyLjk3ODYzIDE4LjAxMSAzLjI2NDZDMTguMTI5NSAzLjU1MDU3IDE4LjE5MDQgMy44NTcwNiAxOC4xOTA0IDQuMTY2NTlDMTguMTkwNCA0LjQ3NjEyIDE4LjEyOTUgNC43ODI2MiAxOC4wMTEgNS4wNjg1OUMxNy44OTI2IDUuMzU0NTUgMTcuNzE5IDUuNjE0MzkgMTcuNTAwMSA1LjgzMzI2TDYuMjUwMDggMTcuMDgzM0wxLjY2Njc1IDE4LjMzMzNMMi45MTY3NSAxMy43NDk5TDE0LjE2NjcgMi40OTk5M1pcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE3NzVfMzc5OTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMlwiICpuZ0lmPVwiIWlzQnJhbmRNZXRhRWRpdFwiIChjbGljayk9XCJ1cGRhdGVCcmFuZE1ldGFEYXRhKClcIj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICd0YXNrJ1wiID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDM+R2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRhc2tzPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGFwcGxpZXMgdG8gYWxsIHB1Ymxpc2hlZCB0YXNrcy48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBVcGxvYWQgQnJhbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ0YXNrRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1ZSBkYXlzICh0byBjb21wbGV0ZSB0YXNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkdWVEYXlcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVlIHRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVlVGltZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tsaXN0dHVybm9mZiBtcy0zIG10LTQgZnYtcGx1Z2lucy1pY29uLWNvbnRhaW5lIGNvbC1tZC04IGRpdldpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZ2VvRmVuY2luZ1wiIFtjaGVja2VkXT1cInRhc2tGb3JtLmdldCgnYWxsb3dlZFN0b3JlTG9jYXRpb24nKT8udmFsdWVcIiBmb3JtQ29udHJvbE5hbWU9XCJhbGxvd2VkU3RvcmVMb2NhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHN1YlwiIFtuZ0NsYXNzXT1cInRhc2tGb3JtLmdldCgnYWxsb3dlZFN0b3JlTG9jYXRpb24nKT8udmFsdWUgPyAnYWN0aXZlJyA6ICcnXCIgZm9yPVwiZ2VvRmVuY2luZ1wiPkdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPjxicj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBzdWJ0ZXh0XCIgW25nQ2xhc3NdPVwidGFza0Zvcm0uZ2V0KCdhbGxvd2VkU3RvcmVMb2NhdGlvbicpPy52YWx1ZSA/ICdhY3RpdmUnIDogJydcIiBmb3I9XCJnZW9GZW5jaW5nXCI+QnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsaW5nLCB0aGUgY2hlY2tsaXN0IGNhbiBiZSBmaWxsZWQgYnkgdGhlIHVzZXIgb25seSB3aGVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIHN0b3JlLjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAqbmdJZj1cImlzRWRpdFwiIChjbGljayk9XCJpc0VkaXQgPSBmYWxzZTt0YXNrRm9ybS5lbmFibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNzc1XzM3OTg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjE2NjcgMi40OTk5M0MxNC4zODU2IDIuMjgxMDYgMTQuNjQ1NSAyLjEwNzQ0IDE0LjkzMTQgMS45ODg5OUMxNS4yMTc0IDEuODcwNTQgMTUuNTIzOSAxLjgwOTU3IDE1LjgzMzQgMS44MDk1N0MxNi4xNDI5IDEuODA5NTcgMTYuNDQ5NCAxLjg3MDU0IDE2LjczNTQgMS45ODg5OUMxNy4wMjE0IDIuMTA3NDQgMTcuMjgxMiAyLjI4MTA2IDE3LjUwMDEgMi40OTk5M0MxNy43MTkgMi43MTg4IDE3Ljg5MjYgMi45Nzg2MyAxOC4wMTEgMy4yNjQ2QzE4LjEyOTUgMy41NTA1NyAxOC4xOTA0IDMuODU3MDYgMTguMTkwNCA0LjE2NjU5QzE4LjE5MDQgNC40NzYxMiAxOC4xMjk1IDQuNzgyNjIgMTguMDExIDUuMDY4NTlDMTcuODkyNiA1LjM1NDU1IDE3LjcxOSA1LjYxNDM5IDE3LjUwMDEgNS44MzMyNkw2LjI1MDA4IDE3LjA4MzNMMS42NjY3NSAxOC4zMzMzTDIuOTE2NzUgMTMuNzQ5OUwxNC4xNjY3IDIuNDk5OTNaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNzc1XzM3OTg1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCIhaXNFZGl0XCIgKGNsaWNrKT1cInVwZGF0ZVRhc2soKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiJdfQ==