tango-app-ui-store-builder 1.2.5 → 1.2.7

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 (54) hide show
  1. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -2
  2. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -2
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -2
  4. package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +41 -4
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -2
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -2
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -2
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +2 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -2
  10. package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +2 -3
  11. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +73 -6
  12. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +4 -3
  13. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +114 -4
  14. package/esm2022/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.mjs +3 -3
  15. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +85 -6
  16. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +162 -3
  17. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +24 -11
  18. package/esm2022/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.mjs +13 -4
  19. package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +3 -4
  20. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +3 -3
  21. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +4 -5
  22. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +3 -3
  23. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +98 -3
  24. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +3 -2
  25. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +135 -33
  26. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -2
  27. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -2
  28. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +3 -2
  29. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
  30. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -2
  31. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -2
  32. package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +2 -3
  33. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -4
  34. package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -3
  35. package/esm2022/lib/data/fixture-template.data.mjs +12 -1
  36. package/esm2022/lib/functions/plano.function.mjs +13 -1
  37. package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
  38. package/esm2022/lib/services/store-builder.service.mjs +21 -1
  39. package/fesm2022/tango-app-ui-store-builder.mjs +1082 -380
  40. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  41. package/lib/components/create-fixture/create-fixture.component.d.ts +3 -0
  42. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +6 -1
  43. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +14 -1
  44. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -1
  45. package/lib/components/plano-configurations/plano-configurations.component.d.ts +19 -1
  46. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +1 -0
  47. package/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.d.ts +5 -0
  48. package/lib/components/plano-tools/plano-data-export/plano-data-export.component.d.ts +26 -0
  49. package/lib/components/plano-tools/store-exports/store-exports.component.d.ts +28 -3
  50. package/lib/data/fixture-template.data.d.ts +8 -0
  51. package/lib/functions/plano.function.d.ts +1 -0
  52. package/lib/interfaces/fixture-library.interface.d.ts +1 -0
  53. package/lib/services/store-builder.service.d.ts +10 -0
  54. package/package.json +1 -1
@@ -230,10 +230,10 @@ export class MoveBucketComponent {
230
230
  this.destroy$.complete();
231
231
  }
