@smarterplan/ngx-smarterplan-locations 0.4.19 → 0.4.21

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 (39) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/carousel/carousel.component.mjs +3 -3
  3. package/esm2022/lib/components/chevron/chevron.component.mjs +3 -3
  4. package/esm2022/lib/components/detail-location/detail-location.component.mjs +40 -4
  5. package/esm2022/lib/components/form-location/form-location.component.mjs +3 -3
  6. package/esm2022/lib/components/images/images.component.mjs +3 -3
  7. package/esm2022/lib/components/landmark-picker/landmark-picker.component.mjs +3 -3
  8. package/esm2022/lib/components/locations/locations.component.mjs +19 -4
  9. package/esm2022/lib/components/locations/map/map-popup/map-popup.component.mjs +3 -3
  10. package/esm2022/lib/components/locations/map/map.component.mjs +3 -3
  11. package/esm2022/lib/components/models3d/models3d.component.mjs +295 -0
  12. package/esm2022/lib/components/plan-legend/plan-legend.component.mjs +3 -3
  13. package/esm2022/lib/components/plans/calibration/calibration.component.mjs +3 -3
  14. package/esm2022/lib/components/plans/edit-plan/edit-plan.component.mjs +3 -3
  15. package/esm2022/lib/components/plans/plans.component.mjs +3 -3
  16. package/esm2022/lib/components/tab-navigation/tab-navigation.component.mjs +3 -3
  17. package/esm2022/lib/components/visits/visits.component.mjs +45 -12
  18. package/esm2022/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +3 -3
  19. package/esm2022/lib/components/zones/add-zone/add-zone.component.mjs +3 -3
  20. package/esm2022/lib/components/zones/add-zone/selection/selection.component.mjs +3 -3
  21. package/esm2022/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +3 -3
  22. package/esm2022/lib/components/zones/zones.component.mjs +3 -3
  23. package/esm2022/lib/helper.service.mjs +1 -1
  24. package/esm2022/lib/ngx-smarterplan-location-routing.module.mjs +3 -1
  25. package/esm2022/lib/ngx-smarterplan-locations.module.mjs +4 -1
  26. package/esm2022/lib/ngx-smarterplan-locations.service.mjs +1 -1
  27. package/esm2022/lib/pipes/count-audio-sweeps.pipe.mjs +1 -1
  28. package/esm2022/lib/radio-button/radio-button.component.mjs +3 -3
  29. package/esm2022/public-api.mjs +1 -1
  30. package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs +424 -56
  31. package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
  32. package/lib/components/detail-location/detail-location.component.d.ts +13 -0
  33. package/lib/components/locations/locations.component.d.ts +10 -0
  34. package/lib/components/locations/map/map.component.d.ts +2 -2
  35. package/lib/components/models3d/models3d.component.d.ts +84 -0
  36. package/lib/components/visits/visits.component.d.ts +8 -3
  37. package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +0 -1
  38. package/lib/ngx-smarterplan-locations.module.d.ts +27 -26
  39. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { Component, Inject } from '@angular/core';
2
- import { MATTERPORT_SDK_KEY, SpaceStatus, distance } from '@smarterplan/ngx-smarterplan-core';
2
+ import { MATTERPORT_SDK_KEY, SpaceStatus, distance, CaptureViewer } from '@smarterplan/ngx-smarterplan-core';
3
3
  import { Subject, takeUntil } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/router";
@@ -52,6 +52,10 @@ export class DetailLocationComponent {
52
52
  // Visits available for the selected source space, and for the current (target) space
53
53
  sourceVisits = [];
54
54
  visits = [];
55
+ /** The capture a visitor opens by default, of any viewer type. Null means none chosen. */
56
+ defaultCaptureID = null;
57
+ savingDefaultCapture = false;
58
+ defaultCaptureError = null;
55
59
  // 3D landmark points picked directly in each viewer (source and target)
56
60
  landmarkSourceA = null;
57
61
  landmarkTargetA = null;
@@ -114,6 +118,7 @@ export class DetailLocationComponent {
114
118
  }
115
119
  // Visits (3D models) belonging to the CURRENT space, used as copy targets
116
120
  this.visits = await this.visitService.getVisitsForSpaceForUser(this.id);
121
+ this.defaultCaptureID = this.space?.defaultCaptureID ?? null;
117
122
  }
118
123
  setupMenuItems() {
119
124
  this.menuItems = [
@@ -233,6 +238,37 @@ export class DetailLocationComponent {
233
238
  }, 1500);
234
239
  }
235
240
  //
241
+ /**
242
+ * Stores which capture a visitor opens by default.
243
+ *
244
+ * One field on the space, not a flag per capture, so the two admin screens cannot disagree:
245
+ * setting it from either one writes the same place, and there is nothing to clear elsewhere.
246
+ */
247
+ async onDefaultCaptureChange() {
248
+ this.savingDefaultCapture = true;
249
+ this.defaultCaptureError = null;
250
+ try {
251
+ await this.spaceService.setDefaultCapture(this.id, this.defaultCaptureID || null);
252
+ this.space.defaultCaptureID = this.defaultCaptureID || null;
253
+ }
254
+ catch (error) {
255
+ // Until the schema change is deployed, AppSync rejects the field outright. Say so
256
+ // rather than leaving the picker looking as though it saved.
257
+ const graphQl = error?.errors;
258
+ this.defaultCaptureError = Array.isArray(graphQl) && graphQl.length > 0
259
+ ? graphQl.map((e) => e?.message ?? JSON.stringify(e)).join(' | ')
260
+ : (error?.message ?? String(error));
261
+ this.defaultCaptureID = this.space?.defaultCaptureID ?? null;
262
+ }
263
+ finally {
264
+ this.savingDefaultCapture = false;
265
+ }
266
+ }
267
+ /** Label for a visit in the default picker, naming the viewer it opens in. */
268
+ visitLabel(visit) {
269
+ const name = visit?.name || visit?.model3d || '';
270
+ return visit?.viewer === CaptureViewer.THREEJS ? `${name} (3D)` : `${name} (Matterport)`;
271
+ }
236
272
  // ---------- Copy POIs between visits ----------
237
273
  //
238
274
  /** Toggles visibility of the admin "copy POIs from another location" form. */
@@ -377,13 +413,13 @@ export class DetailLocationComponent {
377
413
  }
378
414
  }
379
415
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, deps: [{ token: MATTERPORT_SDK_KEY }, { token: i1.ActivatedRoute }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i1.Router }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.NavigatorService }, { token: i2.MatterportTagCopyService }], target: i0.ɵɵFactoryTarget.Component });
380
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DetailLocationComponent, selector: "lib-detail-location", ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle button for the admin \"Copy POIs\" form -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\r\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\r\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- Admin Form to Copy POIs -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\r\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\r\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\r\n class=\"border rounded p-3 mb-3 bg-white\">\r\n <p class=\"small text-muted mb-2\">\r\n {{ 'matterportCopy.landmarkInstructions' | translate }}\r\n </p>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center pt-2\">\r\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\r\n (click)=\"onCopyPois()\">\r\n {{ 'matterportCopy.copyButton' | translate }}\r\n </button>\r\n <div class=\"d-flex align-items-center gap-2 mb-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\r\n {{ 'matterportCopy.exportLandmarks' | translate }}\r\n </button>\r\n\r\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\r\n {{ 'matterportCopy.importLandmarks' | translate }}\r\n <input type=\"file\" accept=\"application/json\" hidden\r\n (change)=\"onImportLandmarkConfigSelected($event)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\r\n {{ copyPoisResultMsg }}\r\n </div>\r\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\r\n <div class=\"d-flex justify-content-between small mb-1\">\r\n <span>\r\n <ng-container [ngSwitch]=\"copyProgress.phase\">\r\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\r\n }}</span>\r\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\r\n </ng-container>\r\n </span>\r\n <span>{{ copyProgress.percent }}%</span>\r\n </div>\r\n <div class=\"progress\" style=\"height: 6px;\">\r\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\r\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\r\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\r\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\r\n </div>\r\n </div>\r\n\r\n <!-- Detailed step-by-step log -->\r\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\r\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\r\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\r\n [class.text-warning]=\"entry.type === 'healed'\">\r\n {{ entry.text }}\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\r\n (click)=\"downloadCopyLog()\">\r\n {{ 'matterportCopy.downloadLog' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.LandmarkPickerComponent, selector: "lib-landmark-picker", inputs: ["visit3dModel", "sdkKey", "title", "value"], outputs: ["pointPicked"] }, { kind: "component", type: i9.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i10.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
416
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DetailLocationComponent, selector: "lib-detail-location", ngImport: i0, template: "<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <!-- One picker for both viewers: the default lives on the space, so Matterport\n captures and 3D models compete for the same single slot. -->\n <li class=\"list-group-item bg-transparent\" *ngIf=\"visits.length > 1\">\n {{'Default visit' | translate}}:\n <select class=\"form-select d-inline-block ms-2\" style=\"width: auto;\"\n [(ngModel)]=\"defaultCaptureID\" (ngModelChange)=\"onDefaultCaptureChange()\"\n [disabled]=\"savingDefaultCapture\">\n <option [ngValue]=\"null\">{{'First available' | translate}}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.captureID\">\n {{ visitLabel(visit) }}\n </option>\n </select>\n <span class=\"form-text d-block\">\n {{'What a visitor opens when they enter this location.' | translate}}\n </span>\n <span class=\"text-danger d-block\" *ngIf=\"defaultCaptureError\">\n {{ defaultCaptureError }}\n </span>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.LandmarkPickerComponent, selector: "lib-landmark-picker", inputs: ["visit3dModel", "sdkKey", "title", "value"], outputs: ["pointPicked"] }, { kind: "component", type: i9.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i10.FormLocationComponent, selector: "lib-form-location", inputs: ["location"], outputs: ["onChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
381
417
  }
382
418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DetailLocationComponent, decorators: [{
383
419
  type: Component,
384
- args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\r\n </div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\r\n translate}}</button>\r\n <div class=\"row\" *ngIf=\"!isEditing && space\">\r\n <div class=\"col-md-5\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\r\n {{space.constructionYear ?\r\n space.constructionYear : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\r\n {{space.latitude ?\r\n space.latitude : \"No data\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\r\n space.longitude : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\r\n }} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\r\n {{space.classEnergyConsumption ?\r\n space.classEnergyConsumption : \"No data\" | translate}}\r\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\r\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\r\n {{'Get data from API DPE' | translate}}</button>\r\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\r\n style=\"cursor: pointer;\">\r\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\r\n data-height=\"25\"></span>\r\n {{'DPE data found. Click to validate' | translate}}\r\n </a>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\r\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\r\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\r\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\r\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\r\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\r\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\r\n </p>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"d-flex\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\r\n data-testid=\"location-edit-btn\">{{'Edit' |\r\n translate}}</button>\r\n <div class=\"tooltip-wrapper\"\r\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\r\n {{'Archive' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\r\n <h6>{{'Most relevant results for' | translate}} :\r\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\r\n </h6>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\r\n <th scope=\"col\">{{'Address' | translate}}</th>\r\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\r\n <th scope=\"col\">{{'Construction year' | translate}}</th>\r\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\r\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\r\n <th scope=\"row\">{{ i + 1 }}</th>\r\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\r\n (change)=\"onSelectChange(result)\"></td>\r\n <td>{{result.geo_adresse}}</td>\r\n <td>{{result.secteur_activite}}</td>\r\n <td>{{ result.annee_construction }}</td>\r\n <td>{{ result.classe_consommation_energie }}</td>\r\n <td>{{ result.classe_estimation_ges }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\r\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\r\n {{'No match (erase data)' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle button for the admin \"Copy POIs\" form -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\r\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\r\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- Admin Form to Copy POIs -->\r\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\r\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\r\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\r\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-3 col-md-5\">\r\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\r\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\r\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\r\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\r\n class=\"border rounded p-3 mb-3 bg-white\">\r\n <p class=\"small text-muted mb-2\">\r\n {{ 'matterportCopy.landmarkInstructions' | translate }}\r\n </p>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n\r\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\r\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\r\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\r\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\r\n </lib-landmark-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center pt-2\">\r\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\r\n (click)=\"onCopyPois()\">\r\n {{ 'matterportCopy.copyButton' | translate }}\r\n </button>\r\n <div class=\"d-flex align-items-center gap-2 mb-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\r\n {{ 'matterportCopy.exportLandmarks' | translate }}\r\n </button>\r\n\r\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\r\n {{ 'matterportCopy.importLandmarks' | translate }}\r\n <input type=\"file\" accept=\"application/json\" hidden\r\n (change)=\"onImportLandmarkConfigSelected($event)\">\r\n </label>\r\n </div>\r\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\r\n {{ copyPoisResultMsg }}\r\n </div>\r\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\r\n <div class=\"d-flex justify-content-between small mb-1\">\r\n <span>\r\n <ng-container [ngSwitch]=\"copyProgress.phase\">\r\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\r\n }}</span>\r\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\r\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\r\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\r\n </ng-container>\r\n </span>\r\n <span>{{ copyProgress.percent }}%</span>\r\n </div>\r\n <div class=\"progress\" style=\"height: 6px;\">\r\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\r\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\r\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\r\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\r\n </div>\r\n </div>\r\n\r\n <!-- Detailed step-by-step log -->\r\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\r\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\r\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\r\n [class.text-warning]=\"entry.type === 'healed'\">\r\n {{ entry.text }}\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\r\n (click)=\"downloadCopyLog()\">\r\n {{ 'matterportCopy.downloadLog' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\r\n</div>" }]
420
+ args: [{ selector: 'lib-detail-location', template: "<div class=\"container-fluid\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"reset()\"></lib-tab-navigation>\n </div>\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onReturn()\">{{'Back to locations' |\n translate}}</button>\n <div class=\"row\" *ngIf=\"!isEditing && space\">\n <div class=\"col-md-5\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{space.name}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{space.addresses}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Construction year' | translate}}:\n {{space.constructionYear ?\n space.constructionYear : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Latitude' | translate}}:\n {{space.latitude ?\n space.latitude : \"No data\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Longitude' | translate}}: {{space.longitude ?\n space.longitude : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate}}: {{space.level | translate\n }} </li>\n <li class=\"list-group-item bg-transparent\">{{'Energy Class' | translate}}:\n {{space.classEnergyConsumption ?\n space.classEnergyConsumption : \"No data\" | translate}}\n <button *ngIf=\"space.status !== 'DPE_TO_VALIDATE'\"\n class=\"btn btn-outline-primary rounded-pill no-lowercase ms-5\" (click)=\"onGetDpeData()\">\n {{'Get data from API DPE' | translate}}</button>\n <a class=\"bg-transparent ms-5\" *ngIf=\"space.status === 'DPE_TO_VALIDATE'\" (click)=\"onDpeValidate()\"\n style=\"cursor: pointer;\">\n <span class=\"iconify\" data-icon=\"mdi:alert-circle-check\" style=\"color: #f19c80;\" data-width=\"25\"\n data-height=\"25\"></span>\n {{'DPE data found. Click to validate' | translate}}\n </a>\n </li>\n <!-- One picker for both viewers: the default lives on the space, so Matterport\n captures and 3D models compete for the same single slot. -->\n <li class=\"list-group-item bg-transparent\" *ngIf=\"visits.length > 1\">\n {{'Default visit' | translate}}:\n <select class=\"form-select d-inline-block ms-2\" style=\"width: auto;\"\n [(ngModel)]=\"defaultCaptureID\" (ngModelChange)=\"onDefaultCaptureChange()\"\n [disabled]=\"savingDefaultCapture\">\n <option [ngValue]=\"null\">{{'First available' | translate}}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.captureID\">\n {{ visitLabel(visit) }}\n </option>\n </select>\n <span class=\"form-text d-block\">\n {{'What a visitor opens when they enter this location.' | translate}}\n </span>\n <span class=\"text-danger d-block\" *ngIf=\"defaultCaptureError\">\n {{ defaultCaptureError }}\n </span>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Greenhouse gas emission Class' | translate}}:\n {{space.classGes ? space.classGes : \"No data\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\">{{'Shareable Guest Link' | translate}}:\n <div style=\"display: inline;\" *ngIf=\"guestLink\">\n <a id=\"linkHref\" target=\"_blank\">{{'Try the link' | translate }}</a>\n <div [cdkCopyToClipboard]=\"guestLink\" [style.cursor]=\"'pointer'\"\n style=\"margin-left: 5px; max-width: 20px; display: inline;\" ngbTooltip=\"Copied!\"\n triggers=\"click:blur\">\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\n data-height=\"20\"></span>\n </div>\n </div>\n <p *ngIf=\"!guestLink\" style=\"display: inline;\">{{'No link' | translate }}</p>\n <p *ngIf=\"!guestLink\"><small>({{'Generate link from a VISITOR mission'|translate}})</small>\n </p>\n </li>\n\n </ul>\n <div class=\"d-flex justify-content-center\" *ngIf=\"gettingData\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <hr>\n <div class=\"d-flex\">\n <button class=\"btn btn-outline-primary rounded-pill me-3\" (click)=\"onEdit()\"\n data-testid=\"location-edit-btn\">{{'Edit' |\n translate}}</button>\n <div class=\"tooltip-wrapper\"\n ngbTooltip=\"{{!canArchive ? ('Contact SmarterPlan' | translate) : ('Archive location and related data' | translate)}}\">\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onArchive()\" [disabled]=\"!canArchive\">\n {{'Archive' | translate}}</button>\n </div>\n </div>\n\n\n </div>\n <div class=\"col-md-7\" *ngIf=\"isValidatingDpe\">\n <h6>{{'Most relevant results for' | translate}} :\n <b>diagnostics de performance \u00E9nerg\u00E9tique (DPE) des b\u00E2timents tertiaires</b>\n </h6>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">{{'Apply to location' | translate}}</th>\n <th scope=\"col\">{{'Address' | translate}}</th>\n <th scope=\"col\">{{'Activity sector' | translate}}</th>\n <th scope=\"col\">{{'Construction year' | translate}}</th>\n <th scope=\"col\">{{'Energy Class' | translate}}</th>\n <th scope=\"col\">{{'Greenhouse gas emission Class' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let result of parsedMetadata; index as i\">\n <th scope=\"row\">{{ i + 1 }}</th>\n <td><input class=\"checkbox-apply\" type=\"checkbox\" [(ngModel)]=\"result.selected\"\n (change)=\"onSelectChange(result)\"></td>\n <td>{{result.geo_adresse}}</td>\n <td>{{result.secteur_activite}}</td>\n <td>{{ result.annee_construction }}</td>\n <td>{{ result.classe_consommation_energie }}</td>\n <td>{{ result.classe_estimation_ges }}</td>\n </tr>\n </tbody>\n </table>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSaveResult()\"\n [disabled]=\"!selectedDpeResult\">{{'Save selected' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onErase()\">\n {{'No match (erase data)' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onCancel()\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n\n <!-- Toggle button for the admin \"Copy POIs\" form -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0\" class=\"mt-4\">\n <button class=\"btn btn-outline-secondary rounded-pill\" (click)=\"toggleCopyPoisForm()\">\n {{ (showCopyPoisForm ? 'matterportCopy.hideForm' : 'matterportCopy.showForm') | translate }}\n </button>\n </div>\n\n <!-- Admin Form to Copy POIs -->\n <div *ngIf=\"isAdmin && spaces && spaces.length > 0 && showCopyPoisForm\" class=\"mt-3 p-4 border rounded bg-light\">\n <h6>{{ 'matterportCopy.formTitle' | translate }}</h6>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceSpace' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSourceSpaceId\" (ngModelChange)=\"onSourceSpaceChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectSpace' | translate }}</option>\n <option *ngFor=\"let space of spaces\" [ngValue]=\"space.id\">{{space.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\" *ngIf=\"sourceVisits\">\n <label class=\"form-label\">{{ 'matterportCopy.sourceVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedSource3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of sourceVisits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-3 col-md-5\">\n <label class=\"form-label\">{{ 'matterportCopy.targetVisit' | translate }}</label>\n <select class=\"form-select\" [(ngModel)]=\"selectedTarget3dModel\" (ngModelChange)=\"onModelSelectionChange()\">\n <option [ngValue]=\"null\">{{ 'matterportCopy.selectVisit' | translate }}</option>\n <option *ngFor=\"let visit of visits\" [ngValue]=\"visit.model3d\">{{visit.name}}</option>\n </select>\n </div>\n\n <div *ngIf=\"selectedSourceSpaceId && selectedSource3dModel && selectedTarget3dModel\"\n class=\"border rounded p-3 mb-3 bg-white\">\n <p class=\"small text-muted mb-2\">\n {{ 'matterportCopy.landmarkInstructions' | translate }}\n </p>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkA' | translate }}</p>\n <div class=\"row mb-4\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceA\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetA\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('A', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n\n <p class=\"fw-bold small mb-2\">{{ 'matterportCopy.landmarkB' | translate }}</p>\n <div class=\"row\">\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedSource3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkSourceB\" title=\"{{ 'matterportCopy.sourceVisitLabel' | translate }}\"\n (pointPicked)=\"onSourceLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n <div class=\"col-6\">\n <lib-landmark-picker [visit3dModel]=\"selectedTarget3dModel\" [sdkKey]=\"sdkKey\"\n [value]=\"landmarkTargetB\" title=\"{{ 'matterportCopy.targetVisitLabel' | translate }}\"\n (pointPicked)=\"onTargetLandmarkPicked('B', $event)\">\n </lib-landmark-picker>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex align-items-center pt-2\">\n <button class=\"btn btn-primary rounded-pill me-3\" [disabled]=\"!canCopyPois || isCopyingPois\"\n (click)=\"onCopyPois()\">\n {{ 'matterportCopy.copyButton' | translate }}\n </button>\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"exportLandmarkConfig()\">\n {{ 'matterportCopy.exportLandmarks' | translate }}\n </button>\n\n <label class=\"btn btn-sm btn-outline-secondary mb-0\">\n {{ 'matterportCopy.importLandmarks' | translate }}\n <input type=\"file\" accept=\"application/json\" hidden\n (change)=\"onImportLandmarkConfigSelected($event)\">\n </label>\n </div>\n <div *ngIf=\"isCopyingPois\" class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n\n <div *ngIf=\"copyPoisResultMsg\" class=\"mt-2 text-success fw-bold\">\n {{ copyPoisResultMsg }}\n </div>\n <div *ngIf=\"copyProgress\" class=\"mt-3\">\n <div class=\"d-flex justify-content-between small mb-1\">\n <span>\n <ng-container [ngSwitch]=\"copyProgress.phase\">\n <span *ngSwitchCase=\"'collecting'\">{{ 'Collecting information from both visits...' | translate\n }}</span>\n <span *ngSwitchCase=\"'tickets'\">{{ 'Copying tickets' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'equipments'\">{{ 'Copying equipments' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'pois'\">{{ 'Copying standalone POIs' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'objects3d'\">{{ 'Copying 3D objects' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'features'\">{{ 'Copying features' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'measurements'\">{{ 'Copying measurements' | translate }} ({{\n copyProgress.processedInPhase }}/{{ copyProgress.totalInPhase }})</span>\n <span *ngSwitchCase=\"'done'\">{{ 'Done!' | translate }}</span>\n </ng-container>\n </span>\n <span>{{ copyProgress.percent }}%</span>\n </div>\n <div class=\"progress\" style=\"height: 6px;\">\n <div class=\"progress-bar\" [class.progress-bar-striped]=\"copyProgress.phase === 'collecting'\"\n [class.progress-bar-animated]=\"copyProgress.phase === 'collecting'\"\n [class.bg-warning]=\"copyProgress.errorCount > 0\" role=\"progressbar\"\n [style.width.%]=\"copyProgress.phase === 'collecting' ? 100 : copyProgress.percent\">\n </div>\n </div>\n\n <!-- Detailed step-by-step log -->\n <div *ngIf=\"copyLog.length > 0\" class=\"mt-2 p-2 bg-white border rounded small\"\n style=\"max-height: 200px; overflow-y: auto; font-family: monospace;\">\n <div *ngFor=\"let entry of copyLog\" [class.text-danger]=\"entry.type === 'error'\"\n [class.text-warning]=\"entry.type === 'healed'\">\n {{ entry.text }}\n </div>\n </div>\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary mt-2\" *ngIf=\"copyLog.length > 0\"\n (click)=\"downloadCopyLog()\">\n {{ 'matterportCopy.downloadLog' | translate }}\n </button>\n </div>\n </div>\n\n <lib-form-location *ngIf=\"isEditing\" [location]=\"space\" (onChange)=\"onFormChange($event)\"></lib-form-location>\n</div>" }]
385
421
  }], ctorParameters: () => [{ type: undefined, decorators: [{
386
422
  type: Inject,
387
423
  args: [MATTERPORT_SDK_KEY]
388
424
  }] }, { type: i1.ActivatedRoute }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i1.Router }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.NavigatorService }, { type: i2.MatterportTagCopyService }] });
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFLckUsT0FBTyxFQUNILGtCQUFrQixFQUN5QyxXQUFXLEVBRWhFLFFBQVEsRUFHakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7O0FBRTFDLHNHQUFzRztBQUN0RyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQU9sQyxNQUFNLE9BQU8sdUJBQXVCO0lBeURnQjtJQUNwQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBL0RaLDJCQUEyQjtJQUMzQixLQUFLLENBQVE7SUFDYixRQUFRLENBQW1CO0lBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsYUFBYSxDQUFPO0lBQ3BCLEVBQUUsQ0FBUztJQUNYLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFFM0Isa0NBQWtDO0lBQ2xDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsaUJBQWlCLENBQU07SUFDdkIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixjQUFjLENBT1Y7SUFFSixTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFVO0lB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QyxrQkFBa0IsQ0FBQztZQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7WUFFOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7Z0JBQVMsQ0FBQztZQUNQLDZFQUE2RTtZQUM3RSxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQzt3R0ExYVEsdUJBQXVCLGtCQXlEcEIsa0JBQWtCOzRGQXpEckIsdUJBQXVCLDJEQ3ZCcEMsODhmQStQTTs7NEZEeE9PLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUI7OzBCQTZEMUIsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBNQVRURVJQT1JUX1NES19LRVksXHJcbiAgICBNZW51SXRlbSwgU3BhY2VTZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIE5hdmlnYXRvclNlcnZpY2UsIFNwYWNlU3RhdHVzLCBTcGFjZSxcclxuICAgIE1hdHRlcnBvcnRUYWdDb3B5U2VydmljZSwgQ29weVByb2dyZXNzLCBDb3B5TG9nRW50cnksXHJcbiAgICBWZWMzLCBkaXN0YW5jZSxcclxuICAgIFZpc2l0LFxyXG4gICAgVmlzaXRTZXJ2aWNlXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBNaW5pbXVtIGRpc3RhbmNlIChpbiBtZXRlcnMpIHJlcXVpcmVkIGJldHdlZW4gdGhlIHR3byBsYW5kbWFya3MgZm9yIGEgcmVsaWFibGUgcm90YXRpb24gY2FsY3VsYXRpb25cclxuY29uc3QgTUlOX0xBTkRNQVJLX0RJU1RBTkNFID0gMS41O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtbG9jYXRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGV0YWlsTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLy8gLS0tIExvY2F0aW9uIGRldGFpbHMgLS0tXHJcbiAgICBzcGFjZTogU3BhY2U7XHJcbiAgICBlZGl0Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICAgIGlzRWRpdGluZyA9IGZhbHNlO1xyXG4gICAgaW1hZ2VUb1VwbG9hZDogRmlsZTtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvLyAtLS0gRFBFIChlbmVyZ3kgZGlhZ25vc3RpYykgLS0tXHJcbiAgICBpc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIHNlbGVjdGVkRHBlUmVzdWx0OiBhbnk7XHJcbiAgICBnZXR0aW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgcGFyc2VkTWV0YWRhdGE6IHtcclxuICAgICAgICBnZW9fYWRyZXNzZTogc3RyaW5nO1xyXG4gICAgICAgIHNlY3RldXJfYWN0aXZpdGU6IHN0cmluZztcclxuICAgICAgICBhbm5lZV9jb25zdHJ1Y3Rpb246IHN0cmluZztcclxuICAgICAgICBjbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWU6IHN0cmluZztcclxuICAgICAgICBjbGFzc2VfZXN0aW1hdGlvbl9nZXM6IHN0cmluZztcclxuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICAgIH1bXTtcclxuXHJcbiAgICBndWVzdExpbms6IHN0cmluZztcclxuICAgIGNhbkFyY2hpdmU6IGJvb2xlYW47XHJcbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgLy8gLS0tIENvcHkgUE9JcyBiZXR3ZWVuIHZpc2l0cyAtLS1cclxuICAgIGlzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHNwYWNlczogU3BhY2VbXSA9IFtdO1xyXG5cclxuICAgIC8vIFdoZXRoZXIgdGhlIFwiY29weSBQT0lzXCIgYWRtaW4gZm9ybSBpcyBjdXJyZW50bHkgdmlzaWJsZSAoY29sbGFwc2VkIGJ5IGRlZmF1bHQpXHJcbiAgICBzaG93Q29weVBvaXNGb3JtID0gZmFsc2U7XHJcblxyXG4gICAgLy8gU2VsZWN0ZWQgc291cmNlIFNQQUNFIChhIHNwYWNlIG1heSBjb250YWluIDAuLk4gdmlzaXRzL21vZGVscylcclxuICAgIHNlbGVjdGVkU291cmNlU3BhY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLy8gU2VsZWN0ZWQgM0QgbW9kZWwgaWRzICh2aXNpdC5tb2RlbDNkKSDigJQgdGhpcyBpcyB3aGF0IGFjdHVhbGx5IGdldHMgbG9hZGVkIGluIHRoZSB2aWV3ZXJcclxuICAgIHNlbGVjdGVkU291cmNlM2RNb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFRhcmdldDNkTW9kZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8vIFZpc2l0cyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UsIGFuZCBmb3IgdGhlIGN1cnJlbnQgKHRhcmdldCkgc3BhY2VcclxuICAgIHNvdXJjZVZpc2l0czogVmlzaXRbXSA9IFtdO1xyXG4gICAgdmlzaXRzOiBWaXNpdFtdID0gW107XHJcblxyXG4gICAgLy8gM0QgbGFuZG1hcmsgcG9pbnRzIHBpY2tlZCBkaXJlY3RseSBpbiBlYWNoIHZpZXdlciAoc291cmNlIGFuZCB0YXJnZXQpXHJcbiAgICBsYW5kbWFya1NvdXJjZUE6IFZlYzMgfCBudWxsID0gbnVsbDtcclxuICAgIGxhbmRtYXJrVGFyZ2V0QTogVmVjMyB8IG51bGwgPSBudWxsO1xyXG4gICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsYW5kbWFya1RhcmdldEI6IFZlYzMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBpc0NvcHlpbmdQb2lzID0gZmFsc2U7XHJcbiAgICBjb3B5UG9pc1Jlc3VsdE1zZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBjb3B5UHJvZ3Jlc3M6IENvcHlQcm9ncmVzcyB8IG51bGwgPSBudWxsO1xyXG4gICAgY29weUxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHVibGljIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0YWdDb3B5U2VydmljZTogTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHNwYWNlSUQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9sb2NhbGlzYXRpb25cIiwgc3BhY2VJRF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pZCA9IHBhcmFtcy5pZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlQcm9ncmVzcyRcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChwcm9ncmVzcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UHJvZ3Jlc3MgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuY29weUxvZyRcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsb2cpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29weUxvZyA9IGxvZztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gTGlmZWN5Y2xlIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyAtLS0tLS0tLS0tIFNldHVwIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgYXN5bmMgc2V0dXAoKSB7XHJcbiAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuaWQpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuICAgICAgICB0aGlzLnNldEd1ZXN0TGluaygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2FuQXJjaGl2ZSgpO1xyXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBZG1pbikge1xyXG4gICAgICAgICAgICBjb25zdCBzcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRMb2NhdGlvbnNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlcyA9IHNwYWNlcy5maWx0ZXIoKHNwYWNlKSA9PiBzcGFjZS5pZCAhPT0gdGhpcy5pZCkuc29ydCgoYSwgYikgPT4gKGEubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLm5hbWUgfHwgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVmlzaXRzICgzRCBtb2RlbHMpIGJlbG9uZ2luZyB0byB0aGUgQ1VSUkVOVCBzcGFjZSwgdXNlZCBhcyBjb3B5IHRhcmdldHNcclxuICAgICAgICB0aGlzLnZpc2l0cyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldFZpc2l0c0ZvclNwYWNlRm9yVXNlcih0aGlzLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cE1lbnVJdGVtcygpIHtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogXCJMb2NhdGlvbnNcIiwgdXJsOiBcIi9sb2NhbGlzYXRpb25cIiB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5zcGFjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuc3BhY2UuaWR9YCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkVkaXRcIiB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHsgbGFiZWw6IFwiSW5mb3JtYXRpb25cIiB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0Q2FuQXJjaGl2ZSgpIHtcclxuICAgICAgICB0aGlzLmNhbkFyY2hpdmUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzU1BBZG1pbigpXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNhbkFyY2hpdmVTcGFjZSh0aGlzLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRHdWVzdExpbmsoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3BhY2UuZ3Vlc3RMaW5rKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgb3JpZ2luIH0gPSBkb2N1bWVudC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5ndWVzdExpbmsgPSBgJHtvcmlnaW59LyR7dGhpcy5zcGFjZS5ndWVzdExpbmt9YDtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoeXBlcmxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiI2xpbmtIcmVmXCIsXHJcbiAgICAgICAgICAgICAgICApIGFzIEhUTUxMaW5rRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5mb2xsb3dMaW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5ndWVzdExpbms7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UubG9nb3V0Q3VycmVudEFuZFNpZ25PdXRBdXRoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImF1dGhcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gRWRpdCAvIGFyY2hpdmUgLyBuYXZpZ2F0aW9uIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgb25FZGl0KCkge1xyXG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZXR1cm4oKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BcmNoaXZlKCkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlU3BhY2VcIik7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnNvZnREZWxldGVTcGFjZSh0aGlzLmlkKTtcclxuICAgICAgICAgICAgdGhpcy5vblJldHVybigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoZXZlbnQ6IFNwYWNlKSB7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IGV2ZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gRFBFIChlbmVyZ3kgZGlhZ25vc3RpYykgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICBvbkRwZVZhbGlkYXRlKCkge1xyXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0aW5nRHBlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnNwYWNlLm1ldGFkYXRhKTtcclxuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gdGhpcy5wYXJzZWRNZXRhZGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgIChyZXN1bHQpID0+IHJlc3VsdC5nZW9fYWRyZXNzZSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0Q2hhbmdlKHNlbGVjdGVkUmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0aGlzLnBhcnNlZE1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHNlbGVjdGVkUmVzdWx0ICYmIHJlc3VsdC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdCA9IHNlbGVjdGVkUmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU2F2ZVJlc3VsdCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERwZVJlc3VsdCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0aW9uWWVhcjogdGhpcy5zZWxlY3RlZERwZVJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NHZXM6IHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2VzdGltYXRpb25fZ2VzLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkTG9jID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2UoaW5wdXQpO1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlID0gdXBkYXRlZExvYztcclxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkVyYXNlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuc3BhY2UuaWQsXHJcbiAgICAgICAgICAgIHN0YXR1czogU3BhY2VTdGF0dXMuRFBFX1ZBTElEQVRFRCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNwYWNlLnN0YXR1cyA9IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQ7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkdldERwZURhdGEoKSB7XHJcbiAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2Uoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5zcGFjZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfRkVUQ0gsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZS5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0dGluZ0RhdGEgPSBmYWxzZTtcclxuICAgICAgICB9LCAxNTAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICAvKiogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIHRoZSBhZG1pbiBcImNvcHkgUE9JcyBmcm9tIGFub3RoZXIgbG9jYXRpb25cIiBmb3JtLiAqL1xyXG4gICAgdG9nZ2xlQ29weVBvaXNGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0NvcHlQb2lzRm9ybSA9ICF0aGlzLnNob3dDb3B5UG9pc0Zvcm07XHJcbiAgICB9XHJcblxyXG4gICAgb25Tb3VyY2VMYW5kbWFya1BpY2tlZChzbG90OiAnQScgfCAnQicsIHBvaW50OiBWZWMzKSB7XHJcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IHBvaW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gcG9pbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoc2xvdDogJ0EnIHwgJ0InLCBwb2ludDogVmVjMykge1xyXG4gICAgICAgIGlmIChzbG90ID09PSAnQScpIHtcclxuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBwb2ludDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IHBvaW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogTG9hZHMgdGhlIHZpc2l0cyAoM0QgbW9kZWxzKSBhdmFpbGFibGUgZm9yIHRoZSBuZXdseSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UuICovXHJcbiAgICBhc3luYyBvblNvdXJjZVNwYWNlQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuc291cmNlVmlzaXRzID0gdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWRcclxuICAgICAgICAgICAgPyBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMub25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXNldHMgbGFuZG1hcmsgc2VsZWN0aW9ucyB3aGVuZXZlciB0aGUgc291cmNlIG9yIHRhcmdldCAzRCBtb2RlbCBjaGFuZ2VzLiAqL1xyXG4gICAgb25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRydWUgb25jZSBib3RoIG1vZGVscyBhcmUgc2VsZWN0ZWQsIGFsbCA0IGxhbmRtYXJrcyBhcmUgcGlja2VkLCBhbmQgQS9CIHBhaXJzIGFyZSBmYXIgZW5vdWdoIGFwYXJ0LiAqL1xyXG4gICAgZ2V0IGNhbkNvcHlQb2lzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5sYW5kbWFya1NvdXJjZUEgfHwgIXRoaXMubGFuZG1hcmtUYXJnZXRBIHx8ICF0aGlzLmxhbmRtYXJrU291cmNlQiB8fCAhdGhpcy5sYW5kbWFya1RhcmdldEIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzb3VyY2VEaXN0ID0gZGlzdGFuY2UodGhpcy5sYW5kbWFya1NvdXJjZUEsIHRoaXMubGFuZG1hcmtTb3VyY2VCKTtcclxuICAgICAgICBjb25zdCB0YXJnZXREaXN0ID0gZGlzdGFuY2UodGhpcy5sYW5kbWFya1RhcmdldEEsIHRoaXMubGFuZG1hcmtUYXJnZXRCKTtcclxuICAgICAgICByZXR1cm4gc291cmNlRGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0UgJiYgdGFyZ2V0RGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25Db3B5UG9pcygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRhcmdldFNwYWNlSWQgPSB0aGlzLmlkO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICFzZWxlY3RlZFRhcmdldFNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCA9PT0gc2VsZWN0ZWRUYXJnZXRTcGFjZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvclNhbWVTcGFjZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jYW5Db3B5UG9pcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JMYW5kbWFya3NUb29DbG9zZScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzQ29weWluZ1BvaXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlUYWdzRnJvbVZpc2l0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhcmdldFNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSxcclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRBLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAnbWF0dGVycG9ydENvcHkuc3VjY2Vzc01zZycgOiAnbWF0dGVycG9ydENvcHkuZXJyb3JNc2cnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yTXNnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNDb3B5aW5nUG9pcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IG51bGw7XHJcbiAgICAgICAgfSwgNTAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERvd25sb2FkcyB0aGUgY3VycmVudCBzb3VyY2UvdGFyZ2V0IHNlbGVjdGlvbiArIGFsbCA0IGxhbmRtYXJrcyBhcyBhIEpTT04gZmlsZS4gKi9cclxuICAgIGV4cG9ydExhbmRtYXJrQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JFeHBvcnRNaXNzaW5nU2VsZWN0aW9uJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgc291cmNlU3BhY2VJZDogdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQsXHJcbiAgICAgICAgICAgIHNvdXJjZVZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwsXHJcbiAgICAgICAgICAgIHRhcmdldFZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQTogdGhpcy5sYW5kbWFya1NvdXJjZUEsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QTogdGhpcy5sYW5kbWFya1RhcmdldEEsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQjogdGhpcy5sYW5kbWFya1NvdXJjZUIsXHJcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QjogdGhpcy5sYW5kbWFya1RhcmdldEJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgYS5ocmVmID0gdXJsO1xyXG4gICAgICAgIGEuZG93bmxvYWQgPSBgbGFuZG1hcmtzXyR7dGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWx9X3RvXyR7dGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWx9Lmpzb25gO1xyXG4gICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERvd25sb2FkcyB0aGUgZnVsbCBjb3B5IGxvZyAoc3RlcCBsaW5lcywgZXJyb3JzLCBhbmQgcmVwYWlyZWQtaXRlbSBub3RpY2VzKSBhcyBhIHRleHRcclxuICAgICAqICBmaWxlIOKAlCB0aGUgb24tc2NyZWVuIHBhbmVsIGlzIGNhcHBlZCB0byBhIHNtYWxsIHNjcm9sbGFibGUgYXJlYSBhbmQgbG9zZXMgbGluZXMgb25jZVxyXG4gICAgICogIGEgbmV3IHJ1biBzdGFydHMsIHRoaXMga2VlcHMgdGhlIGZ1bGwgcmVwb3J0LiAqL1xyXG4gICAgZG93bmxvYWRDb3B5TG9nKCkge1xyXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuZG93bmxvYWRMb2coKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJpZ2dlcmVkIGJ5IHRoZSBoaWRkZW4gZmlsZSBpbnB1dDsgcmVhZHMgYW5kIGFwcGxpZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIEpTT04gY29uZmlnLiAqL1xyXG4gICAgYXN5bmMgb25JbXBvcnRMYW5kbWFya0NvbmZpZ1NlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XHJcbiAgICAgICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZSh0ZXh0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJhc2ljIHNoYXBlIHZhbGlkYXRpb24gYmVmb3JlIGFwcGx5aW5nXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkS2V5cyA9IFsnc291cmNlU3BhY2VJZCcsICdzb3VyY2VWaXNpdDNkTW9kZWwnLCAndGFyZ2V0VmlzaXQzZE1vZGVsJyxcclxuICAgICAgICAgICAgICAgICdsYW5kbWFya1NvdXJjZUEnLCAnbGFuZG1hcmtUYXJnZXRBJywgJ2xhbmRtYXJrU291cmNlQicsICdsYW5kbWFya1RhcmdldEInXTtcclxuICAgICAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoayA9PiAhKGsgaW4gY29uZmlnKSk7XHJcbiAgICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckludmFsaWRDb25maWcnLCB7IGtleXM6IG1pc3Npbmcuam9pbignLCAnKSB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgPSBjb25maWcuc291cmNlU3BhY2VJZDtcclxuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBzb3VyY2Ugc3BhY2UncyB2aXNpdCBsaXN0IHNvIHRoZSBzZWxlY3QgaGFzIHRoZSByaWdodCBvcHRpb25zXHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlVmlzaXRzID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0VmlzaXRzRm9yU3BhY2VGb3JVc2VyKHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsID0gY29uZmlnLnNvdXJjZVZpc2l0M2RNb2RlbDtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwgPSBjb25maWcudGFyZ2V0VmlzaXQzZE1vZGVsO1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IGNvbmZpZy5sYW5kbWFya1NvdXJjZUE7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRBID0gY29uZmlnLmxhbmRtYXJrVGFyZ2V0QTtcclxuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUIgPSBjb25maWcubGFuZG1hcmtTb3VyY2VCO1xyXG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuc3VjY2Vzc0ltcG9ydCcpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW1wb3J0IGxhbmRtYXJrIGNvbmZpZycsIGVycik7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckltcG9ydFJlYWQnKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgaW5wdXQgc28gcmUtc2VsZWN0aW5nIHRoZSBzYW1lIGZpbGUgcmUtdHJpZ2dlcnMgdGhlIGNoYW5nZSBldmVudFxyXG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cclxuICAgICAgICA8bGliLXRhYi1uYXZpZ2F0aW9uIFttZW51SXRlbXNdPSdtZW51SXRlbXMnIChvbkdvQmFjayk9XCJyZXNldCgpXCI+PC9saWItdGFiLW5hdmlnYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIChjbGljayk9XCJvblJldHVybigpXCI+e3snQmFjayB0byBsb2NhdGlvbnMnIHxcclxuICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiIWlzRWRpdGluZyAmJiBzcGFjZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX06IHt7c3BhY2UubmFtZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmFkZHJlc3Nlc319IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydDb25zdHJ1Y3Rpb24geWVhcicgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNvbnN0cnVjdGlvblllYXIgP1xyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmNvbnN0cnVjdGlvblllYXIgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYXRpdHVkZScgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmxhdGl0dWRlID9cclxuICAgICAgICAgICAgICAgICAgICBzcGFjZS5sYXRpdHVkZSA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTG9uZ2l0dWRlJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmxvbmdpdHVkZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UubG9uZ2l0dWRlIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmxldmVsIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0VuZXJneSBDbGFzcycgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzRW5lcmd5Q29uc3VtcHRpb24gP1xyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmNsYXNzRW5lcmd5Q29uc3VtcHRpb24gOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNwYWNlLnN0YXR1cyAhPT0gJ0RQRV9UT19WQUxJREFURSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBuby1sb3dlcmNhc2UgbXMtNVwiIChjbGljayk9XCJvbkdldERwZURhdGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydHZXQgZGF0YSBmcm9tIEFQSSBEUEUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJnLXRyYW5zcGFyZW50IG1zLTVcIiAqbmdJZj1cInNwYWNlLnN0YXR1cyA9PT0gJ0RQRV9UT19WQUxJREFURSdcIiAoY2xpY2spPVwib25EcGVWYWxpZGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbmlmeVwiIGRhdGEtaWNvbj1cIm1kaTphbGVydC1jaXJjbGUtY2hlY2tcIiBzdHlsZT1cImNvbG9yOiAjZjE5YzgwO1wiIGRhdGEtd2lkdGg9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWhlaWdodD1cIjI1XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydEUEUgZGF0YSBmb3VuZC4gQ2xpY2sgdG8gdmFsaWRhdGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snR3JlZW5ob3VzZSBnYXMgZW1pc3Npb24gQ2xhc3MnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAge3tzcGFjZS5jbGFzc0dlcyA/IHNwYWNlLmNsYXNzR2VzIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU2hhcmVhYmxlIEd1ZXN0IExpbmsnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGlubGluZTtcIiAqbmdJZj1cImd1ZXN0TGlua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD1cImxpbmtIcmVmXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3snVHJ5IHRoZSBsaW5rJyB8IHRyYW5zbGF0ZSB9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImd1ZXN0TGlua1wiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDVweDsgbWF4LXdpZHRoOiAyMHB4OyBkaXNwbGF5OiBpbmxpbmU7XCIgbmdiVG9vbHRpcD1cIkNvcGllZCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJjbGljazpibHVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6Y29udGVudC1jb3B5XCIgZGF0YS1pbmxpbmU9XCJmYWxzZVwiIGRhdGEtd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyMFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhZ3Vlc3RMaW5rXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCI+e3snTm8gbGluaycgfCB0cmFuc2xhdGUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhZ3Vlc3RMaW5rXCI+PHNtYWxsPih7eydHZW5lcmF0ZSBsaW5rIGZyb20gYSBWSVNJVE9SIG1pc3Npb24nfHRyYW5zbGF0ZX19KTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwiZ2V0dGluZ0RhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxocj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCIgKGNsaWNrKT1cIm9uRWRpdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImxvY2F0aW9uLWVkaXQtYnRuXCI+e3snRWRpdCcgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcC13cmFwcGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3shY2FuQXJjaGl2ZSA/ICgnQ29udGFjdCBTbWFydGVyUGxhbicgfCB0cmFuc2xhdGUpIDogKCdBcmNoaXZlIGxvY2F0aW9uIGFuZCByZWxhdGVkIGRhdGEnIHwgdHJhbnNsYXRlKX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIChjbGljayk9XCJvbkFyY2hpdmUoKVwiIFtkaXNhYmxlZF09XCIhY2FuQXJjaGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydBcmNoaXZlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIiAqbmdJZj1cImlzVmFsaWRhdGluZ0RwZVwiPlxyXG4gICAgICAgICAgICA8aDY+e3snTW9zdCByZWxldmFudCByZXN1bHRzIGZvcicgfCB0cmFuc2xhdGV9fSA6XHJcbiAgICAgICAgICAgICAgICA8Yj5kaWFnbm9zdGljcyBkZSBwZXJmb3JtYW5jZSDDqW5lcmfDqXRpcXVlIChEUEUpIGRlcyBiw6J0aW1lbnRzIHRlcnRpYWlyZXM8L2I+XHJcbiAgICAgICAgICAgIDwvaDY+XHJcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPiM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBcHBseSB0byBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBY3Rpdml0eSBzZWN0b3InIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydDb25zdHJ1Y3Rpb24geWVhcicgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0VuZXJneSBDbGFzcycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJlc3VsdCBvZiBwYXJzZWRNZXRhZGF0YTsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJyb3dcIj57eyBpICsgMSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseVwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicmVzdWx0LnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0Q2hhbmdlKHJlc3VsdClcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyZXN1bHQuZ2VvX2FkcmVzc2V9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5zZWN0ZXVyX2FjdGl2aXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcmVzdWx0LmFubmVlX2NvbnN0cnVjdGlvbiB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfZXN0aW1hdGlvbl9nZXMgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25TYXZlUmVzdWx0KClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZERwZVJlc3VsdFwiPnt7J1NhdmUgc2VsZWN0ZWQnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJvbkVyYXNlKClcIj5cclxuICAgICAgICAgICAgICAgIHt7J05vIG1hdGNoIChlcmFzZSBkYXRhKScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxyXG4gICAgICAgICAgICAgICAge3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRvZ2dsZSBidXR0b24gZm9yIHRoZSBhZG1pbiBcIkNvcHkgUE9Jc1wiIGZvcm0gLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXNBZG1pbiAmJiBzcGFjZXMgJiYgc3BhY2VzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwidG9nZ2xlQ29weVBvaXNGb3JtKClcIj5cclxuICAgICAgICAgICAge3sgKHNob3dDb3B5UG9pc0Zvcm0gPyAnbWF0dGVycG9ydENvcHkuaGlkZUZvcm0nIDogJ21hdHRlcnBvcnRDb3B5LnNob3dGb3JtJykgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQWRtaW4gRm9ybSB0byBDb3B5IFBPSXMgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXNBZG1pbiAmJiBzcGFjZXMgJiYgc3BhY2VzLmxlbmd0aCA+IDAgJiYgc2hvd0NvcHlQb2lzRm9ybVwiIGNsYXNzPVwibXQtMyBwLTQgYm9yZGVyIHJvdW5kZWQgYmctbGlnaHRcIj5cclxuICAgICAgICA8aDY+e3sgJ21hdHRlcnBvcnRDb3B5LmZvcm1UaXRsZScgfCB0cmFuc2xhdGUgfX08L2g2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVNwYWNlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTb3VyY2VTcGFjZUlkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Tb3VyY2VTcGFjZUNoYW5nZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnbWF0dGVycG9ydENvcHkuc2VsZWN0U3BhY2UnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzcGFjZSBvZiBzcGFjZXNcIiBbbmdWYWx1ZV09XCJzcGFjZS5pZFwiPnt7c3BhY2UubmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiICpuZ0lmPVwic291cmNlVmlzaXRzXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXQnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFNvdXJjZTNkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zZWxlY3RWaXNpdCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZpc2l0IG9mIHNvdXJjZVZpc2l0c1wiIFtuZ1ZhbHVlXT1cInZpc2l0Lm1vZGVsM2RcIj57e3Zpc2l0Lm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS50YXJnZXRWaXNpdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVGFyZ2V0M2RNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNlbGVjdFZpc2l0JyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQubW9kZWwzZFwiPnt7dmlzaXQubmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRTb3VyY2VTcGFjZUlkICYmIHNlbGVjdGVkU291cmNlM2RNb2RlbCAmJiBzZWxlY3RlZFRhcmdldDNkTW9kZWxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJvcmRlciByb3VuZGVkIHAtMyBtYi0zIGJnLXdoaXRlXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICB7eyAnbWF0dGVycG9ydENvcHkubGFuZG1hcmtJbnN0cnVjdGlvbnMnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBzbWFsbCBtYi0yXCI+e3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrQScgfCB0cmFuc2xhdGUgfX08L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFNvdXJjZTNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYW5kbWFya1NvdXJjZUFcIiB0aXRsZT1cInt7ICdtYXR0ZXJwb3J0Q29weS5zb3VyY2VWaXNpdExhYmVsJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblNvdXJjZUxhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYW5kbWFya1RhcmdldEFcIiB0aXRsZT1cInt7ICdtYXR0ZXJwb3J0Q29weS50YXJnZXRWaXNpdExhYmVsJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblRhcmdldExhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZnctYm9sZCBzbWFsbCBtYi0yXCI+e3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrQicgfCB0cmFuc2xhdGUgfX08L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtTb3VyY2VCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRQaWNrZWQpPVwib25Tb3VyY2VMYW5kbWFya1BpY2tlZCgnQicsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtUYXJnZXRCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRQaWNrZWQpPVwib25UYXJnZXRMYW5kbWFya1BpY2tlZCgnQicsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHB0LTJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIFtkaXNhYmxlZF09XCIhY2FuQ29weVBvaXMgfHwgaXNDb3B5aW5nUG9pc1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db3B5UG9pcygpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyAnbWF0dGVycG9ydENvcHkuY29weUJ1dHRvbicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZXhwb3J0TGFuZG1hcmtDb25maWcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdtYXR0ZXJwb3J0Q29weS5leHBvcnRMYW5kbWFya3MnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmltcG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJhcHBsaWNhdGlvbi9qc29uXCIgaGlkZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbXBvcnRMYW5kbWFya0NvbmZpZ1NlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb3B5aW5nUG9pc1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvcHlQb2lzUmVzdWx0TXNnXCIgY2xhc3M9XCJtdC0yIHRleHQtc3VjY2VzcyBmdy1ib2xkXCI+XHJcbiAgICAgICAgICAgIHt7IGNvcHlQb2lzUmVzdWx0TXNnIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvcHlQcm9ncmVzc1wiIGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvcHlQcm9ncmVzcy5waGFzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2NvbGxlY3RpbmcnXCI+e3sgJ0NvbGxlY3RpbmcgaW5mb3JtYXRpb24gZnJvbSBib3RoIHZpc2l0cy4uLicgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3RpY2tldHMnXCI+e3sgJ0NvcHlpbmcgdGlja2V0cycgfCB0cmFuc2xhdGUgfX0gKHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidlcXVpcG1lbnRzJ1wiPnt7ICdDb3B5aW5nIGVxdWlwbWVudHMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIncG9pcydcIj57eyAnQ29weWluZyBzdGFuZGFsb25lIFBPSXMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInb2JqZWN0czNkJ1wiPnt7ICdDb3B5aW5nIDNEIG9iamVjdHMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZmVhdHVyZXMnXCI+e3sgJ0NvcHlpbmcgZmVhdHVyZXMnIHwgdHJhbnNsYXRlIH19ICh7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbWVhc3VyZW1lbnRzJ1wiPnt7ICdDb3B5aW5nIG1lYXN1cmVtZW50cycgfCB0cmFuc2xhdGUgfX0gKHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkb25lJ1wiPnt7ICdEb25lIScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb3B5UHJvZ3Jlc3MucGVyY2VudCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBzdHlsZT1cImhlaWdodDogNnB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFtjbGFzcy5wcm9ncmVzcy1iYXItc3RyaXBlZF09XCJjb3B5UHJvZ3Jlc3MucGhhc2UgPT09ICdjb2xsZWN0aW5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnByb2dyZXNzLWJhci1hbmltYXRlZF09XCJjb3B5UHJvZ3Jlc3MucGhhc2UgPT09ICdjb2xsZWN0aW5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLXdhcm5pbmddPVwiY29weVByb2dyZXNzLmVycm9yQ291bnQgPiAwXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjb3B5UHJvZ3Jlc3MucGhhc2UgPT09ICdjb2xsZWN0aW5nJyA/IDEwMCA6IGNvcHlQcm9ncmVzcy5wZXJjZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIERldGFpbGVkIHN0ZXAtYnktc3RlcCBsb2cgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5TG9nLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTIgcC0yIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkIHNtYWxsXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93LXk6IGF1dG87IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBjb3B5TG9nXCIgW2NsYXNzLnRleHQtZGFuZ2VyXT1cImVudHJ5LnR5cGUgPT09ICdlcnJvcidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXdhcm5pbmddPVwiZW50cnkudHlwZSA9PT0gJ2hlYWxlZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBlbnRyeS50ZXh0IH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgbXQtMlwiICpuZ0lmPVwiY29weUxvZy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZENvcHlMb2coKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmRvd25sb2FkTG9nJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItZm9ybS1sb2NhdGlvbiAqbmdJZj1cImlzRWRpdGluZ1wiIFtsb2NhdGlvbl09XCJzcGFjZVwiIChvbkNoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoJGV2ZW50KVwiPjwvbGliLWZvcm0tbG9jYXRpb24+XHJcbjwvZGl2PiJdfQ==
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWxvY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL2RldGFpbC1sb2NhdGlvbi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZGV0YWlsLWxvY2F0aW9uL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFLckUsT0FBTyxFQUNILGtCQUFrQixFQUN5QyxXQUFXLEVBRWhFLFFBQVEsRUFHZCxhQUFhLEVBQ2hCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztBQUUxQyxzR0FBc0c7QUFDdEcsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFPbEMsTUFBTSxPQUFPLHVCQUF1QjtJQWdFZ0I7SUFDcEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXRFWiwyQkFBMkI7SUFDM0IsS0FBSyxDQUFRO0lBQ2IsUUFBUSxDQUFtQjtJQUMzQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLGFBQWEsQ0FBTztJQUNwQixFQUFFLENBQVM7SUFDWCxTQUFTLEdBQWUsRUFBRSxDQUFDO0lBRTNCLGtDQUFrQztJQUNsQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGlCQUFpQixDQUFNO0lBQ3ZCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsY0FBYyxDQU9WO0lBRUosU0FBUyxDQUFTO0lBQ2xCLFVB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Z0VwQixrQkFBa0I7NEZBaEVyQix1QkFBdUIsMkRDeEJwQyxnc2hCQWtSTTs7NEZEMVBPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUI7OzBCQW9FMUIsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBNQVRURVJQT1JUX1NES19LRVksXG4gICAgTWVudUl0ZW0sIFNwYWNlU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBOYXZpZ2F0b3JTZXJ2aWNlLCBTcGFjZVN0YXR1cywgU3BhY2UsXG4gICAgTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlLCBDb3B5UHJvZ3Jlc3MsIENvcHlMb2dFbnRyeSxcbiAgICBWZWMzLCBkaXN0YW5jZSxcbiAgICBWaXNpdCxcbiAgICBWaXNpdFNlcnZpY2UsXG4gICAgQ2FwdHVyZVZpZXdlclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbi8vIE1pbmltdW0gZGlzdGFuY2UgKGluIG1ldGVycykgcmVxdWlyZWQgYmV0d2VlbiB0aGUgdHdvIGxhbmRtYXJrcyBmb3IgYSByZWxpYWJsZSByb3RhdGlvbiBjYWxjdWxhdGlvblxuY29uc3QgTUlOX0xBTkRNQVJLX0RJU1RBTkNFID0gMS41O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtbG9jYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RldGFpbC1sb2NhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERldGFpbExvY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLy8gLS0tIExvY2F0aW9uIGRldGFpbHMgLS0tXG4gICAgc3BhY2U6IFNwYWNlO1xuICAgIGVkaXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICAgIGlzRWRpdGluZyA9IGZhbHNlO1xuICAgIGltYWdlVG9VcGxvYWQ6IEZpbGU7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICAgIC8vIC0tLSBEUEUgKGVuZXJneSBkaWFnbm9zdGljKSAtLS1cbiAgICBpc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcbiAgICBzZWxlY3RlZERwZVJlc3VsdDogYW55O1xuICAgIGdldHRpbmdEYXRhID0gZmFsc2U7XG4gICAgcGFyc2VkTWV0YWRhdGE6IHtcbiAgICAgICAgZ2VvX2FkcmVzc2U6IHN0cmluZztcbiAgICAgICAgc2VjdGV1cl9hY3Rpdml0ZTogc3RyaW5nO1xuICAgICAgICBhbm5lZV9jb25zdHJ1Y3Rpb246IHN0cmluZztcbiAgICAgICAgY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llOiBzdHJpbmc7XG4gICAgICAgIGNsYXNzZV9lc3RpbWF0aW9uX2dlczogc3RyaW5nO1xuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICB9W107XG5cbiAgICBndWVzdExpbms6IHN0cmluZztcbiAgICBjYW5BcmNoaXZlOiBib29sZWFuO1xuICAgIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8vIC0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tXG4gICAgaXNBZG1pbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHNwYWNlczogU3BhY2VbXSA9IFtdO1xuXG4gICAgLy8gV2hldGhlciB0aGUgXCJjb3B5IFBPSXNcIiBhZG1pbiBmb3JtIGlzIGN1cnJlbnRseSB2aXNpYmxlIChjb2xsYXBzZWQgYnkgZGVmYXVsdClcbiAgICBzaG93Q29weVBvaXNGb3JtID0gZmFsc2U7XG5cbiAgICAvLyBTZWxlY3RlZCBzb3VyY2UgU1BBQ0UgKGEgc3BhY2UgbWF5IGNvbnRhaW4gMC4uTiB2aXNpdHMvbW9kZWxzKVxuICAgIHNlbGVjdGVkU291cmNlU3BhY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBTZWxlY3RlZCAzRCBtb2RlbCBpZHMgKHZpc2l0Lm1vZGVsM2QpIOKAlCB0aGlzIGlzIHdoYXQgYWN0dWFsbHkgZ2V0cyBsb2FkZWQgaW4gdGhlIHZpZXdlclxuICAgIHNlbGVjdGVkU291cmNlM2RNb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFZpc2l0cyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UsIGFuZCBmb3IgdGhlIGN1cnJlbnQgKHRhcmdldCkgc3BhY2VcbiAgICBzb3VyY2VWaXNpdHM6IFZpc2l0W10gPSBbXTtcbiAgICB2aXNpdHM6IFZpc2l0W10gPSBbXTtcblxuICAgIC8qKiBUaGUgY2FwdHVyZSBhIHZpc2l0b3Igb3BlbnMgYnkgZGVmYXVsdCwgb2YgYW55IHZpZXdlciB0eXBlLiBOdWxsIG1lYW5zIG5vbmUgY2hvc2VuLiAqL1xuICAgIGRlZmF1bHRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgc2F2aW5nRGVmYXVsdENhcHR1cmUgPSBmYWxzZTtcblxuICAgIGRlZmF1bHRDYXB0dXJlRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gM0QgbGFuZG1hcmsgcG9pbnRzIHBpY2tlZCBkaXJlY3RseSBpbiBlYWNoIHZpZXdlciAoc291cmNlIGFuZCB0YXJnZXQpXG4gICAgbGFuZG1hcmtTb3VyY2VBOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtUYXJnZXRBOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzIHwgbnVsbCA9IG51bGw7XG4gICAgbGFuZG1hcmtUYXJnZXRCOiBWZWMzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpc0NvcHlpbmdQb2lzID0gZmFsc2U7XG4gICAgY29weVBvaXNSZXN1bHRNc2c6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGNvcHlQcm9ncmVzczogQ29weVByb2dyZXNzIHwgbnVsbCA9IG51bGw7XG4gICAgY29weUxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHVibGljIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRhZ0NvcHlTZXJ2aWNlOiBNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmxvY2F0aW9uSURDaGFuZ2VcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHNwYWNlSUQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsIHNwYWNlSURdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyYW1zLmlkO1xuICAgICAgICAgICAgdGhpcy5zZXR1cCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlQcm9ncmVzcyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuY29weUxvZyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxvZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29weUxvZyA9IGxvZztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLSBMaWZlY3ljbGUgLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICBuZ09uSW5pdCgpIHsgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLSBTZXR1cCAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIGFzeW5jIHNldHVwKCkge1xuICAgICAgICB0aGlzLnNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5pZCk7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICAgICAgdGhpcy5zZXRHdWVzdExpbmsoKTtcbiAgICAgICAgdGhpcy5zZXRDYW5BcmNoaXZlKCk7XG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XG4gICAgICAgIGlmICh0aGlzLmlzQWRtaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldExvY2F0aW9uc0ZvckN1cnJlbnRVc2VyKCk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlcyA9IHNwYWNlcy5maWx0ZXIoKHNwYWNlKSA9PiBzcGFjZS5pZCAhPT0gdGhpcy5pZCkuc29ydCgoYSwgYikgPT4gKGEubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLm5hbWUgfHwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWaXNpdHMgKDNEIG1vZGVscykgYmVsb25naW5nIHRvIHRoZSBDVVJSRU5UIHNwYWNlLCB1c2VkIGFzIGNvcHkgdGFyZ2V0c1xuICAgICAgICB0aGlzLnZpc2l0cyA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldFZpc2l0c0ZvclNwYWNlRm9yVXNlcih0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUlEID0gdGhpcy5zcGFjZT8uZGVmYXVsdENhcHR1cmVJRCA/PyBudWxsO1xuICAgIH1cblxuICAgIHNldHVwTWVudUl0ZW1zKCkge1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyA9IFtcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5zcGFjZS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlLmlkfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRWRpdGluZykge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7IGxhYmVsOiBcIkVkaXRcIiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goeyBsYWJlbDogXCJJbmZvcm1hdGlvblwiIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q2FuQXJjaGl2ZSgpIHtcbiAgICAgICAgdGhpcy5jYW5BcmNoaXZlID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKVxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmNhbkFyY2hpdmVTcGFjZSh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICBzZXRHdWVzdExpbmsoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlLmd1ZXN0TGluaykge1xuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW4gfSA9IGRvY3VtZW50LmxvY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5ndWVzdExpbmsgPSBgJHtvcmlnaW59LyR7dGhpcy5zcGFjZS5ndWVzdExpbmt9YDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh5cGVybGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIFwiI2xpbmtIcmVmXCIsXG4gICAgICAgICAgICAgICAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmZvbGxvd0xpbmtcIik7XG4gICAgICAgICAgICAgICAgaHlwZXJsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmd1ZXN0TGluaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UubG9nb3V0Q3VycmVudEFuZFNpZ25PdXRBdXRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJhdXRoXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gRWRpdCAvIGFyY2hpdmUgLyBuYXZpZ2F0aW9uIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25FZGl0KCkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBvblJldHVybigpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiXSk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkFyY2hpdmUoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlU3BhY2VcIik7XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2Uuc29mdERlbGV0ZVNwYWNlKHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5vblJldHVybigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Gb3JtQ2hhbmdlKGV2ZW50OiBTcGFjZSkge1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIERQRSAoZW5lcmd5IGRpYWdub3N0aWMpIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgb25EcGVWYWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlZE1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnNwYWNlLm1ldGFkYXRhKTtcbiAgICAgICAgdGhpcy5wYXJzZWRNZXRhZGF0YSA9IHRoaXMucGFyc2VkTWV0YWRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgKHJlc3VsdCkgPT4gcmVzdWx0Lmdlb19hZHJlc3NlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uU2VsZWN0Q2hhbmdlKHNlbGVjdGVkUmVzdWx0OiBhbnkpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgdGhpcy5wYXJzZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gc2VsZWN0ZWRSZXN1bHQgJiYgcmVzdWx0LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZERwZVJlc3VsdCA9IHNlbGVjdGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIG9uU2F2ZVJlc3VsdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdGlvblllYXI6IHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuYW5uZWVfY29uc3RydWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsYXNzRW5lcmd5Q29uc3VtcHRpb246XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREcGVSZXN1bHQuY2xhc3NlX2NvbnNvbW1hdGlvbl9lbmVyZ2llLFxuICAgICAgICAgICAgICAgIGNsYXNzR2VzOiB0aGlzLnNlbGVjdGVkRHBlUmVzdWx0LmNsYXNzZV9lc3RpbWF0aW9uX2dlcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNwYWNlU3RhdHVzLkRQRV9WQUxJREFURUQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZExvYyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSB1cGRhdGVkTG9jO1xuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdEcGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRXJhc2UoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVELFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zcGFjZS5zdGF0dXMgPSBTcGFjZVN0YXR1cy5EUEVfVkFMSURBVEVEO1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGluZ0RwZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2V0RHBlRGF0YSgpIHtcbiAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnNwYWNlLmlkLFxuICAgICAgICAgICAgc3RhdHVzOiBTcGFjZVN0YXR1cy5EUEVfRkVUQ0gsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlKHRoaXMuc3BhY2UuaWQpO1xuICAgICAgICAgICAgdGhpcy5nZXR0aW5nRGF0YSA9IGZhbHNlO1xuICAgICAgICB9LCAxNTAwKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB3aGljaCBjYXB0dXJlIGEgdmlzaXRvciBvcGVucyBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogT25lIGZpZWxkIG9uIHRoZSBzcGFjZSwgbm90IGEgZmxhZyBwZXIgY2FwdHVyZSwgc28gdGhlIHR3byBhZG1pbiBzY3JlZW5zIGNhbm5vdCBkaXNhZ3JlZTpcbiAgICAgKiBzZXR0aW5nIGl0IGZyb20gZWl0aGVyIG9uZSB3cml0ZXMgdGhlIHNhbWUgcGxhY2UsIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFyIGVsc2V3aGVyZS5cbiAgICAgKi9cbiAgICBhc3luYyBvbkRlZmF1bHRDYXB0dXJlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnNhdmluZ0RlZmF1bHRDYXB0dXJlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUVycm9yID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnNldERlZmF1bHRDYXB0dXJlKHRoaXMuaWQsIHRoaXMuZGVmYXVsdENhcHR1cmVJRCB8fCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2UuZGVmYXVsdENhcHR1cmVJRCA9IHRoaXMuZGVmYXVsdENhcHR1cmVJRCB8fCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVW50aWwgdGhlIHNjaGVtYSBjaGFuZ2UgaXMgZGVwbG95ZWQsIEFwcFN5bmMgcmVqZWN0cyB0aGUgZmllbGQgb3V0cmlnaHQuIFNheSBzb1xuICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgcGlja2VyIGxvb2tpbmcgYXMgdGhvdWdoIGl0IHNhdmVkLlxuICAgICAgICAgICAgY29uc3QgZ3JhcGhRbCA9IChlcnJvciBhcyBhbnkpPy5lcnJvcnM7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRDYXB0dXJlRXJyb3IgPSBBcnJheS5pc0FycmF5KGdyYXBoUWwpICYmIGdyYXBoUWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gZ3JhcGhRbC5tYXAoKGU6IGFueSkgPT4gZT8ubWVzc2FnZSA/PyBKU09OLnN0cmluZ2lmeShlKSkuam9pbignIHwgJylcbiAgICAgICAgICAgICAgICA6ICgoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlID8/IFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2FwdHVyZUlEID0gdGhpcy5zcGFjZT8uZGVmYXVsdENhcHR1cmVJRCA/PyBudWxsO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zYXZpbmdEZWZhdWx0Q2FwdHVyZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIExhYmVsIGZvciBhIHZpc2l0IGluIHRoZSBkZWZhdWx0IHBpY2tlciwgbmFtaW5nIHRoZSB2aWV3ZXIgaXQgb3BlbnMgaW4uICovXG4gICAgdmlzaXRMYWJlbCh2aXNpdDogVmlzaXQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBuYW1lID0gdmlzaXQ/Lm5hbWUgfHwgdmlzaXQ/Lm1vZGVsM2QgfHwgJyc7XG4gICAgICAgIHJldHVybiB2aXNpdD8udmlld2VyID09PSBDYXB0dXJlVmlld2VyLlRIUkVFSlMgPyBgJHtuYW1lfSAoM0QpYCA6IGAke25hbWV9IChNYXR0ZXJwb3J0KWA7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLSBDb3B5IFBPSXMgYmV0d2VlbiB2aXNpdHMgLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICAvKiogVG9nZ2xlcyB2aXNpYmlsaXR5IG9mIHRoZSBhZG1pbiBcImNvcHkgUE9JcyBmcm9tIGFub3RoZXIgbG9jYXRpb25cIiBmb3JtLiAqL1xuICAgIHRvZ2dsZUNvcHlQb2lzRm9ybSgpIHtcbiAgICAgICAgdGhpcy5zaG93Q29weVBvaXNGb3JtID0gIXRoaXMuc2hvd0NvcHlQb2lzRm9ybTtcbiAgICB9XG5cbiAgICBvblNvdXJjZUxhbmRtYXJrUGlja2VkKHNsb3Q6ICdBJyB8ICdCJywgcG9pbnQ6IFZlYzMpIHtcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1NvdXJjZUEgPSBwb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VCID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblRhcmdldExhbmRtYXJrUGlja2VkKHNsb3Q6ICdBJyB8ICdCJywgcG9pbnQ6IFZlYzMpIHtcbiAgICAgICAgaWYgKHNsb3QgPT09ICdBJykge1xuICAgICAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBwb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRCID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTG9hZHMgdGhlIHZpc2l0cyAoM0QgbW9kZWxzKSBhdmFpbGFibGUgZm9yIHRoZSBuZXdseSBzZWxlY3RlZCBzb3VyY2Ugc3BhY2UuICovXG4gICAgYXN5bmMgb25Tb3VyY2VTcGFjZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VWaXNpdHMgPSB0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZFxuICAgICAgICAgICAgPyBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25Nb2RlbFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgbGFuZG1hcmsgc2VsZWN0aW9ucyB3aGVuZXZlciB0aGUgc291cmNlIG9yIHRhcmdldCAzRCBtb2RlbCBjaGFuZ2VzLiAqL1xuICAgIG9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMubGFuZG1hcmtTb3VyY2VBID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYW5kbWFya1RhcmdldEEgPSBudWxsO1xuICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFuZG1hcmtUYXJnZXRCID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogVHJ1ZSBvbmNlIGJvdGggbW9kZWxzIGFyZSBzZWxlY3RlZCwgYWxsIDQgbGFuZG1hcmtzIGFyZSBwaWNrZWQsIGFuZCBBL0IgcGFpcnMgYXJlIGZhciBlbm91Z2ggYXBhcnQuICovXG4gICAgZ2V0IGNhbkNvcHlQb2lzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICF0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCB8fCAhdGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubGFuZG1hcmtTb3VyY2VBIHx8ICF0aGlzLmxhbmRtYXJrVGFyZ2V0QSB8fCAhdGhpcy5sYW5kbWFya1NvdXJjZUIgfHwgIXRoaXMubGFuZG1hcmtUYXJnZXRCKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlRGlzdCA9IGRpc3RhbmNlKHRoaXMubGFuZG1hcmtTb3VyY2VBLCB0aGlzLmxhbmRtYXJrU291cmNlQik7XG4gICAgICAgIGNvbnN0IHRhcmdldERpc3QgPSBkaXN0YW5jZSh0aGlzLmxhbmRtYXJrVGFyZ2V0QSwgdGhpcy5sYW5kbWFya1RhcmdldEIpO1xuICAgICAgICByZXR1cm4gc291cmNlRGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0UgJiYgdGFyZ2V0RGlzdCA+PSBNSU5fTEFORE1BUktfRElTVEFOQ0U7XG4gICAgfVxuXG4gICAgYXN5bmMgb25Db3B5UG9pcygpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYXJnZXRTcGFjZUlkID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkIHx8ICFzZWxlY3RlZFRhcmdldFNwYWNlSWQgfHwgIXRoaXMuc2VsZWN0ZWRTb3VyY2UzZE1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCA9PT0gc2VsZWN0ZWRUYXJnZXRTcGFjZUlkKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JTYW1lU3BhY2UnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2FuQ29weVBvaXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckxhbmRtYXJrc1Rvb0Nsb3NlJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzQ29weWluZ1BvaXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnRhZ0NvcHlTZXJ2aWNlLmNvcHlUYWdzRnJvbVZpc2l0KFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VTcGFjZUlkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFyZ2V0U3BhY2VJZCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQixcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAnbWF0dGVycG9ydENvcHkuc3VjY2Vzc01zZycgOiAnbWF0dGVycG9ydENvcHkuZXJyb3JNc2cnXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yTXNnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NvcHlpbmdQb2lzID0gZmFsc2U7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gbnVsbDtcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgfVxuXG4gICAgLyoqIERvd25sb2FkcyB0aGUgY3VycmVudCBzb3VyY2UvdGFyZ2V0IHNlbGVjdGlvbiArIGFsbCA0IGxhbmRtYXJrcyBhcyBhIEpTT04gZmlsZS4gKi9cbiAgICBleHBvcnRMYW5kbWFya0NvbmZpZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCB8fCAhdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwgfHwgIXRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlQb2lzUmVzdWx0TXNnID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JFeHBvcnRNaXNzaW5nU2VsZWN0aW9uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBzb3VyY2VTcGFjZUlkOiB0aGlzLnNlbGVjdGVkU291cmNlU3BhY2VJZCxcbiAgICAgICAgICAgIHNvdXJjZVZpc2l0M2RNb2RlbDogdGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWwsXG4gICAgICAgICAgICB0YXJnZXRWaXNpdDNkTW9kZWw6IHRoaXMuc2VsZWN0ZWRUYXJnZXQzZE1vZGVsLFxuICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VBOiB0aGlzLmxhbmRtYXJrU291cmNlQSxcbiAgICAgICAgICAgIGxhbmRtYXJrVGFyZ2V0QTogdGhpcy5sYW5kbWFya1RhcmdldEEsXG4gICAgICAgICAgICBsYW5kbWFya1NvdXJjZUI6IHRoaXMubGFuZG1hcmtTb3VyY2VCLFxuICAgICAgICAgICAgbGFuZG1hcmtUYXJnZXRCOiB0aGlzLmxhbmRtYXJrVGFyZ2V0QlxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGEuZG93bmxvYWQgPSBgbGFuZG1hcmtzXyR7dGhpcy5zZWxlY3RlZFNvdXJjZTNkTW9kZWx9X3RvXyR7dGhpcy5zZWxlY3RlZFRhcmdldDNkTW9kZWx9Lmpzb25gO1xuICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG5cbiAgICAvKiogRG93bmxvYWRzIHRoZSBmdWxsIGNvcHkgbG9nIChzdGVwIGxpbmVzLCBlcnJvcnMsIGFuZCByZXBhaXJlZC1pdGVtIG5vdGljZXMpIGFzIGEgdGV4dFxuICAgICAqICBmaWxlIOKAlCB0aGUgb24tc2NyZWVuIHBhbmVsIGlzIGNhcHBlZCB0byBhIHNtYWxsIHNjcm9sbGFibGUgYXJlYSBhbmQgbG9zZXMgbGluZXMgb25jZVxuICAgICAqICBhIG5ldyBydW4gc3RhcnRzLCB0aGlzIGtlZXBzIHRoZSBmdWxsIHJlcG9ydC4gKi9cbiAgICBkb3dubG9hZENvcHlMb2coKSB7XG4gICAgICAgIHRoaXMudGFnQ29weVNlcnZpY2UuZG93bmxvYWRMb2coKTtcbiAgICB9XG5cbiAgICAvKiogVHJpZ2dlcmVkIGJ5IHRoZSBoaWRkZW4gZmlsZSBpbnB1dDsgcmVhZHMgYW5kIGFwcGxpZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIEpTT04gY29uZmlnLiAqL1xuICAgIGFzeW5jIG9uSW1wb3J0TGFuZG1hcmtDb25maWdTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEJhc2ljIHNoYXBlIHZhbGlkYXRpb24gYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ3NvdXJjZVNwYWNlSWQnLCAnc291cmNlVmlzaXQzZE1vZGVsJywgJ3RhcmdldFZpc2l0M2RNb2RlbCcsXG4gICAgICAgICAgICAgICAgJ2xhbmRtYXJrU291cmNlQScsICdsYW5kbWFya1RhcmdldEEnLCAnbGFuZG1hcmtTb3VyY2VCJywgJ2xhbmRtYXJrVGFyZ2V0QiddO1xuICAgICAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoayA9PiAhKGsgaW4gY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9ySW52YWxpZENvbmZpZycsIHsga2V5czogbWlzc2luZy5qb2luKCcsICcpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQgPSBjb25maWcuc291cmNlU3BhY2VJZDtcbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgc291cmNlIHNwYWNlJ3MgdmlzaXQgbGlzdCBzbyB0aGUgc2VsZWN0IGhhcyB0aGUgcmlnaHQgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VWaXNpdHMgPSBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIodGhpcy5zZWxlY3RlZFNvdXJjZVNwYWNlSWQpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU291cmNlM2RNb2RlbCA9IGNvbmZpZy5zb3VyY2VWaXNpdDNkTW9kZWw7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0M2RNb2RlbCA9IGNvbmZpZy50YXJnZXRWaXNpdDNkTW9kZWw7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQSA9IGNvbmZpZy5sYW5kbWFya1NvdXJjZUE7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QSA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEE7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrU291cmNlQiA9IGNvbmZpZy5sYW5kbWFya1NvdXJjZUI7XG4gICAgICAgICAgICB0aGlzLmxhbmRtYXJrVGFyZ2V0QiA9IGNvbmZpZy5sYW5kbWFya1RhcmdldEI7XG5cbiAgICAgICAgICAgIHRoaXMuY29weVBvaXNSZXN1bHRNc2cgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5zdWNjZXNzSW1wb3J0Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGltcG9ydCBsYW5kbWFyayBjb25maWcnLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5jb3B5UG9pc1Jlc3VsdE1zZyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9ySW1wb3J0UmVhZCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGlucHV0IHNvIHJlLXNlbGVjdGluZyB0aGUgc2FtZSBmaWxlIHJlLXRyaWdnZXJzIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG59IiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cbiAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwicmVzZXQoKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtM1wiIChjbGljayk9XCJvblJldHVybigpXCI+e3snQmFjayB0byBsb2NhdGlvbnMnIHxcbiAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCIhaXNFZGl0aW5nICYmIHNwYWNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTmFtZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5uYW1lfX0gPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmFkZHJlc3Nlc319IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UuY29uc3RydWN0aW9uWWVhciA/XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLmNvbnN0cnVjdGlvblllYXIgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTGF0aXR1ZGUnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIHt7c3BhY2UubGF0aXR1ZGUgP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5sYXRpdHVkZSA6IFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlfX08L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvbmdpdHVkZScgfCB0cmFuc2xhdGV9fToge3tzcGFjZS5sb25naXR1ZGUgP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5sb25naXR1ZGUgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19OiB7e3NwYWNlLmxldmVsIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snRW5lcmd5IENsYXNzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzRW5lcmd5Q29uc3VtcHRpb24gP1xuICAgICAgICAgICAgICAgICAgICBzcGFjZS5jbGFzc0VuZXJneUNvbnN1bXB0aW9uIDogXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic3BhY2Uuc3RhdHVzICE9PSAnRFBFX1RPX1ZBTElEQVRFJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBuby1sb3dlcmNhc2UgbXMtNVwiIChjbGljayk9XCJvbkdldERwZURhdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snR2V0IGRhdGEgZnJvbSBBUEkgRFBFJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYmctdHJhbnNwYXJlbnQgbXMtNVwiICpuZ0lmPVwic3BhY2Uuc3RhdHVzID09PSAnRFBFX1RPX1ZBTElEQVRFJ1wiIChjbGljayk9XCJvbkRwZVZhbGlkYXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6YWxlcnQtY2lyY2xlLWNoZWNrXCIgc3R5bGU9XCJjb2xvcjogI2YxOWM4MDtcIiBkYXRhLXdpZHRoPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydEUEUgZGF0YSBmb3VuZC4gQ2xpY2sgdG8gdmFsaWRhdGUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPCEtLSBPbmUgcGlja2VyIGZvciBib3RoIHZpZXdlcnM6IHRoZSBkZWZhdWx0IGxpdmVzIG9uIHRoZSBzcGFjZSwgc28gTWF0dGVycG9ydFxuICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZXMgYW5kIDNEIG1vZGVscyBjb21wZXRlIGZvciB0aGUgc2FtZSBzaW5nbGUgc2xvdC4gLS0+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJ2aXNpdHMubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICB7eydEZWZhdWx0IHZpc2l0JyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZC1pbmxpbmUtYmxvY2sgbXMtMlwiIHN0eWxlPVwid2lkdGg6IGF1dG87XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGVmYXVsdENhcHR1cmVJRFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGVmYXVsdENhcHR1cmVDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2F2aW5nRGVmYXVsdENhcHR1cmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7J0ZpcnN0IGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQuY2FwdHVyZUlEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmlzaXRMYWJlbCh2aXNpdCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLXRleHQgZC1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snV2hhdCBhIHZpc2l0b3Igb3BlbnMgd2hlbiB0aGV5IGVudGVyIHRoaXMgbG9jYXRpb24uJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlciBkLWJsb2NrXCIgKm5nSWY9XCJkZWZhdWx0Q2FwdHVyZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkZWZhdWx0Q2FwdHVyZUVycm9yIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICB7e3NwYWNlLmNsYXNzR2VzID8gc3BhY2UuY2xhc3NHZXMgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU2hhcmVhYmxlIEd1ZXN0IExpbmsnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCIgKm5nSWY9XCJndWVzdExpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPVwibGlua0hyZWZcIiB0YXJnZXQ9XCJfYmxhbmtcIj57eydUcnkgdGhlIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cImd1ZXN0TGlua1wiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDsgZGlzcGxheTogaW5saW5lO1wiIG5nYlRvb2x0aXA9XCJDb3BpZWQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6Y29udGVudC1jb3B5XCIgZGF0YS1pbmxpbmU9XCJmYWxzZVwiIGRhdGEtd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaGVpZ2h0PVwiMjBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWd1ZXN0TGlua1wiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lO1wiPnt7J05vIGxpbmsnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFndWVzdExpbmtcIj48c21hbGw+KHt7J0dlbmVyYXRlIGxpbmsgZnJvbSBhIFZJU0lUT1IgbWlzc2lvbid8dHJhbnNsYXRlfX0pPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImdldHRpbmdEYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTNcIiAoY2xpY2spPVwib25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImxvY2F0aW9uLWVkaXQtYnRuXCI+e3snRWRpdCcgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3shY2FuQXJjaGl2ZSA/ICgnQ29udGFjdCBTbWFydGVyUGxhbicgfCB0cmFuc2xhdGUpIDogKCdBcmNoaXZlIGxvY2F0aW9uIGFuZCByZWxhdGVkIGRhdGEnIHwgdHJhbnNsYXRlKX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BcmNoaXZlKClcIiBbZGlzYWJsZWRdPVwiIWNhbkFyY2hpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FyY2hpdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiICpuZ0lmPVwiaXNWYWxpZGF0aW5nRHBlXCI+XG4gICAgICAgICAgICA8aDY+e3snTW9zdCByZWxldmFudCByZXN1bHRzIGZvcicgfCB0cmFuc2xhdGV9fSA6XG4gICAgICAgICAgICAgICAgPGI+ZGlhZ25vc3RpY3MgZGUgcGVyZm9ybWFuY2Ugw6luZXJnw6l0aXF1ZSAoRFBFKSBkZXMgYsOidGltZW50cyB0ZXJ0aWFpcmVzPC9iPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPiM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQXBwbHkgdG8gbG9jYXRpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydBY3Rpdml0eSBzZWN0b3InIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRW5lcmd5IENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByZXN1bHQgb2YgcGFyc2VkTWV0YWRhdGE7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPnt7IGkgKyAxIH19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseVwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicmVzdWx0LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZShyZXN1bHQpXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5nZW9fYWRyZXNzZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jlc3VsdC5zZWN0ZXVyX2FjdGl2aXRlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5hbm5lZV9jb25zdHJ1Y3Rpb24gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfY29uc29tbWF0aW9uX2VuZXJnaWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHJlc3VsdC5jbGFzc2VfZXN0aW1hdGlvbl9nZXMgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uU2F2ZVJlc3VsdCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkRHBlUmVzdWx0XCI+e3snU2F2ZSBzZWxlY3RlZCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FcmFzZSgpXCI+XG4gICAgICAgICAgICAgICAge3snTm8gbWF0Y2ggKGVyYXNlIGRhdGEpJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxuICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVG9nZ2xlIGJ1dHRvbiBmb3IgdGhlIGFkbWluIFwiQ29weSBQT0lzXCIgZm9ybSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNBZG1pbiAmJiBzcGFjZXMgJiYgc3BhY2VzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cInRvZ2dsZUNvcHlQb2lzRm9ybSgpXCI+XG4gICAgICAgICAgICB7eyAoc2hvd0NvcHlQb2lzRm9ybSA/ICdtYXR0ZXJwb3J0Q29weS5oaWRlRm9ybScgOiAnbWF0dGVycG9ydENvcHkuc2hvd0Zvcm0nKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWRtaW4gRm9ybSB0byBDb3B5IFBPSXMgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzQWRtaW4gJiYgc3BhY2VzICYmIHNwYWNlcy5sZW5ndGggPiAwICYmIHNob3dDb3B5UG9pc0Zvcm1cIiBjbGFzcz1cIm10LTMgcC00IGJvcmRlciByb3VuZGVkIGJnLWxpZ2h0XCI+XG4gICAgICAgIDxoNj57eyAnbWF0dGVycG9ydENvcHkuZm9ybVRpdGxlJyB8IHRyYW5zbGF0ZSB9fTwvaDY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLW1kLTVcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnbWF0dGVycG9ydENvcHkuc291cmNlU3BhY2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTb3VyY2VTcGFjZUlkXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Tb3VyY2VTcGFjZUNoYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNlbGVjdFNwYWNlJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIHNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+e3tzcGFjZS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiICpuZ0lmPVwic291cmNlVmlzaXRzXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU291cmNlM2RNb2RlbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxTZWxlY3Rpb25DaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS5zZWxlY3RWaXNpdCcgfCB0cmFuc2xhdGUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2aXNpdCBvZiBzb3VyY2VWaXNpdHNcIiBbbmdWYWx1ZV09XCJ2aXNpdC5tb2RlbDNkXCI+e3t2aXNpdC5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtbWQtNVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdtYXR0ZXJwb3J0Q29weS50YXJnZXRWaXNpdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsU2VsZWN0aW9uQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAnbWF0dGVycG9ydENvcHkuc2VsZWN0VmlzaXQnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmlzaXQgb2YgdmlzaXRzXCIgW25nVmFsdWVdPVwidmlzaXQubW9kZWwzZFwiPnt7dmlzaXQubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkU291cmNlU3BhY2VJZCAmJiBzZWxlY3RlZFNvdXJjZTNkTW9kZWwgJiYgc2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHJvdW5kZWQgcC0zIG1iLTMgYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZCBtYi0yXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmxhbmRtYXJrSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZ3LWJvbGQgc21hbGwgbWItMlwiPnt7ICdtYXR0ZXJwb3J0Q29weS5sYW5kbWFya0EnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRTb3VyY2UzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrU291cmNlQVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnNvdXJjZVZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblNvdXJjZUxhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbGFuZG1hcmstcGlja2VyIFt2aXNpdDNkTW9kZWxdPVwic2VsZWN0ZWRUYXJnZXQzZE1vZGVsXCIgW3Nka0tleV09XCJzZGtLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxhbmRtYXJrVGFyZ2V0QVwiIHRpdGxlPVwie3sgJ21hdHRlcnBvcnRDb3B5LnRhcmdldFZpc2l0TGFiZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludFBpY2tlZCk9XCJvblRhcmdldExhbmRtYXJrUGlja2VkKCdBJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1sYW5kbWFyay1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmdy1ib2xkIHNtYWxsIG1iLTJcIj57eyAnbWF0dGVycG9ydENvcHkubGFuZG1hcmtCJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFNvdXJjZTNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtTb3VyY2VCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkuc291cmNlVmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uU291cmNlTGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1sYW5kbWFyay1waWNrZXIgW3Zpc2l0M2RNb2RlbF09XCJzZWxlY3RlZFRhcmdldDNkTW9kZWxcIiBbc2RrS2V5XT1cInNka0tleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGFuZG1hcmtUYXJnZXRCXCIgdGl0bGU9XCJ7eyAnbWF0dGVycG9ydENvcHkudGFyZ2V0VmlzaXRMYWJlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50UGlja2VkKT1cIm9uVGFyZ2V0TGFuZG1hcmtQaWNrZWQoJ0InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLWxhbmRtYXJrLXBpY2tlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwdC0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCIgW2Rpc2FibGVkXT1cIiFjYW5Db3B5UG9pcyB8fCBpc0NvcHlpbmdQb2lzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db3B5UG9pcygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmNvcHlCdXR0b24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImV4cG9ydExhbmRtYXJrQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmV4cG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmltcG9ydExhbmRtYXJrcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiYXBwbGljYXRpb24vanNvblwiIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltcG9ydExhbmRtYXJrQ29uZmlnU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvcHlpbmdQb2lzXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSB0ZXh0LXByaW1hcnlcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UG9pc1Jlc3VsdE1zZ1wiIGNsYXNzPVwibXQtMiB0ZXh0LXN1Y2Nlc3MgZnctYm9sZFwiPlxuICAgICAgICAgICAge3sgY29weVBvaXNSZXN1bHRNc2cgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5UHJvZ3Jlc3NcIiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gc21hbGwgbWItMVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb3B5UHJvZ3Jlc3MucGhhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY29sbGVjdGluZydcIj57eyAnQ29sbGVjdGluZyBpbmZvcm1hdGlvbiBmcm9tIGJvdGggdmlzaXRzLi4uJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0aWNrZXRzJ1wiPnt7ICdDb3B5aW5nIHRpY2tldHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidlcXVpcG1lbnRzJ1wiPnt7ICdDb3B5aW5nIGVxdWlwbWVudHMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidwb2lzJ1wiPnt7ICdDb3B5aW5nIHN0YW5kYWxvbmUgUE9JcycgfCB0cmFuc2xhdGUgfX0gKHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVByb2dyZXNzLnByb2Nlc3NlZEluUGhhc2UgfX0ve3sgY29weVByb2dyZXNzLnRvdGFsSW5QaGFzZSB9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ29iamVjdHMzZCdcIj57eyAnQ29weWluZyAzRCBvYmplY3RzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZmVhdHVyZXMnXCI+e3sgJ0NvcHlpbmcgZmVhdHVyZXMnIHwgdHJhbnNsYXRlIH19ICh7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlQcm9ncmVzcy5wcm9jZXNzZWRJblBoYXNlIH19L3t7IGNvcHlQcm9ncmVzcy50b3RhbEluUGhhc2UgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtZWFzdXJlbWVudHMnXCI+e3sgJ0NvcHlpbmcgbWVhc3VyZW1lbnRzJyB8IHRyYW5zbGF0ZSB9fSAoe3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvZ3Jlc3MucHJvY2Vzc2VkSW5QaGFzZSB9fS97eyBjb3B5UHJvZ3Jlc3MudG90YWxJblBoYXNlIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZG9uZSdcIj57eyAnRG9uZSEnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29weVByb2dyZXNzLnBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBzdHlsZT1cImhlaWdodDogNnB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbY2xhc3MucHJvZ3Jlc3MtYmFyLXN0cmlwZWRdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucHJvZ3Jlc3MtYmFyLWFuaW1hdGVkXT1cImNvcHlQcm9ncmVzcy5waGFzZSA9PT0gJ2NvbGxlY3RpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLXdhcm5pbmddPVwiY29weVByb2dyZXNzLmVycm9yQ291bnQgPiAwXCIgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29weVByb2dyZXNzLnBoYXNlID09PSAnY29sbGVjdGluZycgPyAxMDAgOiBjb3B5UHJvZ3Jlc3MucGVyY2VudFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb3B5TG9nLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm10LTIgcC0yIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkIHNtYWxsXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGNvcHlMb2dcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwiZW50cnkudHlwZSA9PT0gJ2Vycm9yJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXdhcm5pbmddPVwiZW50cnkudHlwZSA9PT0gJ2hlYWxlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZW50cnkudGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG10LTJcIiAqbmdJZj1cImNvcHlMb2cubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ29weUxvZygpXCI+XG4gICAgICAgICAgICAgICAge3sgJ21hdHRlcnBvcnRDb3B5LmRvd25sb2FkTG9nJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGxpYi1mb3JtLWxvY2F0aW9uICpuZ0lmPVwiaXNFZGl0aW5nXCIgW2xvY2F0aW9uXT1cInNwYWNlXCIgKG9uQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCI+PC9saWItZm9ybS1sb2NhdGlvbj5cbjwvZGl2PiJdfQ==