232
232
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MoveBucketComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
233
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MoveBucketComponent, selector: "lib-move-bucket", ngImport: i0, template: "<section class=\"move-bucket p-3\">\n <div class=\"card p-4\" style=\"max-width: 640px;\">\n <h5 class=\"mb-1\">Move Store Bucket</h5>\n <p class=\"text-muted small mb-3\">\n Move a floor between Onboarding (Draft / Allocation Pending) and ManagePlano (Completed) without losing store data.\n </p>\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Current bucket info + target status -->\n <ng-container *ngIf=\"selectedFloorId && currentStatus\">\n <div class=\"mb-3 p-3 rounded current-info\">\n <div class=\"d-flex justify-content-between small\">\n <span class=\"text-muted\">Current bucket</span>\n <span class=\"fw-semibold\">{{ getBucketLabel(currentStatus) }}</span>\n </div>\n <div class=\"d-flex justify-content-between small mt-1\">\n <span class=\"text-muted\">Current status</span>\n <span class=\"fw-semibold\">{{ getStatusLabel(currentStatus) }}</span>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Move to status\"\n [idField]=\"'value'\"\n [nameField]=\"'label'\"\n [subTextField]=\"'bucket'\"\n [data]=\"statusOptions\"\n [ngModel]=\"targetStatus\"\n (ngModelChange)=\"onTargetStatusSelected($event)\">\n </lib-reactive-select>\n <div class=\"form-text text-warning\" *ngIf=\"statusChanged\">\n isPlanoApproved will be set to\n <strong>{{ targetStatus === 'draft' ? 'false' : 'true' }}</strong>,\n planoProgress will be set to\n <strong>{{ targetStatus === 'completed' ? 25 : 0 }}</strong>.\n </div>\n </div>\n\n <!-- Task cleanup checkboxes -->\n <div class=\"mb-3\">\n <label class=\"form-label\">Clear tasks &amp; compliance rows (optional)</label>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrLayout\"\n [(ngModel)]=\"clearLayoutTasks\">\n <label class=\"form-check-label\" for=\"clrLayout\">\n Layout tasks\n <span class=\"text-muted small\">(planoType: layout, layoutFixture)</span>\n </label>\n </div>\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrFixture\"\n [(ngModel)]=\"clearFixtureTasks\">\n <label class=\"form-check-label\" for=\"clrFixture\">\n Fixture tasks\n <span class=\"text-muted small\">(planoType: fixture, vm)</span>\n </label>\n </div>\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrZone\"\n [(ngModel)]=\"clearZoneTasks\">\n <label class=\"form-check-label\" for=\"clrZone\">\n Zone tasks\n <span class=\"text-muted small\">(planoType: zoneVerification)</span>\n </label>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Updating...' : 'Update' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".move-bucket .current-info{background-color:#f9fafb;border:1px solid #e4e7ec}\n"], dependencies: [{ kind: "component", type: i4.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
233
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MoveBucketComponent, selector: "lib-move-bucket", ngImport: i0, template: "<section class=\"move-bucket p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 640px;\">\r\n <h5 class=\"mb-1\">Move Store Bucket</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Move a floor between Onboarding (Draft / Allocation Pending) and ManagePlano (Completed) without losing store data.\r\n </p>\r\n\r\n <!-- Store -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Floor -->\r\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\r\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"floors\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"onFloorSelected($event)\">\r\n </lib-reactive-select>\r\n </ng-container>\r\n <ng-template #noFloors>\r\n <div class=\"text-muted small\">No floors found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Current bucket info + target status -->\r\n <ng-container *ngIf=\"selectedFloorId && currentStatus\">\r\n <div class=\"mb-3 p-3 rounded current-info\">\r\n <div class=\"d-flex justify-content-between small\">\r\n <span class=\"text-muted\">Current bucket</span>\r\n <span class=\"fw-semibold\">{{ getBucketLabel(currentStatus) }}</span>\r\n </div>\r\n <div class=\"d-flex justify-content-between small mt-1\">\r\n <span class=\"text-muted\">Current status</span>\r\n <span class=\"fw-semibold\">{{ getStatusLabel(currentStatus) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Move to status\"\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [subTextField]=\"'bucket'\"\r\n [data]=\"statusOptions\"\r\n [ngModel]=\"targetStatus\"\r\n (ngModelChange)=\"onTargetStatusSelected($event)\">\r\n </lib-reactive-select>\r\n <div class=\"form-text text-warning\" *ngIf=\"statusChanged\">\r\n isPlanoApproved will be set to\r\n <strong>{{ targetStatus === 'draft' ? 'false' : 'true' }}</strong>,\r\n planoProgress will be set to\r\n <strong>{{ targetStatus === 'completed' ? 25 : 0 }}</strong>.\r\n </div>\r\n </div>\r\n\r\n <!-- Task cleanup checkboxes -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Clear tasks &amp; compliance rows (optional)</label>\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrLayout\"\r\n [(ngModel)]=\"clearLayoutTasks\">\r\n <label class=\"form-check-label\" for=\"clrLayout\">\r\n Layout tasks\r\n <span class=\"text-muted small\">(planoType: layout, layoutFixture)</span>\r\n </label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrFixture\"\r\n [(ngModel)]=\"clearFixtureTasks\">\r\n <label class=\"form-check-label\" for=\"clrFixture\">\r\n Fixture tasks\r\n <span class=\"text-muted small\">(planoType: fixture, vm)</span>\r\n </label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrZone\"\r\n [(ngModel)]=\"clearZoneTasks\">\r\n <label class=\"form-check-label\" for=\"clrZone\">\r\n Zone tasks\r\n <span class=\"text-muted small\">(planoType: zoneVerification)</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\r\n {{ isSubmitting ? 'Updating...' : 'Update' }}\r\n </button>\r\n\r\n <div class=\"mt-3 alert\" *ngIf=\"message\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\"\r\n style=\"white-space: pre-line;\">\r\n {{ message }}\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".move-bucket .current-info{background-color:#f9fafb;border:1px solid #e4e7ec}\n"], dependencies: [{ kind: "component", type: i4.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
234
234
  }
235
235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MoveBucketComponent, decorators: [{
236
236
  type: Component,
237
- args: [{ selector: "lib-move-bucket", template: "<section class=\"move-bucket p-3\">\n <div class=\"card p-4\" style=\"max-width: 640px;\">\n <h5 class=\"mb-1\">Move Store Bucket</h5>\n <p class=\"text-muted small mb-3\">\n Move a floor between Onboarding (Draft / Allocation Pending) and ManagePlano (Completed) without losing store data.\n </p>\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Current bucket info + target status -->\n <ng-container *ngIf=\"selectedFloorId && currentStatus\">\n <div class=\"mb-3 p-3 rounded current-info\">\n <div class=\"d-flex justify-content-between small\">\n <span class=\"text-muted\">Current bucket</span>\n <span class=\"fw-semibold\">{{ getBucketLabel(currentStatus) }}</span>\n </div>\n <div class=\"d-flex justify-content-between small mt-1\">\n <span class=\"text-muted\">Current status</span>\n <span class=\"fw-semibold\">{{ getStatusLabel(currentStatus) }}</span>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Move to status\"\n [idField]=\"'value'\"\n [nameField]=\"'label'\"\n [subTextField]=\"'bucket'\"\n [data]=\"statusOptions\"\n [ngModel]=\"targetStatus\"\n (ngModelChange)=\"onTargetStatusSelected($event)\">\n </lib-reactive-select>\n <div class=\"form-text text-warning\" *ngIf=\"statusChanged\">\n isPlanoApproved will be set to\n <strong>{{ targetStatus === 'draft' ? 'false' : 'true' }}</strong>,\n planoProgress will be set to\n <strong>{{ targetStatus === 'completed' ? 25 : 0 }}</strong>.\n </div>\n </div>\n\n <!-- Task cleanup checkboxes -->\n <div class=\"mb-3\">\n <label class=\"form-label\">Clear tasks &amp; compliance rows (optional)</label>\n <div class=\"d-flex flex-column gap-2\">\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrLayout\"\n [(ngModel)]=\"clearLayoutTasks\">\n <label class=\"form-check-label\" for=\"clrLayout\">\n Layout tasks\n <span class=\"text-muted small\">(planoType: layout, layoutFixture)</span>\n </label>\n </div>\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrFixture\"\n [(ngModel)]=\"clearFixtureTasks\">\n <label class=\"form-check-label\" for=\"clrFixture\">\n Fixture tasks\n <span class=\"text-muted small\">(planoType: fixture, vm)</span>\n </label>\n </div>\n <div class=\"form-check\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrZone\"\n [(ngModel)]=\"clearZoneTasks\">\n <label class=\"form-check-label\" for=\"clrZone\">\n Zone tasks\n <span class=\"text-muted small\">(planoType: zoneVerification)</span>\n </label>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Updating...' : 'Update' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".move-bucket .current-info{background-color:#f9fafb;border:1px solid #e4e7ec}\n"] }]
237
+ args: [{ selector: "lib-move-bucket", template: "<section class=\"move-bucket p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 640px;\">\r\n <h5 class=\"mb-1\">Move Store Bucket</h5>\r\n <p class=\"text-muted small mb-3\">\r\n Move a floor between Onboarding (Draft / Allocation Pending) and ManagePlano (Completed) without losing store data.\r\n </p>\r\n\r\n <!-- Store -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <!-- Floor -->\r\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\r\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"floors\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"onFloorSelected($event)\">\r\n </lib-reactive-select>\r\n </ng-container>\r\n <ng-template #noFloors>\r\n <div class=\"text-muted small\">No floors found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Current bucket info + target status -->\r\n <ng-container *ngIf=\"selectedFloorId && currentStatus\">\r\n <div class=\"mb-3 p-3 rounded current-info\">\r\n <div class=\"d-flex justify-content-between small\">\r\n <span class=\"text-muted\">Current bucket</span>\r\n <span class=\"fw-semibold\">{{ getBucketLabel(currentStatus) }}</span>\r\n </div>\r\n <div class=\"d-flex justify-content-between small mt-1\">\r\n <span class=\"text-muted\">Current status</span>\r\n <span class=\"fw-semibold\">{{ getStatusLabel(currentStatus) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Move to status\"\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [subTextField]=\"'bucket'\"\r\n [data]=\"statusOptions\"\r\n [ngModel]=\"targetStatus\"\r\n (ngModelChange)=\"onTargetStatusSelected($event)\">\r\n </lib-reactive-select>\r\n <div class=\"form-text text-warning\" *ngIf=\"statusChanged\">\r\n isPlanoApproved will be set to\r\n <strong>{{ targetStatus === 'draft' ? 'false' : 'true' }}</strong>,\r\n planoProgress will be set to\r\n <strong>{{ targetStatus === 'completed' ? 25 : 0 }}</strong>.\r\n </div>\r\n </div>\r\n\r\n <!-- Task cleanup checkboxes -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Clear tasks &amp; compliance rows (optional)</label>\r\n <div class=\"d-flex flex-column gap-2\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrLayout\"\r\n [(ngModel)]=\"clearLayoutTasks\">\r\n <label class=\"form-check-label\" for=\"clrLayout\">\r\n Layout tasks\r\n <span class=\"text-muted small\">(planoType: layout, layoutFixture)</span>\r\n </label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrFixture\"\r\n [(ngModel)]=\"clearFixtureTasks\">\r\n <label class=\"form-check-label\" for=\"clrFixture\">\r\n Fixture tasks\r\n <span class=\"text-muted small\">(planoType: fixture, vm)</span>\r\n </label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"clrZone\"\r\n [(ngModel)]=\"clearZoneTasks\">\r\n <label class=\"form-check-label\" for=\"clrZone\">\r\n Zone tasks\r\n <span class=\"text-muted small\">(planoType: zoneVerification)</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\r\n {{ isSubmitting ? 'Updating...' : 'Update' }}\r\n </button>\r\n\r\n <div class=\"mt-3 alert\" *ngIf=\"message\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\"\r\n style=\"white-space: pre-line;\">\r\n {{ message }}\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".move-bucket .current-info{background-color:#f9fafb;border:1px solid #e4e7ec}\n"] }]
238
238
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i3.NgbModal }] });
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS1idWNrZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbW92ZS1idWNrZXQvbW92ZS1idWNrZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbW92ZS1idWNrZXQvbW92ZS1idWNrZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQzs7Ozs7Ozs7QUF3QjdHLE1BQU0sY0FBYyxHQUFtQjtJQUNyQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQ3hEO1FBQ0UsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLE1BQU0sRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRTtDQUNsRSxDQUFDO0FBT0YsTUFBTSxPQUFPLG1CQUFtQjtJQTBCcEI7SUFDQTtJQUNBO0lBM0JWLFFBQVEsQ0FBUztJQUVqQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxrQkFBa0IsR0FBa0IsSUFB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QUUsQ0FBQztJQUMzQixDQUFDO3dHQXRQVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix1RENsRGhDLDJuSkF1SEE7OzRGRHJFYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBTdWJqZWN0LFxuICB0YWtlVW50aWwsXG59IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9wb3B1cHMvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xuXG5pbnRlcmZhY2UgU3RvcmVPcHRpb24ge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxvb3JPcHRpb24ge1xuICBfaWQ6IHN0cmluZztcbiAgZmxvb3JOdW1iZXI6IG51bWJlcjtcbiAgZmxvb3JOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogQnVja2V0U3RhdHVzO1xuICBpc1BsYW5vQXBwcm92ZWQ/OiBib29sZWFuO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuXG50eXBlIEJ1Y2tldFN0YXR1cyA9IFwiZHJhZnRcIiB8IFwiYWxsb2NhdGlvblBlbmRpbmdcIiB8IFwiY29tcGxldGVkXCI7XG5cbmludGVyZmFjZSBTdGF0dXNPcHRpb24ge1xuICB2YWx1ZTogQnVja2V0U3RhdHVzO1xuICBsYWJlbDogc3RyaW5nO1xuICBidWNrZXQ6IHN0cmluZztcbn1cblxuY29uc3QgU1RBVFVTX09QVElPTlM6IFN0YXR1c09wdGlvbltdID0gW1xuICB7IHZhbHVlOiBcImRyYWZ0XCIsIGxhYmVsOiBcIkRyYWZ0XCIsIGJ1Y2tldDogXCJPbmJvYXJkaW5nXCIgfSxcbiAge1xuICAgIHZhbHVlOiBcImFsbG9jYXRpb25QZW5kaW5nXCIsXG4gICAgbGFiZWw6IFwiQWxsb2NhdGlvbiBQZW5kaW5nXCIsXG4gICAgYnVja2V0OiBcIk9uYm9hcmRpbmdcIixcbiAgfSxcbiAgeyB2YWx1ZTogXCJjb21wbGV0ZWRcIiwgbGFiZWw6IFwiQ29tcGxldGVkXCIsIGJ1Y2tldDogXCJNYW5hZ2VQbGFub1wiIH0sXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwibGliLW1vdmUtYnVja2V0XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbW92ZS1idWNrZXQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9tb3ZlLWJ1Y2tldC5jb21wb25lbnQuc2Nzc1wiLFxufSlcbmV4cG9ydCBjbGFzcyBNb3ZlQnVja2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjbGllbnRJZDogc3RyaW5nO1xuXG4gIHN0b3JlT3B0aW9uczogU3RvcmVPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZFN0b3JlTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGZsb29yczogRmxvb3JPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZEZsb29ySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBpc0xvYWRpbmdGbG9vcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzdGF0dXNPcHRpb25zID0gU1RBVFVTX09QVElPTlM7XG4gIHRhcmdldFN0YXR1czogQnVja2V0U3RhdHVzIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRTdGF0dXM6IEJ1Y2tldFN0YXR1cyB8IG51bGwgPSBudWxsO1xuXG4gIGNsZWFyTGF5b3V0VGFza3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2xlYXJGaXh0dXJlVGFza3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2xlYXJab25lVGFza3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgbWVzc2FnZVR5cGU6IFwic3VjY2Vzc1wiIHwgXCJlcnJvclwiID0gXCJzdWNjZXNzXCI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRTdG9yZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbG9hZFN0b3JlcygpIHtcbiAgICB0aGlzLnNic1xuICAgICAgLmdldFN0b3JlT3JDbHVzdGVyTGlzdCh7IHNlYXJjaE1vZGU6IFwic3RvcmVcIiB9KVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uU3RvcmVTZWxlY3RlZChzdG9yZUlkOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlSWQgPSBzdG9yZUlkO1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZU9wdGlvbnMuZmluZCgocykgPT4gcy5pZCA9PT0gc3RvcmVJZCk7XG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlTGFiZWwgPSBzdG9yZT8ubGFiZWwgPz8gbnVsbDtcbiAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVMYWJlbCkge1xuICAgICAgdGhpcy5sb2FkRmxvb3JzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZsb29yU3RhdGUoKSB7XG4gICAgdGhpcy5mbG9vcnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50U3RhdHVzID0gbnVsbDtcbiAgICB0aGlzLnRhcmdldFN0YXR1cyA9IG51bGw7XG4gICAgdGhpcy5jbGVhckxheW91dFRhc2tzID0gZmFsc2U7XG4gICAgdGhpcy5jbGVhckZpeHR1cmVUYXNrcyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJab25lVGFza3MgPSBmYWxzZTtcbiAgfVxuXG4gIGxvYWRGbG9vcnMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkU3RvcmVMYWJlbCkgcmV0dXJuO1xuICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gdHJ1ZTtcbiAgICB0aGlzLnNic1xuICAgICAgLmdldEZsb29yc1dpdGhTdGF0dXModGhpcy5zZWxlY3RlZFN0b3JlTGFiZWwsIHRoaXMuY2xpZW50SWQpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3OiBhbnlbXSA9IHJlcz8uZGF0YT8uZmxvb3JzIHx8IFtdO1xuICAgICAgICAgIHRoaXMuZmxvb3JzID0gcmF3XG4gICAgICAgICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICAgICAgICBfaWQ6IGYuX2lkLFxuICAgICAgICAgICAgICBmbG9vck51bWJlcjogZi5mbG9vck51bWJlcixcbiAgICAgICAgICAgICAgZmxvb3JOYW1lOiBmLmZsb29yTmFtZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiBmLnN0YXR1cyxcbiAgICAgICAgICAgICAgaXNQbGFub0FwcHJvdmVkOiBmLmlzUGxhbm9BcHByb3ZlZCxcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGBGbG9vciAke2YuZmxvb3JOdW1iZXJ9IOKAlCAke2YuZmxvb3JOYW1lfSBbJHt0aGlzLmdldFN0YXR1c0xhYmVsKGYuc3RhdHVzKX1dYCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZmxvb3JOdW1iZXIgLSBiLmZsb29yTnVtYmVyKTtcbiAgICAgICAgICBpZiAodGhpcy5mbG9vcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm9uRmxvb3JTZWxlY3RlZCh0aGlzLmZsb29yc1swXS5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29ycyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcbiAgICAgICAgICAgIGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gbG9hZCBmbG9vcnMuXCIsXG4gICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29ycyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBvbkZsb29yU2VsZWN0ZWQoZmxvb3JJZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkID0gZmxvb3JJZDtcbiAgICBjb25zdCBmbG9vciA9IHRoaXMuZmxvb3JzLmZpbmQoKGYpID0+IGYuX2lkID09PSBmbG9vcklkKTtcbiAgICBpZiAoZmxvb3IpIHtcbiAgICAgIHRoaXMuY3VycmVudFN0YXR1cyA9IGZsb29yLnN0YXR1cztcbiAgICAgIHRoaXMudGFyZ2V0U3RhdHVzID0gZmxvb3Iuc3RhdHVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0dXMgPSBudWxsO1xuICAgICAgdGhpcy50YXJnZXRTdGF0dXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFyZ2V0U3RhdHVzU2VsZWN0ZWQodmFsdWU6IEJ1Y2tldFN0YXR1cyB8IG51bGwpIHtcbiAgICB0aGlzLnRhcmdldFN0YXR1cyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHN0YXR1c0NoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50YXJnZXRTdGF0dXMgJiYgdGhpcy50YXJnZXRTdGF0dXMgIT09IHRoaXMuY3VycmVudFN0YXR1cztcbiAgfVxuXG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRmxvb3JJZCB8fCAhdGhpcy50YXJnZXRTdGF0dXMpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhbnlDbGVhciA9XG4gICAgICB0aGlzLmNsZWFyTGF5b3V0VGFza3MgfHwgdGhpcy5jbGVhckZpeHR1cmVUYXNrcyB8fCB0aGlzLmNsZWFyWm9uZVRhc2tzO1xuICAgIHJldHVybiB0aGlzLnN0YXR1c0NoYW5nZWQgfHwgYW55Q2xlYXI7XG4gIH1cblxuICBnZXRTdGF0dXNMYWJlbChzdGF0dXM6IEJ1Y2tldFN0YXR1cyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc3RhdHVzKSByZXR1cm4gXCItLVwiO1xuICAgIHJldHVybiBTVEFUVVNfT1BUSU9OUy5maW5kKChzKSA9PiBzLnZhbHVlID09PSBzdGF0dXMpPy5sYWJlbCB8fCBzdGF0dXM7XG4gIH1cblxuICBnZXRCdWNrZXRMYWJlbChzdGF0dXM6IEJ1Y2tldFN0YXR1cyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc3RhdHVzKSByZXR1cm4gXCItLVwiO1xuICAgIHJldHVybiBTVEFUVVNfT1BUSU9OUy5maW5kKChzKSA9PiBzLnZhbHVlID09PSBzdGF0dXMpPy5idWNrZXQgfHwgXCItLVwiO1xuICB9XG5cbiAgYXN5bmMgb25TdWJtaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmxvb3IgPSB0aGlzLmZsb29ycy5maW5kKChmKSA9PiBmLl9pZCA9PT0gdGhpcy5zZWxlY3RlZEZsb29ySWQpO1xuICAgIGNvbnN0IGZsb29yTGFiZWwgPSBmbG9vclxuICAgICAgPyBgRmxvb3IgJHtmbG9vci5mbG9vck51bWJlcn0gKCR7Zmxvb3IuZmxvb3JOYW1lfSlgXG4gICAgICA6IFwic2VsZWN0ZWQgZmxvb3JcIjtcblxuICAgIGNvbnN0IGNsZWFyU3VtbWFyeTogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5jbGVhckxheW91dFRhc2tzKSBjbGVhclN1bW1hcnkucHVzaChcIkxheW91dFwiKTtcbiAgICBpZiAodGhpcy5jbGVhckZpeHR1cmVUYXNrcykgY2xlYXJTdW1tYXJ5LnB1c2goXCJGaXh0dXJlXCIpO1xuICAgIGlmICh0aGlzLmNsZWFyWm9uZVRhc2tzKSBjbGVhclN1bW1hcnkucHVzaChcIlpvbmVcIik7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBsaW5lcy5wdXNoKGBTdG9yZTogJHt0aGlzLnNlbGVjdGVkU3RvcmVMYWJlbCA/PyBcIi0tXCJ9YCk7XG4gICAgbGluZXMucHVzaChmbG9vckxhYmVsKTtcbiAgICBpZiAodGhpcy5zdGF0dXNDaGFuZ2VkKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgU3RhdHVzOiAke3RoaXMuZ2V0U3RhdHVzTGFiZWwodGhpcy5jdXJyZW50U3RhdHVzKX0g4oaSICR7dGhpcy5nZXRTdGF0dXNMYWJlbCh0aGlzLnRhcmdldFN0YXR1cyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjbGVhclN1bW1hcnkubGVuZ3RoKSB7XG4gICAgICBsaW5lcy5wdXNoKGBDbGVhciB0YXNrczogJHtjbGVhclN1bW1hcnkuam9pbihcIiwgXCIpfWApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFwiVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gQ29udGludWU/XCIpO1xuXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtKFxuICAgICAgXCJDb25maXJtIGJ1Y2tldCB1cGRhdGVcIixcbiAgICAgIGxpbmVzLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcklkISxcbiAgICAgIHRhcmdldFN0YXR1czogdGhpcy50YXJnZXRTdGF0dXMhLFxuICAgICAgY2xlYXJMYXlvdXRUYXNrczogdGhpcy5jbGVhckxheW91dFRhc2tzLFxuICAgICAgY2xlYXJGaXh0dXJlVGFza3M6IHRoaXMuY2xlYXJGaXh0dXJlVGFza3MsXG4gICAgICBjbGVhclpvbmVUYXNrczogdGhpcy5jbGVhclpvbmVUYXNrcyxcbiAgICB9O1xuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2JzLm1vdmVTdG9yZUJ1Y2tldChwYXlsb2FkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGEgfHwge307XG4gICAgICAgIGNvbnN0IGRlbGV0ZWQgPSBkYXRhPy5kZWxldGVkQ291bnRzIHx8IHt9O1xuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGRhdGE/LnByZXZTdGF0dXMgJiYgZGF0YT8ubmV4dFN0YXR1cykge1xuICAgICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBgTW92ZWQgJHt0aGlzLmdldFN0YXR1c0xhYmVsKGRhdGEucHJldlN0YXR1cyl9IOKGkiAke3RoaXMuZ2V0U3RhdHVzTGFiZWwoZGF0YS5uZXh0U3RhdHVzKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlbGV0ZWQucHJvY2Vzc2VkVGFza3MgfHwgZGVsZXRlZC5wbGFub1Rhc2tDb21wbGlhbmNlcykge1xuICAgICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBgQ2xlYXJlZCAke2RlbGV0ZWQucHJvY2Vzc2VkVGFza3MgfHwgMH0gdGFzayhzKSwgJHtkZWxldGVkLnBsYW5vVGFza0NvbXBsaWFuY2VzIHx8IDB9IGNvbXBsaWFuY2Ugcm93KHMpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICAgICAgcGFydHMuam9pbihcIi4gXCIpIHx8IFwiVXBkYXRlZCBzdWNjZXNzZnVsbHlcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkRmxvb3JzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gdXBkYXRlLlwiLCBcImVycm9yXCIpO1xuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybSh0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSB0aXRsZTtcbiAgICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpcm1MYWJlbCA9IFwiVXBkYXRlXCI7XG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUNsYXNzID0gXCJidG4tcHJpbWFyeVwiO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVmLnJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IFwib2tcIjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogXCJzdWNjZXNzXCIgfCBcImVycm9yXCIpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XG4gICAgdGhpcy5tZXNzYWdlVHlwZSA9IHR5cGU7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gXCJcIiksIDYwMDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cIm1vdmUtYnVja2V0IHAtM1wiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTRcIiBzdHlsZT1cIm1heC13aWR0aDogNjQwcHg7XCI+XG4gICAgPGg1IGNsYXNzPVwibWItMVwiPk1vdmUgU3RvcmUgQnVja2V0PC9oNT5cbiAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbWItM1wiPlxuICAgICAgTW92ZSBhIGZsb29yIGJldHdlZW4gT25ib2FyZGluZyAoRHJhZnQgLyBBbGxvY2F0aW9uIFBlbmRpbmcpIGFuZCBNYW5hZ2VQbGFubyAoQ29tcGxldGVkKSB3aXRob3V0IGxvc2luZyBzdG9yZSBkYXRhLlxuICAgIDwvcD5cblxuICAgIDwhLS0gU3RvcmUgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XG4gICAgICAgIGxhYmVsPVwiU3RvcmVcIlxuICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcbiAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcbiAgICAgICAgW2RhdGFdPVwic3RvcmVPcHRpb25zXCJcbiAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRTdG9yZUlkXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TdG9yZVNlbGVjdGVkKCRldmVudClcIj5cbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmxvb3IgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNlbGVjdGVkU3RvcmVJZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0Zsb29yczsgZWxzZSBmbG9vclBpY2tlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPkxvYWRpbmcgZmxvb3JzLi4uPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmxvb3JQaWNrZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmbG9vcnMubGVuZ3RoID4gMDsgZWxzZSBub0Zsb29yc1wiPlxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XG4gICAgICAgICAgICBsYWJlbD1cIkZsb29yXCJcbiAgICAgICAgICAgIFtpZEZpZWxkXT1cIidfaWQnXCJcbiAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2Rpc3BsYXlOYW1lJ1wiXG4gICAgICAgICAgICBbZGF0YV09XCJmbG9vcnNcIlxuICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRmxvb3JJZFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9GbG9vcnM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBmbG9vcnMgZm91bmQgZm9yIHRoaXMgc3RvcmUuPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDdXJyZW50IGJ1Y2tldCBpbmZvICsgdGFyZ2V0IHN0YXR1cyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGbG9vcklkICYmIGN1cnJlbnRTdGF0dXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHAtMyByb3VuZGVkIGN1cnJlbnQtaW5mb1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHNtYWxsXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+Q3VycmVudCBidWNrZXQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGdldEJ1Y2tldExhYmVsKGN1cnJlbnRTdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBzbWFsbCBtdC0xXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+Q3VycmVudCBzdGF0dXM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGdldFN0YXR1c0xhYmVsKGN1cnJlbnRTdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxuICAgICAgICAgIGxhYmVsPVwiTW92ZSB0byBzdGF0dXNcIlxuICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxuICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXG4gICAgICAgICAgW3N1YlRleHRGaWVsZF09XCInYnVja2V0J1wiXG4gICAgICAgICAgW2RhdGFdPVwic3RhdHVzT3B0aW9uc1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwidGFyZ2V0U3RhdHVzXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblRhcmdldFN0YXR1c1NlbGVjdGVkKCRldmVudClcIj5cbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtd2FybmluZ1wiICpuZ0lmPVwic3RhdHVzQ2hhbmdlZFwiPlxuICAgICAgICAgIGlzUGxhbm9BcHByb3ZlZCB3aWxsIGJlIHNldCB0b1xuICAgICAgICAgIDxzdHJvbmc+e3sgdGFyZ2V0U3RhdHVzID09PSAnZHJhZnQnID8gJ2ZhbHNlJyA6ICd0cnVlJyB9fTwvc3Ryb25nPixcbiAgICAgICAgICBwbGFub1Byb2dyZXNzIHdpbGwgYmUgc2V0IHRvXG4gICAgICAgICAgPHN0cm9uZz57eyB0YXJnZXRTdGF0dXMgPT09ICdjb21wbGV0ZWQnID8gMjUgOiAwIH19PC9zdHJvbmc+LlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhc2sgY2xlYW51cCBjaGVja2JveGVzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNsZWFyIHRhc2tzICZhbXA7IGNvbXBsaWFuY2Ugcm93cyAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjbHJMYXlvdXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNsZWFyTGF5b3V0VGFza3NcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjbHJMYXlvdXRcIj5cbiAgICAgICAgICAgICAgTGF5b3V0IHRhc2tzXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPihwbGFub1R5cGU6IGxheW91dCwgbGF5b3V0Rml4dHVyZSk8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjbHJGaXh0dXJlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjbGVhckZpeHR1cmVUYXNrc1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNsckZpeHR1cmVcIj5cbiAgICAgICAgICAgICAgRml4dHVyZSB0YXNrc1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj4ocGxhbm9UeXBlOiBmaXh0dXJlLCB2bSk8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjbHJab25lXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjbGVhclpvbmVUYXNrc1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNsclpvbmVcIj5cbiAgICAgICAgICAgICAgWm9uZSB0YXNrc1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj4ocGxhbm9UeXBlOiB6b25lVmVyaWZpY2F0aW9uKTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN1Ym1pdCAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIiBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdFwiPlxuICAgICAge3sgaXNTdWJtaXR0aW5nID8gJ1VwZGF0aW5nLi4uJyA6ICdVcGRhdGUnIH19XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydFwiICpuZ0lmPVwibWVzc2FnZVwiXG4gICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJtZXNzYWdlVHlwZSA9PT0gJ3N1Y2Nlc3MnXCJcbiAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIlxuICAgICAgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+XG4gICAgICB7eyBtZXNzYWdlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS1idWNrZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbW92ZS1idWNrZXQvbW92ZS1idWNrZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbW92ZS1idWNrZXQvbW92ZS1idWNrZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQzs7Ozs7Ozs7QUF3QjdHLE1BQU0sY0FBYyxHQUFtQjtJQUNyQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQ3hEO1FBQ0UsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLE1BQU0sRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRTtDQUNsRSxDQUFDO0FBT0YsTUFBTSxPQUFPLG1CQUFtQjtJQTBCcEI7SUFDQTtJQUNBO0lBM0JWLFFBQVEsQ0FBUztJQUVqQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxrQkFBa0IsR0FBa0IsSUFB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QUUsQ0FBQztJQUMzQixDQUFDO3dHQXRQVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix1RENsRGhDLHkySkF1SEE7OzRGRHJFYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuXHJcbmludGVyZmFjZSBTdG9yZU9wdGlvbiB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRmxvb3JPcHRpb24ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGZsb29yTnVtYmVyOiBudW1iZXI7XHJcbiAgZmxvb3JOYW1lOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBCdWNrZXRTdGF0dXM7XHJcbiAgaXNQbGFub0FwcHJvdmVkPzogYm9vbGVhbjtcclxuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIEJ1Y2tldFN0YXR1cyA9IFwiZHJhZnRcIiB8IFwiYWxsb2NhdGlvblBlbmRpbmdcIiB8IFwiY29tcGxldGVkXCI7XHJcblxyXG5pbnRlcmZhY2UgU3RhdHVzT3B0aW9uIHtcclxuICB2YWx1ZTogQnVja2V0U3RhdHVzO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgYnVja2V0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFNUQVRVU19PUFRJT05TOiBTdGF0dXNPcHRpb25bXSA9IFtcclxuICB7IHZhbHVlOiBcImRyYWZ0XCIsIGxhYmVsOiBcIkRyYWZ0XCIsIGJ1Y2tldDogXCJPbmJvYXJkaW5nXCIgfSxcclxuICB7XHJcbiAgICB2YWx1ZTogXCJhbGxvY2F0aW9uUGVuZGluZ1wiLFxyXG4gICAgbGFiZWw6IFwiQWxsb2NhdGlvbiBQZW5kaW5nXCIsXHJcbiAgICBidWNrZXQ6IFwiT25ib2FyZGluZ1wiLFxyXG4gIH0sXHJcbiAgeyB2YWx1ZTogXCJjb21wbGV0ZWRcIiwgbGFiZWw6IFwiQ29tcGxldGVkXCIsIGJ1Y2tldDogXCJNYW5hZ2VQbGFub1wiIH0sXHJcbl07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItbW92ZS1idWNrZXRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL21vdmUtYnVja2V0LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9tb3ZlLWJ1Y2tldC5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW92ZUJ1Y2tldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdGVkU3RvcmVMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGZsb29yczogRmxvb3JPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkRmxvb3JJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNMb2FkaW5nRmxvb3JzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXR1c09wdGlvbnMgPSBTVEFUVVNfT1BUSU9OUztcclxuICB0YXJnZXRTdGF0dXM6IEJ1Y2tldFN0YXR1cyB8IG51bGwgPSBudWxsO1xyXG4gIGN1cnJlbnRTdGF0dXM6IEJ1Y2tldFN0YXR1cyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjbGVhckxheW91dFRhc2tzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xlYXJGaXh0dXJlVGFza3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjbGVhclpvbmVUYXNrczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIG1lc3NhZ2VUeXBlOiBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIiA9IFwic3VjY2Vzc1wiO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNiczogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFN0b3JlcygpIHtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiBcInN0b3JlXCIgfSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IHJlcz8uZGF0YSB8fCBbXTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN0b3JlU2VsZWN0ZWQoc3RvcmVJZDogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlSWQgPSBzdG9yZUlkO1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlT3B0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzdG9yZUlkKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUxhYmVsID0gc3RvcmU/LmxhYmVsID8/IG51bGw7XHJcbiAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUxhYmVsKSB7XHJcbiAgICAgIHRoaXMubG9hZEZsb29ycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldEZsb29yU3RhdGUoKSB7XHJcbiAgICB0aGlzLmZsb29ycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50U3RhdHVzID0gbnVsbDtcclxuICAgIHRoaXMudGFyZ2V0U3RhdHVzID0gbnVsbDtcclxuICAgIHRoaXMuY2xlYXJMYXlvdXRUYXNrcyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhckZpeHR1cmVUYXNrcyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhclpvbmVUYXNrcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZsb29ycygpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFN0b3JlTGFiZWwpIHJldHVybjtcclxuICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gdHJ1ZTtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5nZXRGbG9vcnNXaXRoU3RhdHVzKHRoaXMuc2VsZWN0ZWRTdG9yZUxhYmVsLCB0aGlzLmNsaWVudElkKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJhdzogYW55W10gPSByZXM/LmRhdGE/LmZsb29ycyB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuZmxvb3JzID0gcmF3XHJcbiAgICAgICAgICAgIC5tYXAoKGYpID0+ICh7XHJcbiAgICAgICAgICAgICAgX2lkOiBmLl9pZCxcclxuICAgICAgICAgICAgICBmbG9vck51bWJlcjogZi5mbG9vck51bWJlcixcclxuICAgICAgICAgICAgICBmbG9vck5hbWU6IGYuZmxvb3JOYW1lLFxyXG4gICAgICAgICAgICAgIHN0YXR1czogZi5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgaXNQbGFub0FwcHJvdmVkOiBmLmlzUGxhbm9BcHByb3ZlZCxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogYEZsb29yICR7Zi5mbG9vck51bWJlcn0g4oCUICR7Zi5mbG9vck5hbWV9IFske3RoaXMuZ2V0U3RhdHVzTGFiZWwoZi5zdGF0dXMpfV1gLFxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZmxvb3JOdW1iZXIgLSBiLmZsb29yTnVtYmVyKTtcclxuICAgICAgICAgIGlmICh0aGlzLmZsb29ycy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkZsb29yU2VsZWN0ZWQodGhpcy5mbG9vcnNbMF0uX2lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgZmxvb3JzLlwiLFxyXG4gICAgICAgICAgICBcImVycm9yXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uRmxvb3JTZWxlY3RlZChmbG9vcklkOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZCA9IGZsb29ySWQ7XHJcbiAgICBjb25zdCBmbG9vciA9IHRoaXMuZmxvb3JzLmZpbmQoKGYpID0+IGYuX2lkID09PSBmbG9vcklkKTtcclxuICAgIGlmIChmbG9vcikge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGF0dXMgPSBmbG9vci5zdGF0dXM7XHJcbiAgICAgIHRoaXMudGFyZ2V0U3RhdHVzID0gZmxvb3Iuc3RhdHVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50U3RhdHVzID0gbnVsbDtcclxuICAgICAgdGhpcy50YXJnZXRTdGF0dXMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25UYXJnZXRTdGF0dXNTZWxlY3RlZCh2YWx1ZTogQnVja2V0U3RhdHVzIHwgbnVsbCkge1xyXG4gICAgdGhpcy50YXJnZXRTdGF0dXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzdGF0dXNDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy50YXJnZXRTdGF0dXMgJiYgdGhpcy50YXJnZXRTdGF0dXMgIT09IHRoaXMuY3VycmVudFN0YXR1cztcclxuICB9XHJcblxyXG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZEZsb29ySWQgfHwgIXRoaXMudGFyZ2V0U3RhdHVzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBhbnlDbGVhciA9XHJcbiAgICAgIHRoaXMuY2xlYXJMYXlvdXRUYXNrcyB8fCB0aGlzLmNsZWFyRml4dHVyZVRhc2tzIHx8IHRoaXMuY2xlYXJab25lVGFza3M7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNDaGFuZ2VkIHx8IGFueUNsZWFyO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzTGFiZWwoc3RhdHVzOiBCdWNrZXRTdGF0dXMgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RhdHVzKSByZXR1cm4gXCItLVwiO1xyXG4gICAgcmV0dXJuIFNUQVRVU19PUFRJT05TLmZpbmQoKHMpID0+IHMudmFsdWUgPT09IHN0YXR1cyk/LmxhYmVsIHx8IHN0YXR1cztcclxuICB9XHJcblxyXG4gIGdldEJ1Y2tldExhYmVsKHN0YXR1czogQnVja2V0U3RhdHVzIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuIFwiLS1cIjtcclxuICAgIHJldHVybiBTVEFUVVNfT1BUSU9OUy5maW5kKChzKSA9PiBzLnZhbHVlID09PSBzdGF0dXMpPy5idWNrZXQgfHwgXCItLVwiO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZmxvb3IgPSB0aGlzLmZsb29ycy5maW5kKChmKSA9PiBmLl9pZCA9PT0gdGhpcy5zZWxlY3RlZEZsb29ySWQpO1xyXG4gICAgY29uc3QgZmxvb3JMYWJlbCA9IGZsb29yXHJcbiAgICAgID8gYEZsb29yICR7Zmxvb3IuZmxvb3JOdW1iZXJ9ICgke2Zsb29yLmZsb29yTmFtZX0pYFxyXG4gICAgICA6IFwic2VsZWN0ZWQgZmxvb3JcIjtcclxuXHJcbiAgICBjb25zdCBjbGVhclN1bW1hcnk6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5jbGVhckxheW91dFRhc2tzKSBjbGVhclN1bW1hcnkucHVzaChcIkxheW91dFwiKTtcclxuICAgIGlmICh0aGlzLmNsZWFyRml4dHVyZVRhc2tzKSBjbGVhclN1bW1hcnkucHVzaChcIkZpeHR1cmVcIik7XHJcbiAgICBpZiAodGhpcy5jbGVhclpvbmVUYXNrcykgY2xlYXJTdW1tYXJ5LnB1c2goXCJab25lXCIpO1xyXG5cclxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGluZXMucHVzaChgU3RvcmU6ICR7dGhpcy5zZWxlY3RlZFN0b3JlTGFiZWwgPz8gXCItLVwifWApO1xyXG4gICAgbGluZXMucHVzaChmbG9vckxhYmVsKTtcclxuICAgIGlmICh0aGlzLnN0YXR1c0NoYW5nZWQpIHtcclxuICAgICAgbGluZXMucHVzaChcclxuICAgICAgICBgU3RhdHVzOiAke3RoaXMuZ2V0U3RhdHVzTGFiZWwodGhpcy5jdXJyZW50U3RhdHVzKX0g4oaSICR7dGhpcy5nZXRTdGF0dXNMYWJlbCh0aGlzLnRhcmdldFN0YXR1cyl9YCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChjbGVhclN1bW1hcnkubGVuZ3RoKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYENsZWFyIHRhc2tzOiAke2NsZWFyU3VtbWFyeS5qb2luKFwiLCBcIil9YCk7XHJcbiAgICB9XHJcbiAgICBsaW5lcy5wdXNoKFwiVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gQ29udGludWU/XCIpO1xyXG5cclxuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybShcclxuICAgICAgXCJDb25maXJtIGJ1Y2tldCB1cGRhdGVcIixcclxuICAgICAgbGluZXMuam9pbihcIlxcblwiKSxcclxuICAgICk7XHJcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcklkISxcclxuICAgICAgdGFyZ2V0U3RhdHVzOiB0aGlzLnRhcmdldFN0YXR1cyEsXHJcbiAgICAgIGNsZWFyTGF5b3V0VGFza3M6IHRoaXMuY2xlYXJMYXlvdXRUYXNrcyxcclxuICAgICAgY2xlYXJGaXh0dXJlVGFza3M6IHRoaXMuY2xlYXJGaXh0dXJlVGFza3MsXHJcbiAgICAgIGNsZWFyWm9uZVRhc2tzOiB0aGlzLmNsZWFyWm9uZVRhc2tzLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNicy5tb3ZlU3RvcmVCdWNrZXQocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YSB8fCB7fTtcclxuICAgICAgICBjb25zdCBkZWxldGVkID0gZGF0YT8uZGVsZXRlZENvdW50cyB8fCB7fTtcclxuICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBpZiAoZGF0YT8ucHJldlN0YXR1cyAmJiBkYXRhPy5uZXh0U3RhdHVzKSB7XHJcbiAgICAgICAgICBwYXJ0cy5wdXNoKFxyXG4gICAgICAgICAgICBgTW92ZWQgJHt0aGlzLmdldFN0YXR1c0xhYmVsKGRhdGEucHJldlN0YXR1cyl9IOKGkiAke3RoaXMuZ2V0U3RhdHVzTGFiZWwoZGF0YS5uZXh0U3RhdHVzKX1gLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlbGV0ZWQucHJvY2Vzc2VkVGFza3MgfHwgZGVsZXRlZC5wbGFub1Rhc2tDb21wbGlhbmNlcykge1xyXG4gICAgICAgICAgcGFydHMucHVzaChcclxuICAgICAgICAgICAgYENsZWFyZWQgJHtkZWxldGVkLnByb2Nlc3NlZFRhc2tzIHx8IDB9IHRhc2socyksICR7ZGVsZXRlZC5wbGFub1Rhc2tDb21wbGlhbmNlcyB8fCAwfSBjb21wbGlhbmNlIHJvdyhzKWAsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgcGFydHMuam9pbihcIi4gXCIpIHx8IFwiVXBkYXRlZCBzdWNjZXNzZnVsbHlcIixcclxuICAgICAgICAgIFwic3VjY2Vzc1wiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWRGbG9vcnMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byB1cGRhdGUuXCIsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtKHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSB0aXRsZTtcclxuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XHJcbiAgICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtTGFiZWwgPSBcIlVwZGF0ZVwiO1xyXG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUNsYXNzID0gXCJidG4tcHJpbWFyeVwiO1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWYucmVzdWx0O1xyXG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBcIm9rXCI7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobXNnOiBzdHJpbmcsIHR5cGU6IFwic3VjY2Vzc1wiIHwgXCJlcnJvclwiKSB7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XHJcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdHlwZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMubWVzc2FnZSA9IFwiXCIpLCA2MDAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwibW92ZS1idWNrZXQgcC0zXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDY0MHB4O1wiPlxyXG4gICAgPGg1IGNsYXNzPVwibWItMVwiPk1vdmUgU3RvcmUgQnVja2V0PC9oNT5cclxuICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0zXCI+XHJcbiAgICAgIE1vdmUgYSBmbG9vciBiZXR3ZWVuIE9uYm9hcmRpbmcgKERyYWZ0IC8gQWxsb2NhdGlvbiBQZW5kaW5nKSBhbmQgTWFuYWdlUGxhbm8gKENvbXBsZXRlZCkgd2l0aG91dCBsb3Npbmcgc3RvcmUgZGF0YS5cclxuICAgIDwvcD5cclxuXHJcbiAgICA8IS0tIFN0b3JlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICBsYWJlbD1cIlN0b3JlXCJcclxuICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcclxuICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgIFtkYXRhXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlSWRcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRmxvb3IgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2VsZWN0ZWRTdG9yZUlkXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdGbG9vcnM7IGVsc2UgZmxvb3JQaWNrZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPkxvYWRpbmcgZmxvb3JzLi4uPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Zsb29yUGlja2VyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmbG9vcnMubGVuZ3RoID4gMDsgZWxzZSBub0Zsb29yc1wiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgbGFiZWw9XCJGbG9vclwiXHJcbiAgICAgICAgICAgIFtpZEZpZWxkXT1cIidfaWQnXCJcclxuICAgICAgICAgICAgW25hbWVGaWVsZF09XCInZGlzcGxheU5hbWUnXCJcclxuICAgICAgICAgICAgW2RhdGFdPVwiZmxvb3JzXCJcclxuICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGbG9vcklkXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GbG9vclNlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vRmxvb3JzPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBmbG9vcnMgZm91bmQgZm9yIHRoaXMgc3RvcmUuPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ3VycmVudCBidWNrZXQgaW5mbyArIHRhcmdldCBzdGF0dXMgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGbG9vcklkICYmIGN1cnJlbnRTdGF0dXNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcC0zIHJvdW5kZWQgY3VycmVudC1pbmZvXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBzbWFsbFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+Q3VycmVudCBidWNrZXQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZ2V0QnVja2V0TGFiZWwoY3VycmVudFN0YXR1cykgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBzbWFsbCBtdC0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj5DdXJyZW50IHN0YXR1czwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBnZXRTdGF0dXNMYWJlbChjdXJyZW50U3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICBsYWJlbD1cIk1vdmUgdG8gc3RhdHVzXCJcclxuICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgIFtzdWJUZXh0RmllbGRdPVwiJ2J1Y2tldCdcIlxyXG4gICAgICAgICAgW2RhdGFdPVwic3RhdHVzT3B0aW9uc1wiXHJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ0YXJnZXRTdGF0dXNcIlxyXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UYXJnZXRTdGF0dXNTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC13YXJuaW5nXCIgKm5nSWY9XCJzdGF0dXNDaGFuZ2VkXCI+XHJcbiAgICAgICAgICBpc1BsYW5vQXBwcm92ZWQgd2lsbCBiZSBzZXQgdG9cclxuICAgICAgICAgIDxzdHJvbmc+e3sgdGFyZ2V0U3RhdHVzID09PSAnZHJhZnQnID8gJ2ZhbHNlJyA6ICd0cnVlJyB9fTwvc3Ryb25nPixcclxuICAgICAgICAgIHBsYW5vUHJvZ3Jlc3Mgd2lsbCBiZSBzZXQgdG9cclxuICAgICAgICAgIDxzdHJvbmc+e3sgdGFyZ2V0U3RhdHVzID09PSAnY29tcGxldGVkJyA/IDI1IDogMCB9fTwvc3Ryb25nPi5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFRhc2sgY2xlYW51cCBjaGVja2JveGVzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5DbGVhciB0YXNrcyAmYW1wOyBjb21wbGlhbmNlIHJvd3MgKG9wdGlvbmFsKTwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2xyTGF5b3V0XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNsZWFyTGF5b3V0VGFza3NcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNsckxheW91dFwiPlxyXG4gICAgICAgICAgICAgIExheW91dCB0YXNrc1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPihwbGFub1R5cGU6IGxheW91dCwgbGF5b3V0Rml4dHVyZSk8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNsckZpeHR1cmVcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2xlYXJGaXh0dXJlVGFza3NcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNsckZpeHR1cmVcIj5cclxuICAgICAgICAgICAgICBGaXh0dXJlIHRhc2tzXHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+KHBsYW5vVHlwZTogZml4dHVyZSwgdm0pPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjbHJab25lXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNsZWFyWm9uZVRhc2tzXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjbHJab25lXCI+XHJcbiAgICAgICAgICAgICAgWm9uZSB0YXNrc1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPihwbGFub1R5cGU6IHpvbmVWZXJpZmljYXRpb24pPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBTdWJtaXQgLS0+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIiBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdFwiPlxyXG4gICAgICB7eyBpc1N1Ym1pdHRpbmcgPyAnVXBkYXRpbmcuLi4nIDogJ1VwZGF0ZScgfX1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtdC0zIGFsZXJ0XCIgKm5nSWY9XCJtZXNzYWdlXCJcclxuICAgICAgW2NsYXNzLmFsZXJ0LXN1Y2Nlc3NdPVwibWVzc2FnZVR5cGUgPT09ICdzdWNjZXNzJ1wiXHJcbiAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIlxyXG4gICAgICBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtbGluZTtcIj5cclxuICAgICAge3sgbWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuIl19