@colijnit/homedecorator 255.1.4 → 255.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/core/enum/message-type.enum.d.ts +3 -1
- package/app/core/interface/message-with-payload.interface.d.ts +6 -0
- package/app/core/model/homedecorator-settings-options.d.ts +2 -0
- package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +2 -0
- package/app/core/service/homedecorator-connector.service.d.ts +5 -4
- package/app/core/service/homedecorator-settings.service.d.ts +2 -1
- package/app/core/service/presets.service.d.ts +3 -1
- package/app/homedecorator.component.d.ts +3 -1
- package/app/homedecorator.module.d.ts +2 -1
- package/app/plugins/core3d/service/floor-pattern.service.d.ts +1 -1
- package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +2 -1
- package/app/plugins/core3d/service/floor.service.d.ts +3 -1
- package/app/plugins/core3d/service/post-processing.service.d.ts +21 -7
- package/app/plugins/core3d/service/scene.service.d.ts +1 -1
- package/app/plugins/core3d/service/ssr.service.d.ts +0 -1
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +11 -2
- package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +185 -15
- package/app/plugins/model-uploader/model-uploader.module.d.ts +5 -1
- package/app/plugins/render/render-dialog/render-dialog.component.d.ts +4 -1
- package/app/plugins/render/render-dialog/render-dialog.component.scss +5 -5
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +3 -1
- package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +1 -0
- package/app/plugins/room-planner/components/settings/settings.component.d.ts +5 -1
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +4 -1
- package/app/plugins/room-planner/room-planner/room-planner.component.scss +1 -0
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +1 -3
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +2 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
- package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +2 -0
- package/assets/icons/dash-button.svg +7 -0
- package/assets/icons/pen-ruler.svg +1 -0
- package/assets/icons/retry-button.svg +7 -0
- package/bundles/colijnit-homedecorator.umd.js +822 -601
- package/bundles/colijnit-homedecorator.umd.js.map +1 -1
- package/esm2015/app/app.version.js +3 -3
- package/esm2015/app/core/enum/message-type.enum.js +3 -1
- package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
- package/esm2015/app/core/model/homedecorator-settings-options.js +3 -1
- package/esm2015/app/core/service/3dm-api.js +4 -4
- package/esm2015/app/core/service/homedecorator-app-event.service.js +2 -1
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +25 -2
- package/esm2015/app/core/service/homedecorator-connector.service.js +25 -22
- package/esm2015/app/core/service/homedecorator-settings.service.js +3 -2
- package/esm2015/app/core/service/presets.service.js +13 -5
- package/esm2015/app/core/utils/material.utils.js +3 -3
- package/esm2015/app/homedecorator.component.js +26 -19
- package/esm2015/app/homedecorator.module.js +8 -4
- package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +5 -5
- package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/factory.js +3 -2
- package/esm2015/app/plugins/core3d/service/ar.service.js +2 -1
- package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +24 -18
- package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +13 -8
- package/esm2015/app/plugins/core3d/service/floor.service.js +9 -4
- package/esm2015/app/plugins/core3d/service/light-presets.service.js +10 -8
- package/esm2015/app/plugins/core3d/service/lights.service.js +8 -1
- package/esm2015/app/plugins/core3d/service/outline.service.js +4 -6
- package/esm2015/app/plugins/core3d/service/post-processing.service.js +148 -51
- package/esm2015/app/plugins/core3d/service/scene-event.service.js +14 -7
- package/esm2015/app/plugins/core3d/service/scene.service.js +84 -74
- package/esm2015/app/plugins/core3d/service/ssr.service.js +2 -53
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +10 -5
- package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +2 -2
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +281 -166
- package/esm2015/app/plugins/model-uploader/model-uploader.module.js +22 -3
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +3 -2
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +19 -14
- package/esm2015/app/plugins/render/service/new-render.service.js +4 -2
- package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +4 -2
- package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +2 -2
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +29 -15
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +5 -2
- package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +12 -5
- package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +31 -15
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +691 -683
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +43 -41
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1 -1
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +26 -20
- package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +2 -2
- package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +15 -8
- package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +4 -2
- package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +3 -3
- package/fesm2015/colijnit-homedecorator.js +1656 -1322
- package/fesm2015/colijnit-homedecorator.js.map +1 -1
- package/package.json +1 -1
|
@@ -763,7 +763,7 @@ export class RoomPlannerComponent {
|
|
|
763
763
|
this.showContextMenu = false;
|
|
764
764
|
}
|
|
765
765
|
startGroupSelection() {
|
|
766
|
-
this.
|
|
766
|
+
this.closeContextMenu();
|
|
767
767
|
this.userIsGrouping = true;
|
|
768
768
|
this._messageService.emit(MessageType.StartGroupObject);
|
|
769
769
|
}
|
|
@@ -870,752 +870,760 @@ export class RoomPlannerComponent {
|
|
|
870
870
|
}
|
|
871
871
|
RoomPlannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RoomPlannerComponent, deps: [{ token: i1.HomedecoratorIconCacheService }, { token: i2.ViewModeService }, { token: i3.ModelsService }, { token: i4.PresetsService }, { token: i5.HomedecoratorAppService }, { token: i6.ScreenSizeAnalysisService }, { token: i0.ChangeDetectorRef }, { token: i7.UtilsService }, { token: i8.MessageBusService }, { token: i9.MatDialog }, { token: i10.ConfigurationService }, { token: i11.FloorplanService }, { token: i12.SceneService }, { token: i13.HudService }, { token: i14.RoomService }, { token: i15.CameraService }, { token: i16.ItemService }, { token: i17.ItemSerializationService }, { token: i18.LightsService }, { token: i19.ArService }, { token: i16.ItemService }, { token: i20.HomedecoratorSettingsService }, { token: i21.GoogleTagManagerService }, { token: i22.PermanentStoreService }, { token: i23.HomedecoratorAppEventService }, { token: i24.HomedecoratorConnectorService }, { token: i25.HomedecoratorConnectorAdapterService }], target: i0.ɵɵFactoryTarget.Component });
|
|
872
872
|
RoomPlannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RoomPlannerComponent, selector: "rp-room-planner", inputs: { isLoading: "isLoading" }, outputs: { done: "done", showPlugin: "showPlugin", focusControls: "focusControls" }, host: { listeners: { "document:keydown": "handleDocKeyDown($event)" }, properties: { "class": "this.layerClass" } }, viewQueries: [{ propertyName: "floorplanner", first: true, predicate: FloorplannerComponent, descendants: true, static: true }, { propertyName: "toolbarIconLibrary", first: true, predicate: ["toolbarIconLibrary"], descendants: true, static: true }, { propertyName: "toolbarIconAccessoires", first: true, predicate: ["toolbarIconAccessoires"], descendants: true, static: true }, { propertyName: "toolbarIconSettings", first: true, predicate: ["toolbarIconSettings"], descendants: true, static: true }, { propertyName: "toolbarIcon2dView", first: true, predicate: ["toolbarIcon2dView"], descendants: true, static: true }, { propertyName: "toolbarIcon3dView", first: true, predicate: ["toolbarIcon3dView"], descendants: true, static: true }, { propertyName: "categoriesSidebar", first: true, predicate: ["categoriesSidebar"], descendants: true, static: true }, { propertyName: "accessoiresCategoriesSidebar", first: true, predicate: ["accessoiresCategoriesSidebar"], descendants: true, static: true }, { propertyName: "customShapeCreatorSideBar", first: true, predicate: ["customShapeCreatorSideBar"], descendants: true, static: true }, { propertyName: "customCylinderCreatorSideBar", first: true, predicate: ["customCylinderCreatorSideBar"], descendants: true, static: true }, { propertyName: "settingsSidebar", first: true, predicate: ["settingsSidebar"], descendants: true, static: true }, { propertyName: "librarySidebar", first: true, predicate: ["librarySidebar"], descendants: true, static: true }, { propertyName: "selectedObjectSidebar", first: true, predicate: ["selectedObjectSidebar"], descendants: true, static: true }, { propertyName: "selectedWallSidebar", first: true, predicate: ["selectedWallSidebar"], descendants: true, static: true }, { propertyName: "selectedThreedObjectSidebar", first: true, predicate: ["selectedThreedObjectSidebar"], descendants: true, static: true }, { propertyName: "selectedFloorSidebar", first: true, predicate: ["selectedFloorSidebar"], descendants: true, static: true }, { propertyName: "toolbarIconFaq", first: true, predicate: ["toolbarIconFaq"], descendants: true, static: true }, { propertyName: "toolbarIconFeedback", first: true, predicate: ["toolbarIconFeedback"], descendants: true, static: true }, { propertyName: "toolbarIconCart", first: true, predicate: ["toolbarIconCart"], descendants: true, static: true }], ngImport: i0, template: `
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
873
|
+
<div class="RoomPlanner">
|
|
874
|
+
<floor-planner
|
|
875
|
+
[class.hidden]="!viewModeService.is2dViewActive()"
|
|
876
|
+
(selectedWallChange)="selectWall($event)"></floor-planner>
|
|
877
|
+
</div>
|
|
878
|
+
|
|
879
|
+
<rp-context-menu
|
|
880
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
|
|
881
|
+
[openMouseEvent]="contextMenuMouseEvent">
|
|
882
|
+
<div class="rp-item-context-menu-wrap ">
|
|
883
|
+
<div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
|
|
884
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
885
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
886
|
+
</div>
|
|
877
887
|
</div>
|
|
888
|
+
</rp-context-menu>
|
|
878
889
|
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
890
|
+
<rp-context-menu
|
|
891
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
|
|
892
|
+
[openMouseEvent]="contextMenuMouseEvent">
|
|
893
|
+
<div class="rp-item-context-menu-wrap">
|
|
894
|
+
<div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
|
|
895
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
896
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
897
|
+
</div>
|
|
898
|
+
</div>
|
|
899
|
+
</rp-context-menu>
|
|
889
900
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
901
|
+
<rp-item-context-menu
|
|
902
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
|
|
903
|
+
[item]="selectedObject"
|
|
904
|
+
(deletePressed)="handleDeleteObject()">
|
|
905
|
+
<div class="rp-item-context-menu-wrap">
|
|
906
|
+
<div class="rp-item-context-menu-close" (click)="closeContextMenu()">
|
|
907
|
+
<span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
|
|
908
|
+
</div>
|
|
909
|
+
<div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
|
|
910
|
+
<p>{{ this.selectedObject.name }}</p>
|
|
911
|
+
</div>
|
|
912
|
+
<div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
|
|
913
|
+
class="rp-item-context-menu-item ">
|
|
914
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
915
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
916
|
+
</div>
|
|
917
|
+
<ng-container *ngIf="showConfigurationButton">
|
|
918
|
+
<div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
|
|
919
|
+
class="rp-item-context-menu-item ">
|
|
920
|
+
<span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
|
|
921
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
898
922
|
</div>
|
|
899
|
-
|
|
923
|
+
</ng-container>
|
|
924
|
+
<div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
|
|
925
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
|
|
926
|
+
<span class="label">{{ 'COPY' | localize }}</span>
|
|
927
|
+
</div>
|
|
928
|
+
<div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
929
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
930
|
+
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
931
|
+
</div>
|
|
932
|
+
<div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
|
|
933
|
+
class="rp-item-context-menu-item">
|
|
934
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
|
|
935
|
+
<span class="label">{{ 'SETTINGS' | localize }}</span>
|
|
936
|
+
</div>
|
|
937
|
+
<div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
|
|
938
|
+
class="rp-item-context-menu-item">
|
|
939
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons"
|
|
940
|
+
[textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
941
|
+
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
942
|
+
</div>
|
|
943
|
+
<div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
|
|
944
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
945
|
+
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
946
|
+
</div>
|
|
900
947
|
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
<
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
<div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
|
|
910
|
-
<p>{{ this.selectedObject.name }}</p>
|
|
911
|
-
</div>
|
|
912
|
-
<div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
|
|
913
|
-
class="rp-item-context-menu-item ">
|
|
914
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
915
|
-
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
916
|
-
</div>
|
|
917
|
-
<ng-container *ngIf="showConfigurationButton">
|
|
918
|
-
<div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
|
|
919
|
-
class="rp-item-context-menu-item ">
|
|
920
|
-
<span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
|
|
921
|
-
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
922
|
-
</div>
|
|
923
|
-
</ng-container>
|
|
924
|
-
<div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
|
|
925
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
|
|
926
|
-
<span class="label">{{ 'COPY' | localize }}</span>
|
|
927
|
-
</div>
|
|
928
|
-
<div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
929
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
930
|
-
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
931
|
-
</div>
|
|
932
|
-
<div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
|
|
933
|
-
class="rp-item-context-menu-item">
|
|
934
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
|
|
935
|
-
<span class="label">{{ 'SETTINGS' | localize }}</span>
|
|
936
|
-
</div>
|
|
937
|
-
<div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
|
|
938
|
-
class="rp-item-context-menu-item">
|
|
939
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
940
|
-
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
941
|
-
</div>
|
|
942
|
-
<div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
|
|
943
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
944
|
-
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
945
|
-
</div>
|
|
948
|
+
<div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
|
|
949
|
+
(click)="sendConversionToTagManager()"
|
|
950
|
+
class="rp-item-context-menu-item"
|
|
951
|
+
[ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
|
|
952
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
|
|
953
|
+
<span class="label">{{ 'CONVERSION' | localize }}</span>
|
|
954
|
+
<span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
|
|
955
|
+
</div>
|
|
946
956
|
|
|
947
|
-
<div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
|
|
948
|
-
(click)="sendConversionToTagManager()"
|
|
949
|
-
class="rp-item-context-menu-item"
|
|
950
|
-
[ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
|
|
951
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
|
|
952
|
-
<span class="label">{{ 'CONVERSION' | localize }}</span>
|
|
953
|
-
<span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
|
|
954
|
-
</div>
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
<div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
|
|
958
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
|
|
959
|
-
<span class="label">{{ 'AR' | localize }}</span>
|
|
960
|
-
</div>
|
|
961
|
-
<button-elevation
|
|
962
|
-
*ngIf="selectedObject && selectedObject.elevationAdjustable"
|
|
963
|
-
[item]="selectedObject">
|
|
964
|
-
</button-elevation>
|
|
965
|
-
<ng-container *ngIf="salableObject">
|
|
966
|
-
<div class="toolbar__divider context-menu"></div>
|
|
967
|
-
<div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
|
|
968
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
|
|
969
|
-
<span class="label">{{ 'ADD_TO_CART' | localize }}</span>
|
|
970
|
-
</div>
|
|
971
|
-
</ng-container>
|
|
972
|
-
</div>
|
|
973
|
-
</rp-item-context-menu>
|
|
974
957
|
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
989
|
-
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
990
|
-
</div>
|
|
991
|
-
<div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
|
|
992
|
-
class="rp-item-context-menu-item">
|
|
993
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
994
|
-
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
995
|
-
</div>
|
|
958
|
+
<div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
|
|
959
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
|
|
960
|
+
<span class="label">{{ 'AR' | localize }}</span>
|
|
961
|
+
</div>
|
|
962
|
+
<button-elevation
|
|
963
|
+
*ngIf="selectedObject && selectedObject.elevationAdjustable"
|
|
964
|
+
[item]="selectedObject">
|
|
965
|
+
</button-elevation>
|
|
966
|
+
<ng-container *ngIf="salableObject">
|
|
967
|
+
<div class="toolbar__divider context-menu"></div>
|
|
968
|
+
<div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
|
|
969
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
|
|
970
|
+
<span class="label">{{ 'ADD_TO_CART' | localize }}</span>
|
|
996
971
|
</div>
|
|
997
|
-
|
|
972
|
+
</ng-container>
|
|
973
|
+
</div>
|
|
974
|
+
</rp-item-context-menu>
|
|
998
975
|
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
976
|
+
<rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
|
|
977
|
+
[item]="selectedObject"
|
|
978
|
+
(deletePressed)="handleDeleteObject()">
|
|
979
|
+
<div class="rp-item-context-menu-wrap">
|
|
980
|
+
<div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
|
|
981
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
982
|
+
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
983
|
+
</div>
|
|
984
|
+
<div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
|
|
985
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
|
|
986
|
+
<span class="label">{{ 'UNGROUP' | localize }}</span>
|
|
987
|
+
</div>
|
|
988
|
+
<div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
989
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
990
|
+
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
991
|
+
</div>
|
|
992
|
+
<div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
|
|
993
|
+
class="rp-item-context-menu-item">
|
|
994
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons"
|
|
995
|
+
[textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
996
|
+
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
997
|
+
</div>
|
|
998
|
+
</div>
|
|
999
|
+
</rp-item-context-menu>
|
|
1009
1000
|
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1001
|
+
<ng-template #toolbarIconLibrary>
|
|
1002
|
+
<rp-toolbar-icon
|
|
1003
|
+
*ngIf="!phoneSizeScreen"
|
|
1004
|
+
[disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
|
|
1005
|
+
matIcon="home"
|
|
1006
|
+
tooltip="{{iconName.Architecture | localize}}"
|
|
1007
|
+
(onClick)="showLibraryCategories()"
|
|
1008
|
+
[showLabel]="phoneSizeScreen"
|
|
1009
|
+
></rp-toolbar-icon>
|
|
1010
|
+
</ng-template>
|
|
1019
1011
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
></rp-toolbar-icon>
|
|
1030
|
-
</ng-template>
|
|
1012
|
+
<ng-template #toolbarIconAccessoires>
|
|
1013
|
+
<rp-toolbar-icon
|
|
1014
|
+
[disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
|
|
1015
|
+
matIcon="local_florist"
|
|
1016
|
+
tooltip="{{iconName.Accessories | localize}}"
|
|
1017
|
+
(onClick)="showAccessoireCategories()"
|
|
1018
|
+
[showLabel]="phoneSizeScreen"
|
|
1019
|
+
></rp-toolbar-icon>
|
|
1020
|
+
</ng-template>
|
|
1031
1021
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1022
|
+
<ng-template #toolbarIcon2dView>
|
|
1023
|
+
<span class="toolbar__divider"></span>
|
|
1024
|
+
<rp-toolbar-icon
|
|
1025
|
+
*ngIf="!phoneSizeScreen"
|
|
1026
|
+
svgIcon="cube-unfolded"
|
|
1027
|
+
tooltip="{{iconName.TwodFloorplan | localize}}"
|
|
1028
|
+
[disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
|
|
1029
|
+
(onClick)="updateMode(viewModes.FloorPlan2D, true)"
|
|
1030
|
+
[showLabel]="phoneSizeScreen"
|
|
1031
|
+
></rp-toolbar-icon>
|
|
1032
|
+
</ng-template>
|
|
1041
1033
|
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1034
|
+
<ng-template #toolbarIcon3dView>
|
|
1035
|
+
<rp-toolbar-icon
|
|
1036
|
+
svgIcon="cube-outline"
|
|
1037
|
+
tooltip="{{iconName.ThreedRoomplan | localize}}"
|
|
1038
|
+
[disabled]="viewModeService.is3dViewActive()"
|
|
1039
|
+
(onClick)="updateMode(viewModes.RoomPlan3D, true)"
|
|
1040
|
+
[showLabel]="phoneSizeScreen"
|
|
1041
|
+
></rp-toolbar-icon>
|
|
1042
|
+
</ng-template>
|
|
1048
1043
|
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
[showLabel]="phoneSizeScreen"
|
|
1056
|
-
></rp-toolbar-icon>
|
|
1057
|
-
</ng-template>
|
|
1044
|
+
<rp-zoom-controls
|
|
1045
|
+
[visible]="viewModeService.is2dViewActive()"
|
|
1046
|
+
(onZoomIn)="zoomIn()"
|
|
1047
|
+
(onZoomReset)="zoomReset()"
|
|
1048
|
+
(onZoomOut)="zoomOut()"
|
|
1049
|
+
></rp-zoom-controls>
|
|
1058
1050
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1051
|
+
<ng-template #toolbarIconSettings>
|
|
1052
|
+
<span class="toolbar__divider"></span>
|
|
1053
|
+
<rp-toolbar-icon
|
|
1054
|
+
matIcon="settings"
|
|
1055
|
+
tooltip="{{iconName.Settings | localize}}"
|
|
1056
|
+
(onClick)="showSettings()"
|
|
1057
|
+
[showLabel]="phoneSizeScreen"
|
|
1058
|
+
></rp-toolbar-icon>
|
|
1059
|
+
</ng-template>
|
|
1068
1060
|
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
<ng-template #toolbarIconCart>
|
|
1079
|
-
<span class="toolbar__divider"></span>
|
|
1080
|
-
<rp-toolbar-icon class="add-to-cart-button"
|
|
1081
|
-
svgIcon="cart-shopping-regular"
|
|
1082
|
-
tooltip="{{'ADD_TO_CART' | localize}}"
|
|
1083
|
-
(onClick)="addAllToCart()"
|
|
1084
|
-
[showLabel]="phoneSizeScreen"
|
|
1085
|
-
></rp-toolbar-icon>
|
|
1086
|
-
<span class="toolbar__divider"></span>
|
|
1087
|
-
</ng-template>
|
|
1061
|
+
<ng-template #toolbarIconFaq>
|
|
1062
|
+
<rp-toolbar-icon
|
|
1063
|
+
*ngIf="showFaq()"
|
|
1064
|
+
matIcon="help"
|
|
1065
|
+
tooltip="{{iconName.Faq | localize}}"
|
|
1066
|
+
(onClick)="openFaq(this.settingsService.settings.faqUrl)"
|
|
1067
|
+
[showLabel]="phoneSizeScreen"
|
|
1068
|
+
></rp-toolbar-icon>
|
|
1069
|
+
</ng-template>
|
|
1088
1070
|
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1071
|
+
<ng-template #toolbarIconFeedback>
|
|
1072
|
+
<rp-toolbar-icon
|
|
1073
|
+
*ngIf="showFeedback()"
|
|
1074
|
+
matIcon="chat_bubble"
|
|
1075
|
+
tooltip="{{iconName.Feedback | localize}}"
|
|
1076
|
+
(onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
|
|
1077
|
+
[showLabel]="phoneSizeScreen"
|
|
1078
|
+
></rp-toolbar-icon>
|
|
1079
|
+
</ng-template>
|
|
1080
|
+
<ng-template #toolbarIconCart>
|
|
1081
|
+
<span class="toolbar__divider"></span>
|
|
1082
|
+
<rp-toolbar-icon class="add-to-cart-button"
|
|
1083
|
+
svgIcon="cart-shopping-regular"
|
|
1084
|
+
tooltip="{{'ADD_TO_CART' | localize}}"
|
|
1085
|
+
(onClick)="addAllToCart()"
|
|
1086
|
+
[showLabel]="phoneSizeScreen"
|
|
1087
|
+
></rp-toolbar-icon>
|
|
1088
|
+
<span class="toolbar__divider"></span>
|
|
1089
|
+
</ng-template>
|
|
1100
1090
|
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
</
|
|
1091
|
+
<ng-template #settingsSidebar>
|
|
1092
|
+
<header class="drawer__header">
|
|
1093
|
+
<h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
|
|
1094
|
+
</header>
|
|
1095
|
+
<rp-settings
|
|
1096
|
+
[placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
|
|
1097
|
+
[minWallHeight]="getMinGlobalWallHeight()"
|
|
1098
|
+
(onWallsHeightUpdate)="wallsHeightUpdated($event)"
|
|
1099
|
+
>
|
|
1100
|
+
</rp-settings>
|
|
1101
|
+
</ng-template>
|
|
1111
1102
|
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1103
|
+
<ng-template #categoriesSidebar>
|
|
1104
|
+
<header class="drawer__header">
|
|
1105
|
+
<h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
|
|
1106
|
+
</header>
|
|
1107
|
+
<rp-category-library
|
|
1108
|
+
[categories]="categories"
|
|
1109
|
+
(categoryClick)="showLibraryCategory($event)"
|
|
1110
|
+
>
|
|
1111
|
+
</rp-category-library>
|
|
1112
|
+
</ng-template>
|
|
1122
1113
|
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1114
|
+
<ng-template #accessoiresCategoriesSidebar>
|
|
1115
|
+
<header class="drawer__header">
|
|
1116
|
+
<h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
|
|
1117
|
+
</header>
|
|
1118
|
+
<rp-category-library
|
|
1119
|
+
[categories]="accessoireCategories"
|
|
1120
|
+
(categoryClick)="showLibraryCategory($event)"
|
|
1121
|
+
>
|
|
1122
|
+
</rp-category-library>
|
|
1123
|
+
</ng-template>
|
|
1129
1124
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1125
|
+
<ng-template #customShapeCreatorSideBar>
|
|
1126
|
+
<header class="drawer__header">
|
|
1127
|
+
<h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
|
|
1128
|
+
</header>
|
|
1129
|
+
<rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
|
|
1130
|
+
</ng-template>
|
|
1136
1131
|
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
<h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
|
|
1144
|
-
</header>
|
|
1145
|
-
<p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
|
|
1146
|
-
<section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
|
|
1147
|
-
<ng-container *ngIf="hasCustomObjects()">
|
|
1148
|
-
<h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
|
|
1149
|
-
<rp-object-library
|
|
1150
|
-
[objects]="customObjects"
|
|
1151
|
-
(setDragged)="setDragged($event)"
|
|
1152
|
-
(releaseDragged)="releaseDragged()"
|
|
1153
|
-
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1154
|
-
>
|
|
1155
|
-
</rp-object-library>
|
|
1156
|
-
<mat-divider></mat-divider>
|
|
1157
|
-
</ng-container>
|
|
1158
|
-
<ng-container *ngIf="libraryObjects?.length > 0">
|
|
1159
|
-
<h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
|
|
1160
|
-
<rp-object-library
|
|
1161
|
-
[objects]="libraryObjects"
|
|
1162
|
-
(setDragged)="setDragged($event)"
|
|
1163
|
-
(releaseDragged)="releaseDragged()"
|
|
1164
|
-
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1165
|
-
>
|
|
1166
|
-
</rp-object-library>
|
|
1167
|
-
</ng-container>
|
|
1168
|
-
</section>
|
|
1169
|
-
</div>
|
|
1170
|
-
</ng-template>
|
|
1132
|
+
<ng-template #customCylinderCreatorSideBar>
|
|
1133
|
+
<header class="drawer__header">
|
|
1134
|
+
<h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
|
|
1135
|
+
</header>
|
|
1136
|
+
<custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
|
|
1137
|
+
</ng-template>
|
|
1171
1138
|
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1139
|
+
<ng-template #librarySidebar>
|
|
1140
|
+
<div fxLayout="column" class="with-scrollable-section">
|
|
1141
|
+
<header class="drawer__header">
|
|
1142
|
+
<button mat-icon-button (click)="showActiveCategorySidebar()">
|
|
1143
|
+
<mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
|
|
1144
|
+
</button>
|
|
1145
|
+
<h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
|
|
1146
|
+
</header>
|
|
1147
|
+
<p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
|
|
1148
|
+
<section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
|
|
1149
|
+
<ng-container *ngIf="hasCustomObjects()">
|
|
1150
|
+
<h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
|
|
1151
|
+
<rp-object-library
|
|
1152
|
+
[objects]="customObjects"
|
|
1153
|
+
(setDragged)="setDragged($event)"
|
|
1154
|
+
(releaseDragged)="releaseDragged()"
|
|
1155
|
+
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1156
|
+
>
|
|
1157
|
+
</rp-object-library>
|
|
1158
|
+
<mat-divider></mat-divider>
|
|
1159
|
+
</ng-container>
|
|
1160
|
+
<ng-container *ngIf="libraryObjects?.length > 0">
|
|
1161
|
+
<h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
|
|
1162
|
+
<rp-object-library
|
|
1163
|
+
[objects]="libraryObjects"
|
|
1164
|
+
(setDragged)="setDragged($event)"
|
|
1165
|
+
(releaseDragged)="releaseDragged()"
|
|
1166
|
+
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1167
|
+
>
|
|
1168
|
+
</rp-object-library>
|
|
1169
|
+
</ng-container>
|
|
1170
|
+
</section>
|
|
1171
|
+
</div>
|
|
1172
|
+
</ng-template>
|
|
1182
1173
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
[maxWallLength]="maxWallLength"
|
|
1194
|
-
[minWallLength]="minWallLength"
|
|
1195
|
-
(remove)="removeWall($event)"
|
|
1196
|
-
(setLength)="setWallLength($event)"
|
|
1197
|
-
(setHeight)="setWallHeight($event)"
|
|
1198
|
-
(setThickness)="setWallThickness($event)"
|
|
1199
|
-
(selectCorner)="selectCorner($event)"
|
|
1200
|
-
(setTexture)="setWallTexture($event)"
|
|
1201
|
-
(setColor)="setWallColor($event)"
|
|
1202
|
-
>
|
|
1203
|
-
</rp-selected-wall>
|
|
1204
|
-
</ng-template>
|
|
1174
|
+
<ng-template #selectedObjectSidebar>
|
|
1175
|
+
<header class="drawer__header">
|
|
1176
|
+
<h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
|
|
1177
|
+
</header>
|
|
1178
|
+
<rp-selected-object
|
|
1179
|
+
[object]="selectedObject"
|
|
1180
|
+
(onSelectedObjectChange)="updateSelectedObjectHud()"
|
|
1181
|
+
>
|
|
1182
|
+
</rp-selected-object>
|
|
1183
|
+
</ng-template>
|
|
1205
1184
|
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1185
|
+
<ng-template #selectedWallSidebar>
|
|
1186
|
+
<header class="drawer__header">
|
|
1187
|
+
<h2 class="mat-title">{{ 'WALL'| localize }}</h2>
|
|
1188
|
+
</header>
|
|
1189
|
+
<rp-selected-wall
|
|
1190
|
+
[wall]="selectedWall"
|
|
1191
|
+
[texturePlane]="selectedEdges[0]"
|
|
1192
|
+
[minWallHeight]="getMinWallHeight(selectedWall)"
|
|
1193
|
+
[maxWallHeight]="maxWallHeight"
|
|
1194
|
+
[maxWallThickness]="maxWallThickness"
|
|
1195
|
+
[maxWallLength]="maxWallLength"
|
|
1196
|
+
[minWallLength]="minWallLength"
|
|
1197
|
+
(remove)="removeWall($event)"
|
|
1198
|
+
(setLength)="setWallLength($event)"
|
|
1199
|
+
(setHeight)="setWallHeight($event)"
|
|
1200
|
+
(setThickness)="setWallThickness($event)"
|
|
1201
|
+
(selectCorner)="selectCorner($event)"
|
|
1202
|
+
(setTexture)="setWallTexture($event)"
|
|
1203
|
+
(setColor)="setWallColor($event)"
|
|
1204
|
+
>
|
|
1205
|
+
</rp-selected-wall>
|
|
1206
|
+
</ng-template>
|
|
1219
1207
|
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1208
|
+
<ng-template #selectedThreedObjectSidebar>
|
|
1209
|
+
<header class="drawer__header">
|
|
1210
|
+
<h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
|
|
1211
|
+
</header>
|
|
1212
|
+
<rp-selected-threed-object
|
|
1213
|
+
[object]="selectedObject"
|
|
1214
|
+
[showCopy]="showCopyButton"
|
|
1215
|
+
[showDelete]="showDeleteButton"
|
|
1216
|
+
[showLock]="showLockButton"
|
|
1217
|
+
(onSelectedObjectChange)="updateSelectedObjectHud()"
|
|
1218
|
+
>
|
|
1219
|
+
</rp-selected-threed-object>
|
|
1220
|
+
</ng-template>
|
|
1231
1221
|
|
|
1222
|
+
<ng-template #selectedFloorSidebar>
|
|
1223
|
+
<h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
|
|
1224
|
+
<rp-selected-floor
|
|
1225
|
+
[floor]="selectedFloor"
|
|
1226
|
+
[texturePlane]="selectedFloor"
|
|
1227
|
+
(setTexture)="setFloorTexture($event)"
|
|
1228
|
+
(setColor)="setFloorColor($event)"
|
|
1229
|
+
(selectedFloorClosed)="selectedFloor = undefined"
|
|
1230
|
+
>
|
|
1231
|
+
</rp-selected-floor>
|
|
1232
|
+
</ng-template>
|
|
1232
1233
|
|
|
1234
|
+
<ng-container *ngIf="userIsGrouping">
|
|
1233
1235
|
<div class="rp-item-context-menu-wrap mrp-save-grouping" *ngIf="userIsGrouping">
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1236
|
+
<div class="rp-item-context-menu-item" (click)="onGroupClick()">
|
|
1237
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
|
|
1238
|
+
<span class="label">{{ 'GROUPING' | localize }}</span>
|
|
1239
|
+
</div>
|
|
1240
|
+
<div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
|
|
1241
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
|
|
1242
|
+
<span class="label">{{ 'CANCEL' | localize }}</span>
|
|
1243
|
+
</div>
|
|
1242
1244
|
</div>
|
|
1243
|
-
|
|
1245
|
+
</ng-container>
|
|
1246
|
+
|
|
1247
|
+
`, isInline: true, styles: [".with-scrollable-section{overflow:hidden;height:100%}.with-scrollable-section section{overflow-y:auto}.RoomPlanner{width:inherit;height:inherit;pointer-events:none}.RoomPlanner>*{pointer-events:all}.sidebar-toggles .mat-raised-button{width:110px;text-align:left}.logo-menu{position:absolute;top:20px;left:20px;z-index:2}.logo-menu-2nd{position:absolute;top:140px;left:84px}.logo-menu-4th{position:absolute;top:180px;left:84px}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.solid-background>canvas{fill:#fff;background:white}.toolbar__divider{border-bottom:1px solid black;width:100%;margin:5px 0}.toolbar__divider.context-menu{border-color:gray}.on-top{z-index:3}.rp-item-context-menu-wrap{color:#fff;background:rgba(0,0,0,.6);border-radius:5px;box-sizing:border-box;padding:5px;position:relative}.rp-item-context-menu-wrap .rp-item-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:5px;border-radius:5px}.rp-item-context-menu-wrap .rp-item-context-menu-item span,.rp-item-context-menu-wrap .rp-item-context-menu-item label{display:flex;flex-direction:column;line-height:20px;font-size:12px;font-weight:lighter;vertical-align:middle}.rp-item-context-menu-wrap .rp-item-context-menu-item .label{width:200px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon{width:20px;margin-right:10px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon svg,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon co-icon,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon .mat-icon{height:15px;width:15px;font-size:18px}.rp-item-context-menu-wrap .rp-item-context-menu-item:hover{background:rgba(220,220,220,.5)}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight{color:#da9803}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight svg{fill:#da9803}.rp-item-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}.rp-item-context-menu-wrap .rp-item-context-menu-header{border-bottom:1px solid #808080;margin-bottom:10px;padding-left:5px;padding-right:25px;max-width:200px;overflow:hidden}.rp-item-context-menu-wrap .rp-item-context-menu-header p{color:#dda73f;font-size:13px}.rp-item-context-menu-wrap .rp-item-context-menu-close{position:absolute;right:15px;top:15px;z-index:2;cursor:pointer;width:10px;height:10px}.rp-item-context-menu-wrap .rp-item-context-menu-close .close-icon .mat-icon{height:15px;width:15px;font-size:18px}.mrp-save-grouping{pointer-events:all;position:absolute;bottom:10%;left:50%}\n"], components: [{ type: i26.FloorplannerComponent, selector: "floor-planner", outputs: ["selectedWallChange"] }, { type: i27.ContextMenuComponent, selector: "rp-context-menu", inputs: ["openMouseEvent"] }, { type: i28.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i29.ItemContextMenuComponent, selector: "rp-item-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { type: i30.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i31.ButtonElevationComponent, selector: "button-elevation", inputs: ["item"] }, { type: i32.ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { type: i33.ZoomControlsComponent, selector: "rp-zoom-controls", inputs: ["visible"], outputs: ["onZoomIn", "onZoomReset", "onZoomOut"] }, { type: i34.SettingsComponent, selector: "rp-settings", inputs: ["minWallHeight", "placeCameraDisabled"], outputs: ["onWallsHeightUpdate"] }, { type: i35.CategoryLibraryComponent, selector: "rp-category-library", inputs: ["categories"], outputs: ["categoryClick"] }, { type: i36.CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: ["shape"] }, { type: i37.CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: ["shape"] }, { type: i38.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i39.ObjectLibraryComponent, selector: "rp-object-library", inputs: ["objects"], outputs: ["setDragged", "releaseDragged", "onObjectClick"] }, { type: i40.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i41.SelectedObjectComponent, selector: "rp-selected-object", inputs: ["object"], outputs: ["onSelectedObjectChange"] }, { type: i42.SelectedWallComponent, selector: "rp-selected-wall", inputs: ["wall", "texturePlane", "color", "minWallHeight", "maxWallHeight", "maxWallThickness", "maxWallLength", "minWallLength"], outputs: ["remove", "setLength", "setHeight", "setThickness", "selectCorner", "setTexture", "setColor"] }, { type: i43.SelectedThreedObjectComponent, selector: "rp-selected-threed-object", inputs: ["object", "showCopy", "showDelete", "showLock"], outputs: ["onSelectedObjectChange"] }, { type: i44.SelectedFloorComponent, selector: "rp-selected-floor", inputs: ["floor", "texturePlane", "color"], outputs: ["setTexture", "setColor"] }], directives: [{ type: i45.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i45.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i45.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i46.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i47.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i47.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "localize": i48.LocalizePipe } });
|
|
1244
1248
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RoomPlannerComponent, decorators: [{
|
|
1245
1249
|
type: Component,
|
|
1246
1250
|
args: [{
|
|
1247
1251
|
selector: 'rp-room-planner',
|
|
1248
1252
|
template: `
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
+
<div class="RoomPlanner">
|
|
1254
|
+
<floor-planner
|
|
1255
|
+
[class.hidden]="!viewModeService.is2dViewActive()"
|
|
1256
|
+
(selectedWallChange)="selectWall($event)"></floor-planner>
|
|
1257
|
+
</div>
|
|
1258
|
+
|
|
1259
|
+
<rp-context-menu
|
|
1260
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
|
|
1261
|
+
[openMouseEvent]="contextMenuMouseEvent">
|
|
1262
|
+
<div class="rp-item-context-menu-wrap ">
|
|
1263
|
+
<div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
|
|
1264
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
1265
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
1266
|
+
</div>
|
|
1253
1267
|
</div>
|
|
1268
|
+
</rp-context-menu>
|
|
1254
1269
|
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1270
|
+
<rp-context-menu
|
|
1271
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
|
|
1272
|
+
[openMouseEvent]="contextMenuMouseEvent">
|
|
1273
|
+
<div class="rp-item-context-menu-wrap">
|
|
1274
|
+
<div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
|
|
1275
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
1276
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
1277
|
+
</div>
|
|
1278
|
+
</div>
|
|
1279
|
+
</rp-context-menu>
|
|
1265
1280
|
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1281
|
+
<rp-item-context-menu
|
|
1282
|
+
*ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
|
|
1283
|
+
[item]="selectedObject"
|
|
1284
|
+
(deletePressed)="handleDeleteObject()">
|
|
1285
|
+
<div class="rp-item-context-menu-wrap">
|
|
1286
|
+
<div class="rp-item-context-menu-close" (click)="closeContextMenu()">
|
|
1287
|
+
<span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
|
|
1288
|
+
</div>
|
|
1289
|
+
<div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
|
|
1290
|
+
<p>{{ this.selectedObject.name }}</p>
|
|
1291
|
+
</div>
|
|
1292
|
+
<div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
|
|
1293
|
+
class="rp-item-context-menu-item ">
|
|
1294
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
|
|
1295
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
1296
|
+
</div>
|
|
1297
|
+
<ng-container *ngIf="showConfigurationButton">
|
|
1298
|
+
<div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
|
|
1299
|
+
class="rp-item-context-menu-item ">
|
|
1300
|
+
<span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
|
|
1301
|
+
<span class="label">{{ 'CONFIGURE' | localize }}</span>
|
|
1274
1302
|
</div>
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
<
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
</ng-container>
|
|
1300
|
-
<div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
|
|
1301
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
|
|
1302
|
-
<span class="label">{{ 'COPY' | localize }}</span>
|
|
1303
|
-
</div>
|
|
1304
|
-
<div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
1305
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
1306
|
-
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
1307
|
-
</div>
|
|
1308
|
-
<div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
|
|
1309
|
-
class="rp-item-context-menu-item">
|
|
1310
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
|
|
1311
|
-
<span class="label">{{ 'SETTINGS' | localize }}</span>
|
|
1312
|
-
</div>
|
|
1313
|
-
<div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
|
|
1314
|
-
class="rp-item-context-menu-item">
|
|
1315
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
1316
|
-
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
1317
|
-
</div>
|
|
1318
|
-
<div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
|
|
1319
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
1320
|
-
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
1321
|
-
</div>
|
|
1303
|
+
</ng-container>
|
|
1304
|
+
<div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
|
|
1305
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
|
|
1306
|
+
<span class="label">{{ 'COPY' | localize }}</span>
|
|
1307
|
+
</div>
|
|
1308
|
+
<div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
1309
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
1310
|
+
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
1311
|
+
</div>
|
|
1312
|
+
<div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
|
|
1313
|
+
class="rp-item-context-menu-item">
|
|
1314
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
|
|
1315
|
+
<span class="label">{{ 'SETTINGS' | localize }}</span>
|
|
1316
|
+
</div>
|
|
1317
|
+
<div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
|
|
1318
|
+
class="rp-item-context-menu-item">
|
|
1319
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons"
|
|
1320
|
+
[textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
1321
|
+
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
1322
|
+
</div>
|
|
1323
|
+
<div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
|
|
1324
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
1325
|
+
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
1326
|
+
</div>
|
|
1322
1327
|
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1328
|
+
<div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
|
|
1329
|
+
(click)="sendConversionToTagManager()"
|
|
1330
|
+
class="rp-item-context-menu-item"
|
|
1331
|
+
[ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
|
|
1332
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
|
|
1333
|
+
<span class="label">{{ 'CONVERSION' | localize }}</span>
|
|
1334
|
+
<span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
|
|
1335
|
+
</div>
|
|
1331
1336
|
|
|
1332
1337
|
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
</div>
|
|
1347
|
-
</ng-container>
|
|
1338
|
+
<div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
|
|
1339
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
|
|
1340
|
+
<span class="label">{{ 'AR' | localize }}</span>
|
|
1341
|
+
</div>
|
|
1342
|
+
<button-elevation
|
|
1343
|
+
*ngIf="selectedObject && selectedObject.elevationAdjustable"
|
|
1344
|
+
[item]="selectedObject">
|
|
1345
|
+
</button-elevation>
|
|
1346
|
+
<ng-container *ngIf="salableObject">
|
|
1347
|
+
<div class="toolbar__divider context-menu"></div>
|
|
1348
|
+
<div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
|
|
1349
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
|
|
1350
|
+
<span class="label">{{ 'ADD_TO_CART' | localize }}</span>
|
|
1348
1351
|
</div>
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
[item]="selectedObject"
|
|
1353
|
-
(deletePressed)="handleDeleteObject()">
|
|
1354
|
-
<div class="rp-item-context-menu-wrap">
|
|
1355
|
-
<div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
|
|
1356
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
1357
|
-
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
1358
|
-
</div>
|
|
1359
|
-
<div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
|
|
1360
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
|
|
1361
|
-
<span class="label">{{ 'UNGROUP' | localize }}</span>
|
|
1362
|
-
</div>
|
|
1363
|
-
<div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
1364
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
1365
|
-
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
1366
|
-
</div>
|
|
1367
|
-
<div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
|
|
1368
|
-
class="rp-item-context-menu-item">
|
|
1369
|
-
<span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
1370
|
-
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
1371
|
-
</div>
|
|
1372
|
-
</div>
|
|
1373
|
-
</rp-item-context-menu>
|
|
1352
|
+
</ng-container>
|
|
1353
|
+
</div>
|
|
1354
|
+
</rp-item-context-menu>
|
|
1374
1355
|
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1356
|
+
<rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
|
|
1357
|
+
[item]="selectedObject"
|
|
1358
|
+
(deletePressed)="handleDeleteObject()">
|
|
1359
|
+
<div class="rp-item-context-menu-wrap">
|
|
1360
|
+
<div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
|
|
1361
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
|
|
1362
|
+
<span class="label">{{ 'GROUP' | localize }}</span>
|
|
1363
|
+
</div>
|
|
1364
|
+
<div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
|
|
1365
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
|
|
1366
|
+
<span class="label">{{ 'UNGROUP' | localize }}</span>
|
|
1367
|
+
</div>
|
|
1368
|
+
<div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
|
|
1369
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
|
|
1370
|
+
<span class="label">{{ 'REMOVE' | localize }}</span>
|
|
1371
|
+
</div>
|
|
1372
|
+
<div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
|
|
1373
|
+
class="rp-item-context-menu-item">
|
|
1374
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons"
|
|
1375
|
+
[textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
|
|
1376
|
+
<span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
|
|
1377
|
+
</div>
|
|
1378
|
+
</div>
|
|
1379
|
+
</rp-item-context-menu>
|
|
1385
1380
|
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1381
|
+
<ng-template #toolbarIconLibrary>
|
|
1382
|
+
<rp-toolbar-icon
|
|
1383
|
+
*ngIf="!phoneSizeScreen"
|
|
1384
|
+
[disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
|
|
1385
|
+
matIcon="home"
|
|
1386
|
+
tooltip="{{iconName.Architecture | localize}}"
|
|
1387
|
+
(onClick)="showLibraryCategories()"
|
|
1388
|
+
[showLabel]="phoneSizeScreen"
|
|
1389
|
+
></rp-toolbar-icon>
|
|
1390
|
+
</ng-template>
|
|
1395
1391
|
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
></rp-toolbar-icon>
|
|
1406
|
-
</ng-template>
|
|
1392
|
+
<ng-template #toolbarIconAccessoires>
|
|
1393
|
+
<rp-toolbar-icon
|
|
1394
|
+
[disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
|
|
1395
|
+
matIcon="local_florist"
|
|
1396
|
+
tooltip="{{iconName.Accessories | localize}}"
|
|
1397
|
+
(onClick)="showAccessoireCategories()"
|
|
1398
|
+
[showLabel]="phoneSizeScreen"
|
|
1399
|
+
></rp-toolbar-icon>
|
|
1400
|
+
</ng-template>
|
|
1407
1401
|
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1402
|
+
<ng-template #toolbarIcon2dView>
|
|
1403
|
+
<span class="toolbar__divider"></span>
|
|
1404
|
+
<rp-toolbar-icon
|
|
1405
|
+
*ngIf="!phoneSizeScreen"
|
|
1406
|
+
svgIcon="cube-unfolded"
|
|
1407
|
+
tooltip="{{iconName.TwodFloorplan | localize}}"
|
|
1408
|
+
[disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
|
|
1409
|
+
(onClick)="updateMode(viewModes.FloorPlan2D, true)"
|
|
1410
|
+
[showLabel]="phoneSizeScreen"
|
|
1411
|
+
></rp-toolbar-icon>
|
|
1412
|
+
</ng-template>
|
|
1417
1413
|
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1414
|
+
<ng-template #toolbarIcon3dView>
|
|
1415
|
+
<rp-toolbar-icon
|
|
1416
|
+
svgIcon="cube-outline"
|
|
1417
|
+
tooltip="{{iconName.ThreedRoomplan | localize}}"
|
|
1418
|
+
[disabled]="viewModeService.is3dViewActive()"
|
|
1419
|
+
(onClick)="updateMode(viewModes.RoomPlan3D, true)"
|
|
1420
|
+
[showLabel]="phoneSizeScreen"
|
|
1421
|
+
></rp-toolbar-icon>
|
|
1422
|
+
</ng-template>
|
|
1424
1423
|
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
[showLabel]="phoneSizeScreen"
|
|
1432
|
-
></rp-toolbar-icon>
|
|
1433
|
-
</ng-template>
|
|
1424
|
+
<rp-zoom-controls
|
|
1425
|
+
[visible]="viewModeService.is2dViewActive()"
|
|
1426
|
+
(onZoomIn)="zoomIn()"
|
|
1427
|
+
(onZoomReset)="zoomReset()"
|
|
1428
|
+
(onZoomOut)="zoomOut()"
|
|
1429
|
+
></rp-zoom-controls>
|
|
1434
1430
|
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1431
|
+
<ng-template #toolbarIconSettings>
|
|
1432
|
+
<span class="toolbar__divider"></span>
|
|
1433
|
+
<rp-toolbar-icon
|
|
1434
|
+
matIcon="settings"
|
|
1435
|
+
tooltip="{{iconName.Settings | localize}}"
|
|
1436
|
+
(onClick)="showSettings()"
|
|
1437
|
+
[showLabel]="phoneSizeScreen"
|
|
1438
|
+
></rp-toolbar-icon>
|
|
1439
|
+
</ng-template>
|
|
1444
1440
|
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
<ng-template #toolbarIconCart>
|
|
1455
|
-
<span class="toolbar__divider"></span>
|
|
1456
|
-
<rp-toolbar-icon class="add-to-cart-button"
|
|
1457
|
-
svgIcon="cart-shopping-regular"
|
|
1458
|
-
tooltip="{{'ADD_TO_CART' | localize}}"
|
|
1459
|
-
(onClick)="addAllToCart()"
|
|
1460
|
-
[showLabel]="phoneSizeScreen"
|
|
1461
|
-
></rp-toolbar-icon>
|
|
1462
|
-
<span class="toolbar__divider"></span>
|
|
1463
|
-
</ng-template>
|
|
1441
|
+
<ng-template #toolbarIconFaq>
|
|
1442
|
+
<rp-toolbar-icon
|
|
1443
|
+
*ngIf="showFaq()"
|
|
1444
|
+
matIcon="help"
|
|
1445
|
+
tooltip="{{iconName.Faq | localize}}"
|
|
1446
|
+
(onClick)="openFaq(this.settingsService.settings.faqUrl)"
|
|
1447
|
+
[showLabel]="phoneSizeScreen"
|
|
1448
|
+
></rp-toolbar-icon>
|
|
1449
|
+
</ng-template>
|
|
1464
1450
|
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1451
|
+
<ng-template #toolbarIconFeedback>
|
|
1452
|
+
<rp-toolbar-icon
|
|
1453
|
+
*ngIf="showFeedback()"
|
|
1454
|
+
matIcon="chat_bubble"
|
|
1455
|
+
tooltip="{{iconName.Feedback | localize}}"
|
|
1456
|
+
(onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
|
|
1457
|
+
[showLabel]="phoneSizeScreen"
|
|
1458
|
+
></rp-toolbar-icon>
|
|
1459
|
+
</ng-template>
|
|
1460
|
+
<ng-template #toolbarIconCart>
|
|
1461
|
+
<span class="toolbar__divider"></span>
|
|
1462
|
+
<rp-toolbar-icon class="add-to-cart-button"
|
|
1463
|
+
svgIcon="cart-shopping-regular"
|
|
1464
|
+
tooltip="{{'ADD_TO_CART' | localize}}"
|
|
1465
|
+
(onClick)="addAllToCart()"
|
|
1466
|
+
[showLabel]="phoneSizeScreen"
|
|
1467
|
+
></rp-toolbar-icon>
|
|
1468
|
+
<span class="toolbar__divider"></span>
|
|
1469
|
+
</ng-template>
|
|
1476
1470
|
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
</
|
|
1471
|
+
<ng-template #settingsSidebar>
|
|
1472
|
+
<header class="drawer__header">
|
|
1473
|
+
<h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
|
|
1474
|
+
</header>
|
|
1475
|
+
<rp-settings
|
|
1476
|
+
[placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
|
|
1477
|
+
[minWallHeight]="getMinGlobalWallHeight()"
|
|
1478
|
+
(onWallsHeightUpdate)="wallsHeightUpdated($event)"
|
|
1479
|
+
>
|
|
1480
|
+
</rp-settings>
|
|
1481
|
+
</ng-template>
|
|
1487
1482
|
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1483
|
+
<ng-template #categoriesSidebar>
|
|
1484
|
+
<header class="drawer__header">
|
|
1485
|
+
<h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
|
|
1486
|
+
</header>
|
|
1487
|
+
<rp-category-library
|
|
1488
|
+
[categories]="categories"
|
|
1489
|
+
(categoryClick)="showLibraryCategory($event)"
|
|
1490
|
+
>
|
|
1491
|
+
</rp-category-library>
|
|
1492
|
+
</ng-template>
|
|
1498
1493
|
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1494
|
+
<ng-template #accessoiresCategoriesSidebar>
|
|
1495
|
+
<header class="drawer__header">
|
|
1496
|
+
<h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
|
|
1497
|
+
</header>
|
|
1498
|
+
<rp-category-library
|
|
1499
|
+
[categories]="accessoireCategories"
|
|
1500
|
+
(categoryClick)="showLibraryCategory($event)"
|
|
1501
|
+
>
|
|
1502
|
+
</rp-category-library>
|
|
1503
|
+
</ng-template>
|
|
1505
1504
|
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1505
|
+
<ng-template #customShapeCreatorSideBar>
|
|
1506
|
+
<header class="drawer__header">
|
|
1507
|
+
<h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
|
|
1508
|
+
</header>
|
|
1509
|
+
<rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
|
|
1510
|
+
</ng-template>
|
|
1512
1511
|
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
<h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
|
|
1520
|
-
</header>
|
|
1521
|
-
<p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
|
|
1522
|
-
<section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
|
|
1523
|
-
<ng-container *ngIf="hasCustomObjects()">
|
|
1524
|
-
<h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
|
|
1525
|
-
<rp-object-library
|
|
1526
|
-
[objects]="customObjects"
|
|
1527
|
-
(setDragged)="setDragged($event)"
|
|
1528
|
-
(releaseDragged)="releaseDragged()"
|
|
1529
|
-
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1530
|
-
>
|
|
1531
|
-
</rp-object-library>
|
|
1532
|
-
<mat-divider></mat-divider>
|
|
1533
|
-
</ng-container>
|
|
1534
|
-
<ng-container *ngIf="libraryObjects?.length > 0">
|
|
1535
|
-
<h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
|
|
1536
|
-
<rp-object-library
|
|
1537
|
-
[objects]="libraryObjects"
|
|
1538
|
-
(setDragged)="setDragged($event)"
|
|
1539
|
-
(releaseDragged)="releaseDragged()"
|
|
1540
|
-
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1541
|
-
>
|
|
1542
|
-
</rp-object-library>
|
|
1543
|
-
</ng-container>
|
|
1544
|
-
</section>
|
|
1545
|
-
</div>
|
|
1546
|
-
</ng-template>
|
|
1512
|
+
<ng-template #customCylinderCreatorSideBar>
|
|
1513
|
+
<header class="drawer__header">
|
|
1514
|
+
<h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
|
|
1515
|
+
</header>
|
|
1516
|
+
<custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
|
|
1517
|
+
</ng-template>
|
|
1547
1518
|
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1519
|
+
<ng-template #librarySidebar>
|
|
1520
|
+
<div fxLayout="column" class="with-scrollable-section">
|
|
1521
|
+
<header class="drawer__header">
|
|
1522
|
+
<button mat-icon-button (click)="showActiveCategorySidebar()">
|
|
1523
|
+
<mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
|
|
1524
|
+
</button>
|
|
1525
|
+
<h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
|
|
1526
|
+
</header>
|
|
1527
|
+
<p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
|
|
1528
|
+
<section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
|
|
1529
|
+
<ng-container *ngIf="hasCustomObjects()">
|
|
1530
|
+
<h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
|
|
1531
|
+
<rp-object-library
|
|
1532
|
+
[objects]="customObjects"
|
|
1533
|
+
(setDragged)="setDragged($event)"
|
|
1534
|
+
(releaseDragged)="releaseDragged()"
|
|
1535
|
+
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1536
|
+
>
|
|
1537
|
+
</rp-object-library>
|
|
1538
|
+
<mat-divider></mat-divider>
|
|
1539
|
+
</ng-container>
|
|
1540
|
+
<ng-container *ngIf="libraryObjects?.length > 0">
|
|
1541
|
+
<h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
|
|
1542
|
+
<rp-object-library
|
|
1543
|
+
[objects]="libraryObjects"
|
|
1544
|
+
(setDragged)="setDragged($event)"
|
|
1545
|
+
(releaseDragged)="releaseDragged()"
|
|
1546
|
+
(onObjectClick)="onObjectLibraryClick($event)"
|
|
1547
|
+
>
|
|
1548
|
+
</rp-object-library>
|
|
1549
|
+
</ng-container>
|
|
1550
|
+
</section>
|
|
1551
|
+
</div>
|
|
1552
|
+
</ng-template>
|
|
1558
1553
|
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
[maxWallLength]="maxWallLength"
|
|
1570
|
-
[minWallLength]="minWallLength"
|
|
1571
|
-
(remove)="removeWall($event)"
|
|
1572
|
-
(setLength)="setWallLength($event)"
|
|
1573
|
-
(setHeight)="setWallHeight($event)"
|
|
1574
|
-
(setThickness)="setWallThickness($event)"
|
|
1575
|
-
(selectCorner)="selectCorner($event)"
|
|
1576
|
-
(setTexture)="setWallTexture($event)"
|
|
1577
|
-
(setColor)="setWallColor($event)"
|
|
1578
|
-
>
|
|
1579
|
-
</rp-selected-wall>
|
|
1580
|
-
</ng-template>
|
|
1554
|
+
<ng-template #selectedObjectSidebar>
|
|
1555
|
+
<header class="drawer__header">
|
|
1556
|
+
<h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
|
|
1557
|
+
</header>
|
|
1558
|
+
<rp-selected-object
|
|
1559
|
+
[object]="selectedObject"
|
|
1560
|
+
(onSelectedObjectChange)="updateSelectedObjectHud()"
|
|
1561
|
+
>
|
|
1562
|
+
</rp-selected-object>
|
|
1563
|
+
</ng-template>
|
|
1581
1564
|
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1565
|
+
<ng-template #selectedWallSidebar>
|
|
1566
|
+
<header class="drawer__header">
|
|
1567
|
+
<h2 class="mat-title">{{ 'WALL'| localize }}</h2>
|
|
1568
|
+
</header>
|
|
1569
|
+
<rp-selected-wall
|
|
1570
|
+
[wall]="selectedWall"
|
|
1571
|
+
[texturePlane]="selectedEdges[0]"
|
|
1572
|
+
[minWallHeight]="getMinWallHeight(selectedWall)"
|
|
1573
|
+
[maxWallHeight]="maxWallHeight"
|
|
1574
|
+
[maxWallThickness]="maxWallThickness"
|
|
1575
|
+
[maxWallLength]="maxWallLength"
|
|
1576
|
+
[minWallLength]="minWallLength"
|
|
1577
|
+
(remove)="removeWall($event)"
|
|
1578
|
+
(setLength)="setWallLength($event)"
|
|
1579
|
+
(setHeight)="setWallHeight($event)"
|
|
1580
|
+
(setThickness)="setWallThickness($event)"
|
|
1581
|
+
(selectCorner)="selectCorner($event)"
|
|
1582
|
+
(setTexture)="setWallTexture($event)"
|
|
1583
|
+
(setColor)="setWallColor($event)"
|
|
1584
|
+
>
|
|
1585
|
+
</rp-selected-wall>
|
|
1586
|
+
</ng-template>
|
|
1595
1587
|
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1588
|
+
<ng-template #selectedThreedObjectSidebar>
|
|
1589
|
+
<header class="drawer__header">
|
|
1590
|
+
<h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
|
|
1591
|
+
</header>
|
|
1592
|
+
<rp-selected-threed-object
|
|
1593
|
+
[object]="selectedObject"
|
|
1594
|
+
[showCopy]="showCopyButton"
|
|
1595
|
+
[showDelete]="showDeleteButton"
|
|
1596
|
+
[showLock]="showLockButton"
|
|
1597
|
+
(onSelectedObjectChange)="updateSelectedObjectHud()"
|
|
1598
|
+
>
|
|
1599
|
+
</rp-selected-threed-object>
|
|
1600
|
+
</ng-template>
|
|
1607
1601
|
|
|
1602
|
+
<ng-template #selectedFloorSidebar>
|
|
1603
|
+
<h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
|
|
1604
|
+
<rp-selected-floor
|
|
1605
|
+
[floor]="selectedFloor"
|
|
1606
|
+
[texturePlane]="selectedFloor"
|
|
1607
|
+
(setTexture)="setFloorTexture($event)"
|
|
1608
|
+
(setColor)="setFloorColor($event)"
|
|
1609
|
+
(selectedFloorClosed)="selectedFloor = undefined"
|
|
1610
|
+
>
|
|
1611
|
+
</rp-selected-floor>
|
|
1612
|
+
</ng-template>
|
|
1608
1613
|
|
|
1614
|
+
<ng-container *ngIf="userIsGrouping">
|
|
1609
1615
|
<div class="rp-item-context-menu-wrap mrp-save-grouping" *ngIf="userIsGrouping">
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1616
|
+
<div class="rp-item-context-menu-item" (click)="onGroupClick()">
|
|
1617
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
|
|
1618
|
+
<span class="label">{{ 'GROUPING' | localize }}</span>
|
|
1619
|
+
</div>
|
|
1620
|
+
<div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
|
|
1621
|
+
<span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
|
|
1622
|
+
<span class="label">{{ 'CANCEL' | localize }}</span>
|
|
1623
|
+
</div>
|
|
1618
1624
|
</div>
|
|
1625
|
+
</ng-container>
|
|
1626
|
+
|
|
1619
1627
|
`,
|
|
1620
1628
|
styleUrls: ['./room-planner.component.scss'] /*,
|
|
1621
1629
|
changeDetection: ChangeDetectionStrategy.OnPush*/
|
|
@@ -1692,4 +1700,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
1692
1700
|
type: HostListener,
|
|
1693
1701
|
args: ['document:keydown', ['$event']]
|
|
1694
1702
|
}] } });
|
|
1695
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vbS1wbGFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvcm9vbS1wbGFubmVyL3Jvb20tcGxhbm5lci9yb29tLXBsYW5uZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFckMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHM0QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsVUFBVSxFQUNYLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQixVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBb0J4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFJakUsT0FBTyxFQUFD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LDhCQUE4QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDWCxlQUFlO3NCQUE1RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDQyxjQUFjO3NCQUExRCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDUyxxQkFBcUI7c0JBQXhFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNBLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ1UsMkJBQTJCO3NCQUFwRixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDTCxvQkFBb0I7c0JBQXRFLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNKLGNBQWM7c0JBQTFELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNPLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0YsZUFBZTtzQkFBNUQsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRXRCLFVBQVU7c0JBQS9CLFdBQVc7dUJBQUMsT0FBTztnQkFDWCxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBa0ZBLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7RXVsZXIsIFZlY3RvcjN9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uLy4uL3BsdWdpbi1pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhbm5lckNvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvZmxvb3JwbGFubmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SWNvbkVudW19IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9pY29uLmVudW0nO1xyXG5pbXBvcnQge0ljb25OYW1lfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1RocmVlZE1vZGVsfSBmcm9tICcuLi8uLi9jb3JlM2QvbW9kZWwvdGhyZWVkLW1vZGVsJztcclxuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jYXRlZ29yeSc7XHJcbmltcG9ydCB7XHJcbiAgaXNDdXN0b21DeWxpbmRlclR5cGUsXHJcbiAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVXYWxsVHlwZSxcclxuICBpc0Z1cm5pdHVyZVR5cGUsXHJcbiAgaXNXYWxsVHlwZVxyXG59IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtDb3JuZXIsIEhhbGZFZGdlLCBJbldhbGxJdGVtLCBSb29tLCBXYWxsLCBXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tZ3JvdXAnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ZpZXctbW9kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNb2RlbHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9tb2RlbHMuc2VydmljZSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAuc2VydmljZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUFuYWx5c2lzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NjcmVlbi1zaXplLWFuYWx5c2lzL3NjcmVlbi1zaXplLWFuYWx5c2lzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhblNlcnZpY2V9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2UvZmxvb3JwbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb29ycGxhbm5lci9zZXJ2aWNlL3Jvb20uc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJpYWxpemF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2l0ZW0tc2VyaWFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9saWdodHMuc2VydmljZSc7XHJcbmltcG9ydCB7QXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9hci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb25maWd1cmF0aW9uS2V5fSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vY29uZmlndXJhdGlvbi1rZXkuZW51bSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0ZWRXYWxsRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLXdhbGwtZXZlbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtTZWxlY3RlZEZsb29yRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLWZsb29yLWV2ZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUluZm99IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zY3JlZW4tc2l6ZS1hbmFseXNpcy9zY3JlZW4tc2l6ZS1pbmZvJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZUZsb29ySXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1zaGFwZS1mbG9vci1pdGVtJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZVdhbGxJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLXNoYXBlLXdhbGwtaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJGbG9vckl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20tY3lsaW5kZXItZmxvb3ItaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1jeWxpbmRlci13YWxsLWl0ZW0nO1xyXG5pbXBvcnQge0RyYWdnZWREYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL2RyYWdnZWQtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RleHR1cmV9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdGV4dHVyZSc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9pbnRlcmZhY2UvbW9kZWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtLZXl9IGZyb20gJy4uL2NvbnN0L2tleSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mbG9vci1wbGFuZS1pdGVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nb29nbGUtdGFnLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7UGVybWFuZW50U3RvcmVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvcGVybWFuZW50LXN0b3JlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0N1c3RvbUJ1dHRvbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jdXN0b20tYnV0dG9uJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0V4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZX0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvaW50ZXJmYWNlL2V4dGVybmFsLXNvdXJjZS1hcnRpY2xlLWFkZC5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdycC1yb29tLXBsYW5uZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJSb29tUGxhbm5lclwiPlxyXG4gICAgICAgICAgPGZsb29yLXBsYW5uZXJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRXYWxsQ2hhbmdlKT1cInNlbGVjdFdhbGwoJGV2ZW50KVwiPjwvZmxvb3ItcGxhbm5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgICAgICAgW29wZW5Nb3VzZUV2ZW50XT1cImNvbnRleHRNZW51TW91c2VFdmVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXAgXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCIgc3ZnSWNvbj1cIm1hZ2ljLXdhbmRcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNlbGVjdGVkRmxvb3JcIlxyXG4gICAgICAgICAgICAgIFtvcGVuTW91c2VFdmVudF09XCJjb250ZXh0TWVudU1vdXNlRXZlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2hvd1NlbGVjdGVkRmxvb3JTaWRlYmFyKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3JwLWNvbnRleHQtbWVudT5cclxuXHJcbiAgICAgIDxycC1pdGVtLWNvbnRleHQtbWVudVxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiAhc2hvd0dyb3VwTWVudVwiXHJcbiAgICAgICAgICAgICAgW2l0ZW1dPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgIChkZWxldGVQcmVzc2VkKT1cImhhbmRsZURlbGV0ZU9iamVjdCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1jbG9zZVwiIChjbGljayk9XCJjbG9zZUNvbnRleHRNZW51KClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZS1pY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNsb3NlPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRoaXMuc2VsZWN0ZWRPYmplY3RcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8cD57eyB0aGlzLnNlbGVjdGVkT2JqZWN0Lm5hbWUgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiIChjbGljayk9XCJzaG93U2VsZWN0ZWRPYmplY3RTaWRlYmFyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCIgc3ZnSWNvbj1cIm1hZ2ljLXdhbmRcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDb25maWd1cmF0aW9uQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGN1c3RvbUJ1dHRvbiBvZiBtb2RlbHNTZXJ2aWNlLmN1c3RvbUJ1dHRvbnNcIiAoY2xpY2spPVwiaGFuZGxlQ29uZmlndXJhdGlvbkJ1dHRvbkNsaWNrKGN1c3RvbUJ1dHRvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxjby1pY29uIFtpY29uRGF0YV09XCJpY29uU2VydmljZS5nZXRJY29uKGljb24uTWFnaWNXYW5kKVwiPjwvY28taWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb3B5QnV0dG9uXCIgKGNsaWNrKT1cImNvcHlTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5maWxlX2NvcHk8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT1BZJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkT2JqZWN0KClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmRlbGV0ZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ1JFTU9WRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbmZpZ3VyYXRpb25CdXR0b25cIiAoY2xpY2spPVwic2hvd1NlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcigpXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+c2V0dGluZ3M8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvY2tCdXR0b24gJiYgc2VsZWN0ZWRPYmplY3RcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBbdGV4dENvbnRlbnRdPVwic2VsZWN0ZWRPYmplY3QubG9ja2VkID8gJ2xvY2snIDogJ2xvY2tfb3BlbidcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IChzZWxlY3RlZE9iamVjdC5sb2NrZWQgPyAnVU5MT0NLJyA6ICdMT0NLJykgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJzdGFydEdyb3VwU2VsZWN0aW9uKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdHUk9VUCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb252ZXJzaW9uQnV0dG9uICYmIHNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zaG93Q29udmVyc2lvbkJ1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRDb252ZXJzaW9uVG9UYWdNYW5hZ2VyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFkZFNlbGVjdGVkQ2xhc3MgPyAnY29udmVyc2lvbi1idXR0b24tc2VsZWN0ZWQnIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmFkZF9zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09OVkVSU0lPTicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGljb24tc2VsZWN0ZWRcIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FSQnV0dG9uXCIgKGNsaWNrKT1cInN0YXJ0QVJTZXNzaW9uKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPndlZWtlbmQ8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBUicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uLWVsZXZhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZE9iamVjdCAmJiBzZWxlY3RlZE9iamVjdC5lbGV2YXRpb25BZGp1c3RhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCI+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24tZWxldmF0aW9uPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzYWxhYmxlT2JqZWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlciBjb250ZXh0LW1lbnVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImFkZFRvQ2FydChzZWxlY3RlZE9iamVjdClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gYWRkLXRvLWNhcnQtYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIFtzdmdJY29uXT1cIidjYXJ0LXNob3BwaW5nLXJlZ3VsYXInXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBRERfVE9fQ0FSVCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8cnAtaXRlbS1jb250ZXh0LW1lbnUgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNob3dHcm91cE1lbnUgJiYgIXVzZXJJc0dyb3VwaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGVQcmVzc2VkKT1cImhhbmRsZURlbGV0ZU9iamVjdCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5saW5rPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvblVuR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5saW5rX29mZjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ1VOR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJyZW1vdmVTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5kZWxldGU8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdSRU1PVkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dMb2NrQnV0dG9uICYmIHNlbGVjdGVkT2JqZWN0ICYmIHNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJ0b2dnbGVMb2NrU2VsZWN0ZWRPYmplY3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIFt0ZXh0Q29udGVudF09XCJzZWxlY3RlZE9iamVjdC5sb2NrZWQgPyAnbG9jaycgOiAnbG9ja19vcGVuJ1wiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uTGlicmFyeT5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHZpZXdNb2RlU2VydmljZS5pc1dhbGtUaHJvdWdoVmlld0FjdGl2ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgbWF0SWNvbj1cImhvbWVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5BcmNoaXRlY3R1cmUgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yaWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uQWNjZXNzb2lyZXM+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCB2aWV3TW9kZVNlcnZpY2UuaXNXYWxrVGhyb3VnaFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdEljb249XCJsb2NhbF9mbG9yaXN0XCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuQWNjZXNzb3JpZXMgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2hvd0FjY2Vzc29pcmVDYXRlZ29yaWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uMmRWaWV3PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyX19kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgICAgICAgICBzdmdJY29uPVwiY3ViZS11bmZvbGRlZFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlR3b2RGbG9vcnBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8ICFkZXNrdG9wU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInVwZGF0ZU1vZGUodmlld01vZGVzLkZsb29yUGxhbjJELCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb24zZFZpZXc+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIHN2Z0ljb249XCJjdWJlLW91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5UaHJlZWRSb29tcGxhbiB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzM2RWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJ1cGRhdGVNb2RlKHZpZXdNb2Rlcy5Sb29tUGxhbjNELCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxycC16b29tLWNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgW3Zpc2libGVdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgIChvblpvb21Jbik9XCJ6b29tSW4oKVwiXHJcbiAgICAgICAgICAgICAgKG9uWm9vbVJlc2V0KT1cInpvb21SZXNldCgpXCJcclxuICAgICAgICAgICAgICAob25ab29tT3V0KT1cInpvb21PdXQoKVwiXHJcbiAgICAgID48L3JwLXpvb20tY29udHJvbHM+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uU2V0dGluZ3M+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXJfX2RpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIG1hdEljb249XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlNldHRpbmdzIHwgbG9jYWxpemV9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNob3dTZXR0aW5ncygpXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZhcT5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RmFxKClcIlxyXG4gICAgICAgICAgICAgICAgICBtYXRJY29uPVwiaGVscFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLkZhcSB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvcGVuRmFxKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZhcVVybClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uRmVlZGJhY2s+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0ZlZWRiYWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICBtYXRJY29uPVwiY2hhdF9idWJibGVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5GZWVkYmFjayB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvcGVuRmVlZGJhY2sodGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwpXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uQ2FydD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb24gY2xhc3M9XCJhZGQtdG8tY2FydC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBzdmdJY29uPVwiY2FydC1zaG9wcGluZy1yZWd1bGFyXCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7J0FERF9UT19DQVJUJyB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRBbGxUb0NhcnQoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2V0dGluZ3NTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1NFVFRJTkdTJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgPHJwLXNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZUNhbWVyYURpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IGl0ZW1TZXJ2aWNlLmdldFdhbGt0aHJvdWdoQ2FtZXJhKClcIlxyXG4gICAgICAgICAgICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KClcIlxyXG4gICAgICAgICAgICAgICAgICAob25XYWxsc0hlaWdodFVwZGF0ZSk9XCJ3YWxsc0hlaWdodFVwZGF0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3JwLXNldHRpbmdzPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNjYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdBUkNISVRFQ1RVUkUnIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICA8cnAtY2F0ZWdvcnktbGlicmFyeVxyXG4gICAgICAgICAgICAgICAgICBbY2F0ZWdvcmllc109XCJjYXRlZ29yaWVzXCJcclxuICAgICAgICAgICAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtY2F0ZWdvcnktbGlicmFyeT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdBQ0NFU1NPSVJFUycgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgICAgICAgICAgIFtjYXRlZ29yaWVzXT1cImFjY2Vzc29pcmVDYXRlZ29yaWVzXCJcclxuICAgICAgICAgICAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtY2F0ZWdvcnktbGlicmFyeT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdDVVNUT01fU0hBUEVfQ1JFQVRPUicgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1jdXN0b20tc2hhcGUtY3JlYXRvciBbc2hhcGVdPVwic2VsZWN0ZWRPYmplY3RcIj48L3JwLWN1c3RvbS1zaGFwZS1jcmVhdG9yPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0NVU1RPTV9TSEFQRV9DUkVBVE9SJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgPGN1c3RvbS1jeWxpbmRlci1jcmVhdG9yIFtzaGFwZV09XCJzZWxlY3RlZE9iamVjdFwiPjwvY3VzdG9tLWN5bGluZGVyLWNyZWF0b3I+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xpYnJhcnlTaWRlYmFyPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwid2l0aC1zY3JvbGxhYmxlLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNob3dBY3RpdmVDYXRlZ29yeVNpZGViYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmFycm93X2JhY2tfaW9zPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnkubmFtZSB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5LmRlc2NyaXB0aW9uXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeS5kZXNjcmlwdGlvbiB8IGxvY2FsaXplIH19PC9wPlxyXG4gICAgICAgICAgICAgIDxzZWN0aW9uIGZ4RmxleD1cImdyb3dcIiAqbmdJZj1cImxpYnJhcnlPYmplY3RzPy5sZW5ndGggPiAwIHx8IGhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQ3VzdG9tT2JqZWN0cygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0yXCI+e3sgJ0NVU1RPTScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cnAtb2JqZWN0LWxpYnJhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29iamVjdHNdPVwiY3VzdG9tT2JqZWN0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxlYXNlRHJhZ2dlZCk9XCJyZWxlYXNlRHJhZ2dlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uT2JqZWN0Q2xpY2spPVwib25PYmplY3RMaWJyYXJ5Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3JwLW9iamVjdC1saWJyYXJ5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlicmFyeU9iamVjdHM/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTJcIj57eyAnTElCUkFSWScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cnAtb2JqZWN0LWxpYnJhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29iamVjdHNdPVwibGlicmFyeU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0RHJhZ2dlZCk9XCJzZXREcmFnZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsZWFzZURyYWdnZWQpPVwicmVsZWFzZURyYWdnZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9ycC1vYmplY3QtbGlicmFyeT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkT2JqZWN0U2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdPQkpFQ1QnIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICA8cnAtc2VsZWN0ZWQtb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RdPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICAob25TZWxlY3RlZE9iamVjdENoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE9iamVjdEh1ZCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtc2VsZWN0ZWQtb2JqZWN0PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RlZFdhbGxTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1dBTEwnfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC13YWxsXHJcbiAgICAgICAgICAgICAgICAgIFt3YWxsXT1cInNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0dXJlUGxhbmVdPVwic2VsZWN0ZWRFZGdlc1swXVwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5XYWxsSGVpZ2h0XT1cImdldE1pbldhbGxIZWlnaHQoc2VsZWN0ZWRXYWxsKVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhXYWxsSGVpZ2h0XT1cIm1heFdhbGxIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbbWF4V2FsbFRoaWNrbmVzc109XCJtYXhXYWxsVGhpY2tuZXNzXCJcclxuICAgICAgICAgICAgICAgICAgW21heFdhbGxMZW5ndGhdPVwibWF4V2FsbExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5XYWxsTGVuZ3RoXT1cIm1pbldhbGxMZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZVdhbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZXRMZW5ndGgpPVwic2V0V2FsbExlbmd0aCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldEhlaWdodCk9XCJzZXRXYWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2V0VGhpY2tuZXNzKT1cInNldFdhbGxUaGlja25lc3MoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RDb3JuZXIpPVwic2VsZWN0Q29ybmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRXYWxsVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldENvbG9yKT1cInNldFdhbGxDb2xvcigkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtc2VsZWN0ZWQtd2FsbD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCIgW3RleHRDb250ZW50XT1cIidTRVRUSU5HUycgfCBsb2NhbGl6ZVwiPjwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC10aHJlZWQtb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RdPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0NvcHldPVwic2hvd0NvcHlCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0RlbGV0ZV09XCJzaG93RGVsZXRlQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMb2NrXT1cInNob3dMb2NrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3JwLXNlbGVjdGVkLXRocmVlZC1vYmplY3Q+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkRmxvb3JTaWRlYmFyPlxyXG4gICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0ZMT09SJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC1mbG9vclxyXG4gICAgICAgICAgICAgICAgICBbZmxvb3JdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0dXJlUGxhbmVdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgICAgICAgICAgIChzZXRUZXh0dXJlKT1cInNldEZsb29yVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldENvbG9yKT1cInNldEZsb29yQ29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZsb29yQ2xvc2VkKT1cInNlbGVjdGVkRmxvb3IgPSB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9ycC1zZWxlY3RlZC1mbG9vcj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcCBtcnAtc2F2ZS1ncm91cGluZ1wiICpuZ0lmPVwidXNlcklzR3JvdXBpbmdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNoZWNrPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdHUk9VUElORycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwiY2FuY2VsR3JvdXBTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5jYW5jZWw8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NBTkNFTCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlVXJsczogWycuL3Jvb20tcGxhbm5lci5jb21wb25lbnQuc2NzcyddLyosXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gqL1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUm9vbVBsYW5uZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgUGx1Z2luSW50ZXJmYWNlIHtcclxuICBAVmlld0NoaWxkKEZsb29ycGxhbm5lckNvbXBvbmVudCwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgcHVibGljIGZsb29ycGxhbm5lcjogRmxvb3JwbGFubmVyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uTGlicmFyeScsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkxpYnJhcnk6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25BY2Nlc3NvaXJlcycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkFjY2Vzc29pcmVzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uU2V0dGluZ3MnLCB7c3RhdGljOiB0cnVlfSkgdG9vbGJhckljb25TZXR0aW5nczogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbjJkVmlldycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbjJkVmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbjNkVmlldycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbjNkVmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yaWVzU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBjYXRlZ29yaWVzU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdhY2Nlc3NvaXJlc0NhdGVnb3JpZXNTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcicsIHtzdGF0aWM6IHRydWV9KSBjdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUN5bGluZGVyQ3JlYXRvclNpZGVCYXInLCB7c3RhdGljOiB0cnVlfSkgY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZXR0aW5nc1NpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgc2V0dGluZ3NTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2xpYnJhcnlTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGxpYnJhcnlTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkT2JqZWN0U2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZE9iamVjdFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRXYWxsU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZFdhbGxTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRGbG9vclNpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgc2VsZWN0ZWRGbG9vclNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25GYXEnLCB7c3RhdGljOiB0cnVlfSkgdG9vbGJhckljb25GYXE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25GZWVkYmFjaycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkZlZWRiYWNrOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uQ2FydCcsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkNhcnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBsYXllckNsYXNzID0gJ2xheWVyJztcclxuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBkb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzaG93UGx1Z2luID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzQ29udHJvbHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBpY29uOiB0eXBlb2YgSWNvbkVudW0gPSBJY29uRW51bTtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWNvbk5hbWU6IHR5cGVvZiBJY29uTmFtZSA9IEljb25OYW1lO1xyXG4gIHB1YmxpYyByZWFkb25seSB2aWV3TW9kZXM6IHR5cGVvZiBWaWV3TW9kZSA9IFZpZXdNb2RlO1xyXG5cclxuICBvYmplY3RzOiBUaHJlZWRNb2RlbFtdO1xyXG4gIGN1c3RvbU9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgbGlicmFyeU9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgY2F0ZWdvcmllczogQ2F0ZWdvcnlbXTtcclxuICBhY2Nlc3NvaXJlQ2F0ZWdvcmllczogQ2F0ZWdvcnlbXTtcclxuICBzZWxlY3RlZENhdGVnb3J5OiBDYXRlZ29yeTtcclxuICBzaG93Q29udGV4dE1lbnU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBzZWxlY3RlZFdhbGw6IFdhbGw7XHJcbiAgc2VsZWN0ZWRFZGdlOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRGbG9vcjogRmxvb3JQbGFuZUl0ZW07XHJcbiAgc2VsZWN0ZWRSb29tOiBSb29tO1xyXG4gIHNlbGVjdGVkT2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwO1xyXG5cclxuICBwdWJsaWMgd2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkID0gdHJ1ZTtcclxuICBwdWJsaWMgbWF4V2FsbEhlaWdodDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtYXhXYWxsVGhpY2tuZXNzOiBudW1iZXI7XHJcbiAgcHVibGljIG1heFdhbGxMZW5ndGg6IG51bWJlcjtcclxuICBwdWJsaWMgbWluV2FsbExlbmd0aDogbnVtYmVyO1xyXG4gIHB1YmxpYyBkZXNrdG9wU2l6ZVNjcmVlbjogYm9vbGVhbjtcclxuICBwdWJsaWMgdGFibGV0U2l6ZVNjcmVlbjogYm9vbGVhbjtcclxuICBwdWJsaWMgcGhvbmVTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyBjb250ZXh0TWVudU1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XHJcbiAgcHVibGljIHNob3dTZXR0aW5nc0J1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0NvbmZpZ3VyYXRpb25CdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dEZWxldGVCdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dMb2NrQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgc2hvd0FSQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgc2hvd0NvcHlCdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dHcm91cE1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dJY29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHVzZXJJc0dyb3VwaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dDb252ZXJzaW9uQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGFkZFNlbGVjdGVkQ2xhc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2FsYWJsZU9iamVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHByaXZhdGUgX21vZGUgPSBWaWV3TW9kZS5Sb29tUGxhbjNEO1xyXG4gIHByaXZhdGUgX2NhdGFsb2dJc1Nob3duOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2Jsb2NrTGVmdFNpZGVCYXIgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaWNvblNlcnZpY2U6IEhvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIHZpZXdNb2RlU2VydmljZTogVmlld01vZGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIG1vZGVsc1NlcnZpY2U6IE1vZGVsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcmVzZXRzU2VydmljZTogUHJlc2V0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjcmVlbkFuYWx5c2lzOiBTY3JlZW5TaXplQW5hbHlzaXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Zsb29ycGxhblNlcnZpY2U6IEZsb29ycGxhblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h1ZFNlcnZpY2U6IEh1ZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcmlhbGl6YXRpb25TZXJ2aWNlOiBJdGVtU2VyaWFsaXphdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9saWdodHNTZXJ2aWNlOiBMaWdodHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXJTZXJ2aWNlOiBBclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHVibGljIHNldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dvb2dsZVRhZ01hbmFnZXI6IEdvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGVybWFuZW50U3RvcmVTZXJ2aWNlOiBQZXJtYW5lbnRTdG9yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jb25uZWN0b3JTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3ByZXNldHNTZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIGhhbmRsZURvY0tleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRFZGdlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkV2FsbCAmJiB0aGlzLnNlbGVjdGVkRWRnZSA/XHJcbiAgICAgIFt0aGlzLnNlbGVjdGVkV2FsbFt0aGlzLnNlbGVjdGVkRWRnZV1dIDpcclxuICAgICAgW3RoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsLmJhY2tFZGdlLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsLmZyb250RWRnZVxyXG4gICAgICBdLmZpbHRlcihlZGdlID0+IGVkZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm1heFdhbGxIZWlnaHQgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1heFdhbGxIZWlnaHQpO1xyXG4gICAgdGhpcy5tYXhXYWxsVGhpY2tuZXNzID0gdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5NYXhXYWxsVGhpY2tuZXNzKTtcclxuICAgIHRoaXMubWF4V2FsbExlbmd0aCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWF4V2FsbExlbmd0aCk7XHJcbiAgICB0aGlzLm1pbldhbGxMZW5ndGggPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1pbldhbGxMZW5ndGgpO1xyXG5cclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkxpYnJhcnksXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDIwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25BY2Nlc3NvaXJlcyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogMjAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbjJkVmlldyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNDAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbjNkVmlldyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNDAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvblNldHRpbmdzLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA1MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uRmFxLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA2MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uRmVlZGJhY2ssXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDcwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25DYXJ0LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiAxMDAwXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuX2FwcFNlcnZpY2UuY2F0ZWdvcmllc0xvYWRlZC5zdWJzY3JpYmUoKGNhdGVnb3JpZXM6IENhdGVnb3J5W10pID0+IHtcclxuICAgICAgICBpZiAoY2F0ZWdvcmllcykge1xyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gdGhpcy5fYXBwU2VydmljZS5nZXRDYXRlZ29yaWVzKCdhcmNoaXRlY3R1cmUnKTtcclxuICAgICAgICAgIHRoaXMuYWNjZXNzb2lyZUNhdGVnb3JpZXMgPSB0aGlzLl9hcHBTZXJ2aWNlLmdldENhdGVnb3JpZXMoJ2FjY2Vzc29pcmVzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy52aWV3TW9kZVNlcnZpY2Uudmlld01vZGVDaGFuZ2VkLnN1YnNjcmliZSgobW9kZTogVmlld01vZGUpID0+IHRoaXMuX3ZpZXdNb2RlQ2hhbmdlZChtb2RlKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TZXQyRFZpZXcsICh7c2VuZFVwZGF0ZXN9KSA9PiB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuRmxvb3JQbGFuMkQsIHNlbmRVcGRhdGVzKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TZXQzRFZpZXcsICh7c2VuZFVwZGF0ZXN9KSA9PiB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgc2VuZFVwZGF0ZXMpKSxcclxuICAgICAgdGhpcy5faW5pdFNjcmVlblNpemVIYW5kbGluZygpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuR3JvdXBNb2RlQ2hhbmdlZCwgKHtzaG93R3JvdXBNZW51fSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IHNob3dHcm91cE1lbnU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuSXRlbVNlbGVjdGVkLCAoaXRlbSkgPT4gdGhpcy5vYmplY3RTZWxlY3RlZChpdGVtKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtVW5zZWxlY3RlZCwgKGl0ZW0pID0+IHRoaXMub2JqZWN0VW5zZWxlY3RlZCgpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxlZnRTaWRlYmFyQ2xvc2VDbGlja2VkLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2UpLFxyXG4gICAgICB0aGlzLl9yb29tU2VydmljZS53YWxsU2VsZWN0ZWQuc3Vic2NyaWJlKChzZWxlY3RlZFdhbGxFdmVudDogU2VsZWN0ZWRXYWxsRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RXYWxsKHNlbGVjdGVkV2FsbEV2ZW50KTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX3Jvb21TZXJ2aWNlLmZsb29yU2VsZWN0ZWQuc3Vic2NyaWJlKChzZWxlY3RlZEZsb29yRXZlbnQ6IFNlbGVjdGVkRmxvb3JFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkV2FsbCkge1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkV2FsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RGbG9vcihzZWxlY3RlZEZsb29yRXZlbnQpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuY29weUl0ZW0uc3Vic2NyaWJlKChpdGVtOiBJdGVtKSA9PiB0aGlzLl9jb3B5SXRlbShpdGVtKSksXHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmRlbGV0ZUl0ZW0uc3Vic2NyaWJlKChpdGVtOiBJdGVtKSA9PiB0aGlzLl9yZW1vdmVPYmplY3QoaXRlbSkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuU2hvd1Byb2R1Y3RDYXRhbG9nLCAoKSA9PiB0aGlzLl9jYXRhbG9nSXNTaG93biA9IHRydWUpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nLCAoKSA9PiB0aGlzLl9jYXRhbG9nSXNTaG93biA9IGZhbHNlKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkJsb2NrTGVmdFNpZGViYXIsIChibG9jaykgPT4gdGhpcy5fYmxvY2tMZWZ0U2lkZUJhciA9IGJsb2NrKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNob3dGdXJuaXR1cmVTaWRlYmFyLCAoY2F0ZWdvcnk6IENhdGVnb3J5KSA9PiB0aGlzLnNob3dMaWJyYXJ5Q2F0ZWdvcnkoY2F0ZWdvcnkpKSxcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLm9iamVjdE1vdmluZ09yUm90YXRpbmcuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2UpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvd0FSQnV0dG9uID0gdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zaG93QXJCdXR0b24gJiYgYXdhaXQgdGhpcy5fYXJTZXJ2aWNlLmFyU3VwcG9ydGVkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLnRvb2xiYXJJY29uTGlicmFyeSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb25BY2Nlc3NvaXJlcyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb25TZXR0aW5ncyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb24yZFZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRvb2xiYXJJY29uM2RWaWV3ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jYXRlZ29yaWVzU2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2V0dGluZ3NTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5saWJyYXJ5U2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGxTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0U2NyZWVuU2l6ZUhhbmRsaW5nKCk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2NyZWVuQW5hbHlzaXMuc2NyZWVuU2l6ZUNoYW5nZWQuc3Vic2NyaWJlKChpbmZvOiBTY3JlZW5TaXplSW5mbykgPT4ge1xyXG4gICAgICB0aGlzLmRlc2t0b3BTaXplU2NyZWVuID0gaW5mby5pc0Rlc2t0b3BTaXplO1xyXG4gICAgICB0aGlzLnRhYmxldFNpemVTY3JlZW4gPSBpbmZvLmlzVGFibGV0U2l6ZTtcclxuICAgICAgdGhpcy5waG9uZVNpemVTY3JlZW4gPSBpbmZvLmlzUGhvbmVTaXplO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmRlc2t0b3BTaXplU2NyZWVuICYmICh0aGlzLnZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHRoaXMudmlld01vZGVTZXJ2aWNlLmlzVlJWaWV3QWN0aXZlKCkpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNb2RlKFZpZXdNb2RlLlJvb21QbGFuM0QsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZpZXdNb2RlQ2hhbmdlZChtb2RlOiBWaWV3TW9kZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBvYmplY3RTZWxlY3RlZChvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXApIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2FsYWJsZU9iamVjdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdCA9IG9iamVjdDtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICB0aGlzLnNob3dHcm91cE1lbnUgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dHcm91cEVkaXRNZW51QnV0dG9ucyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhICYmIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuZ29vZElkKSB7XHJcbiAgICAgICAgdGhpcy5zYWxhYmxlT2JqZWN0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNob3dHcm91cE1lbnUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93U2V0dGluZ3NCdXR0b24gPSB0aGlzLl9oYXNTZXR0aW5ncyh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29uZmlndXJhdGlvbkJ1dHRvbiA9IHRoaXMuX2lzQ29uZmlndXJhYmxlKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dEZWxldGVCdXR0b24gPSB0aGlzLl9pc0RlbGV0YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29weUJ1dHRvbiA9IHRoaXMuX2lzQ29weWFibGUodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnZlcnNpb25CdXR0b24gPSB0aGlzLl9pc0NvbnZlcnNpb25JdGVtKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQpIHtcclxuICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2xhc3MgPSB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdXRpbHNTZXJ2aWNlLmZvcmNlQ2hhbmdlRGV0ZWN0aW9uKHRoaXMuX2NkLCB0aGlzLCAnc2VsZWN0ZWRPYmplY3QnKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHNob3dTZWxlY3RlZE9iamVjdFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YTtcclxuICAgIGlmIChtZXRhZGF0YSAmJiAoaXNDdXN0b21TaGFwZVR5cGUobWV0YWRhdGEuaXRlbVR5cGUpIHx8IGlzQ3VzdG9tU2hhcGVXYWxsVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkpKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcik7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhICYmIChpc0N1c3RvbUN5bGluZGVyVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkgfHwgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5jdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2VsZWN0ZWRPYmplY3RTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVDb25maWd1cmF0aW9uQnV0dG9uQ2xpY2soYnRuOiBDdXN0b21CdXR0b24pOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICBidG4uaGFuZGxlcih0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIG9iamVjdFVuc2VsZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNob3dHcm91cE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZE9iamVjdEh1ZCgpIHtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2UudXBkYXRlU2VsZWN0ZWRJdGVtSHVkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRGVsZXRlT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QgJiYgdGhpcy5faXNEZWxldGFibGUodGhpcy5zZWxlY3RlZE9iamVjdCkpIHtcclxuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZE9iamVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2VsZWN0ZWRPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fcmVtb3ZlT2JqZWN0KHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgdGhpcy5vYmplY3RVbnNlbGVjdGVkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubG9ja2VkID0gIXRoaXMuc2VsZWN0ZWRPYmplY3QubG9ja2VkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlT2JqZWN0KG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgaWYgKGlzV2FsbFR5cGUob2JqZWN0LnVzZXJEYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50V2FsbCA9ICg8V2FsbEl0ZW0+b2JqZWN0KS5jdXJyZW50V2FsbDtcclxuICAgICAgaWYgKGN1cnJlbnRXYWxsKSB7XHJcbiAgICAgICAgY3VycmVudFdhbGwucmVtb3ZlSXRlbSg8SXRlbT5vYmplY3QpO1xyXG4gICAgICAgIGN1cnJlbnRXYWxsLnJlbW92ZU9uSXRlbSg8SXRlbT5vYmplY3QpO1xyXG4gICAgICAgIGN1cnJlbnRXYWxsLmZpcmVSZWRyYXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpc0Z1cm5pdHVyZVR5cGUob2JqZWN0LnVzZXJEYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlbW92ZVNlbGVjdGVkRnVybml0dXJlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdC5jYW5CZVJlbW92ZWQoKSkge1xyXG4gICAgICB0aGlzLl9yZW1vdmVJdGVtKG9iamVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3QucmVtb3ZlZCgpO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlSXRlbShvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXApIHtcclxuICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLnJlbW92ZUl0ZW0ob2JqZWN0KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAncmVtb3ZlT2JqZWN0J30pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29weVNlbGVjdGVkT2JqZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuX2NvcHlJdGVtKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29weUl0ZW0ob3JpZ2luYWw6IEl0ZW0gfCBJdGVtR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGVJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21TaGFwZUZsb29ySXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGVXYWxsSXRlbTogYm9vbGVhbiA9IG9yaWdpbmFsIGluc3RhbmNlb2YgQ3VzdG9tU2hhcGVXYWxsSXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tQ3lsaW5kZXJJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21DeWxpbmRlckZsb29ySXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbTogYm9vbGVhbiA9IG9yaWdpbmFsIGluc3RhbmNlb2YgQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbTtcclxuICAgIGNvbnN0IGlzUmVzaXphYmxlRG9vck9yV2luZG93OiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBJbldhbGxJdGVtICYmIG9yaWdpbmFsLmlzQ3VzdG9tO1xyXG4gICAgaWYgKGlzQ3VzdG9tU2hhcGVJdGVtIHx8IGlzQ3VzdG9tU2hhcGVXYWxsSXRlbSB8fCBpc0N1c3RvbUN5bGluZGVySXRlbSB8fCBpc0N1c3RvbUN5bGluZGVyV2FsbEl0ZW0gfHwgaXNSZXNpemFibGVEb29yT3JXaW5kb3cpIHtcclxuICAgICAgY29uc3QgY29weSA9IChvcmlnaW5hbCBhcyBDdXN0b21TaGFwZUZsb29ySXRlbSB8IEluV2FsbEl0ZW0pLmNsb25lSXRlbSgpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGNvcHkpO1xyXG4gICAgICBpZiAoY29weSBpbnN0YW5jZW9mIFdhbGxJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY2xvc2VzdFdhbGxFZGdlID0gdGhpcy5fcm9vbVNlcnZpY2UuZ2V0Q2xvc2VzdFdhbGxFZGdlKG9yaWdpbmFsLnBvc2l0aW9uLngsIG9yaWdpbmFsLnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGNvcHkucGxhY2VPbkVkZ2UoY2xvc2VzdFdhbGxFZGdlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGNvcHkpO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgb3JpZ2luYWwucG9zaXRpb24pO1xyXG4gICAgfSBlbHNlIGlmIChvcmlnaW5hbC51c2VyRGF0YSAmJiBvcmlnaW5hbC51c2VyRGF0YS5pdGVtSWRlbnRpZmllcikge1xyXG4gICAgICBpZiAob3JpZ2luYWwubWV0YWRhdGEudGhpcmRQYXJ0eU1vZGVsKSB7XHJcbiAgICAgICAgLy8gV2hlbiBpdCdzIGEgdGhpcmQgcGFydHkgbW9kZWwsIHdlIHNob3VsZCBqdXN0IGNsb25lIHRoZSBPYmplY3QoM0QpXHJcbiAgICAgICAgLy8gY29uc3QgY2xvbmUgPSBvcmlnaW5hbC5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2xvbmVUaGlyZFBhcnR5TW9kZWwsIG9yaWdpbmFsIGFzIEl0ZW0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ29weUlPbmVGdXJuaXR1cmVJbnRvU2NlbmVCeVNLVSwgb3JpZ2luYWwgYXMgSXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRyYWdnZWREYXRhOiBEcmFnZ2VkRGF0YSA9IHtcclxuICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lLFxyXG4gICAgICAgIHR5cGU6IG9yaWdpbmFsLm1ldGFkYXRhLml0ZW1UeXBlLFxyXG4gICAgICAgIGlPbmU6IGZhbHNlLFxyXG4gICAgICAgIG92ZXJyaWRlczoge1xyXG4gICAgICAgICAgcm90YXRpb246IG9yaWdpbmFsLnJvdGF0aW9uICYmIG9yaWdpbmFsLnJvdGF0aW9uLmNsb25lKCksXHJcbiAgICAgICAgICAvLyBzY2FsZTogb3JpZ2luYWwuc2NhbGUgJiYgb3JpZ2luYWwuc2NhbGUuY2xvbmUoKSxcclxuICAgICAgICAgIG9wZW5pbmc6IChvcmlnaW5hbCBhcyBhbnkpLm9wZW5pbmcsXHJcbiAgICAgICAgICB0ZXh0dXJlOiAob3JpZ2luYWwgYXMgYW55KS50ZXh0dXJlLFxyXG4gICAgICAgICAgaXNDb3B5OiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGRyYWdnZWREYXRhKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydERyYWcsIG9yaWdpbmFsLnBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHpvb21SZXNldCgpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21SZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbnRab29tT3V0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JwbGFubmVyLmNhbnRab29tT3V0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbnRab29tSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vcnBsYW5uZXIuY2FudFpvb21JbjtcclxuICB9XHJcblxyXG4gIHpvb21PdXQoKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci56b29tT3V0KCk7XHJcbiAgfVxyXG5cclxuICB6b29tSW4oKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci56b29tSW4oKTtcclxuICB9XHJcblxyXG4gIHVuc2VsZWN0QWxsKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29yID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRFZGdlID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QgPSBudWxsO1xyXG4gICAgaWYgKCF0aGlzLl9ibG9ja0xlZnRTaWRlQmFyKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlKHZhbHVlOiBWaWV3TW9kZSwgc2VuZFVwZGF0ZXMgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xyXG4gICAgaWYgKHNlbmRVcGRhdGVzKSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVTZXJ2aWNlLnNldFZpZXdNb2RlKHRoaXMuX2Zsb29ycGxhblNlcnZpY2UuZ2V0U2l6ZSgpLCB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLmdldENlbnRlcigpLCB2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuVmlld01vZGVDaGFuZ2VkLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93TGlicmFyeUNhdGVnb3JpZXMoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyKTtcclxuICAgIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlID0gdGhpcy5jYXRlZ29yaWVzU2lkZWJhcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93QWNjZXNzb2lyZUNhdGVnb3JpZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB0aGlzLmFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0FjdGl2ZUNhdGVnb3J5U2lkZWJhcigpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNob3dMaWJyYXJ5Q2F0ZWdvcnkoY2F0ZWdvcnk6IENhdGVnb3J5KSB7XHJcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLm1vZGVsc1NlcnZpY2UuZ2V0SXRlbXNGcm9tQ2F0ZWdvcnkoY2F0ZWdvcnkuaWQpO1xyXG4gICAgdGhpcy5jdXN0b21PYmplY3RzID0gdGhpcy5vYmplY3RzLmZpbHRlcihvYmplY3QgPT4gb2JqZWN0LmlzQ3VzdG9tKTtcclxuICAgIHRoaXMubGlicmFyeU9iamVjdHMgPSB0aGlzLm9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiAhb2JqZWN0LmlzQ3VzdG9tKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9IGNhdGVnb3J5O1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5saWJyYXJ5U2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNldHRpbmdzU2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbkZhcSh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5vcGVuKHVybCwgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmFxVXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RmFxKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0ljb24gPSB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwgIT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuRmVlZGJhY2sodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5vcGVuKHVybCwgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEFsbFRvQ2FydCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RmVlZGJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZlZWRiYWNrVXJsICE9PSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZCgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGFibGVzID0gW1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRWRnZSAmJiB0aGlzLnNlbGVjdGVkV2FsbCAmJiB0aGlzLnNlbGVjdGVkV2FsbFt0aGlzLnNlbGVjdGVkRWRnZV0sXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmxvb3IsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RcclxuICAgIF07XHJcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbMF07XHJcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xyXG4gICAgICB0aGlzLl9tb2RlID0gVmlld01vZGUuUm9vbVBsYW4zRDtcclxuICAgICAgdGhpcy5zaG93UGx1Z2luLmVtaXQoc2VsZWN0YWJsZSk7XHJcbiAgICB9IGVsc2UgaWYgKCFzZWxlY3RhYmxlKSB7XHJcbiAgICAgIHRoaXMuZG9uZS5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaW5kRWRnZVdhbGxQbGFjZW1lbnQod2FsbCwgZWRnZSkge1xyXG4gICAgY29uc3QgZWRnZVBsYWNlbWVudHMgPSBbJ2Zyb250RWRnZScsICdiYWNrRWRnZSddO1xyXG4gICAgcmV0dXJuIGVkZ2VQbGFjZW1lbnRzLnJlZHVjZSgocGxhY2VtZW50LCBwKSA9PiB7XHJcbiAgICAgIGlmICh3YWxsW3BdID09PSBlZGdlKSB7XHJcbiAgICAgICAgcGxhY2VtZW50ID0gcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xyXG4gICAgfSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0V2FsbChzZWxlY3RlZFdhbGxFdmVudDogU2VsZWN0ZWRXYWxsRXZlbnQpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gc2VsZWN0ZWRXYWxsRXZlbnQud2FsbDtcclxuICAgIHRoaXMuY29udGV4dE1lbnVNb3VzZUV2ZW50ID0gc2VsZWN0ZWRXYWxsRXZlbnQuZXZlbnQ7XHJcbiAgICBpZiAoc2VsZWN0ZWRXYWxsRXZlbnQud2FsbCkge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRXYWxsRXZlbnQuZWRnZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFZGdlID0gdGhpcy5maW5kRWRnZVdhbGxQbGFjZW1lbnQoc2VsZWN0ZWRXYWxsRXZlbnQud2FsbCwgc2VsZWN0ZWRXYWxsRXZlbnQuZWRnZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLnNob3dTZWxlY3RlZFdhbGxTaWRlYmFyKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZFdhbGxTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93U2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyKCkge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEZsb29yKHNlbGVjdGVkRmxvb3JFdmVudDogU2VsZWN0ZWRGbG9vckV2ZW50KSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm9vbSA9IHNlbGVjdGVkRmxvb3JFdmVudC5yb29tO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29yID0gc2VsZWN0ZWRGbG9vckV2ZW50LnJvb20uZmxvb3JQbGFuZTtcclxuICAgIHRoaXMuY29udGV4dE1lbnVNb3VzZUV2ZW50ID0gc2VsZWN0ZWRGbG9vckV2ZW50LmV2ZW50O1xyXG4gICAgaWYgKHNlbGVjdGVkRmxvb3JFdmVudC5yb29tKSB7XHJcbiAgICAgIGlmICh0aGlzLnZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZEZsb29yU2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX3Jvb21TZXJ2aWNlLnNldEZsb29yVGV4dHVyZSh0aGlzLnNlbGVjdGVkUm9vbSwgdGV4dHVyZSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ2Zsb29yVGV4dHVyZScsIHBhdGNoOiBmYWxzZX0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZsb29yQ29sb3IoY29sb3I6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcm9vbVNlcnZpY2Uuc2V0Rmxvb3JDb2xvcih0aGlzLnNlbGVjdGVkUm9vbSwgY29sb3IpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdmbG9vckNvbG9yJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVXYWxsKHdhbGw6IFdhbGwpIHtcclxuICAgIHdhbGwucmVtb3ZlKCk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnJlbW92ZVdhbGwod2FsbCk7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3JlbW92ZVdhbGwnfSk7XHJcbiAgfVxyXG5cclxuICBzZXRXYWxsTGVuZ3RoKHtsZW5ndGgsIGF0RW5kLCBlZGdlfTogeyBsZW5ndGg6IG51bWJlciwgYXRFbmQ6IGJvb2xlYW4sIGVkZ2U/OiBIYWxmRWRnZSB9KSB7XHJcbiAgICBjb25zdCB3YWxsID0gdGhpcy5zZWxlY3RlZFdhbGw7XHJcbiAgICBjb25zdCBvcmlnTGVuZ3RoID0gZWRnZSA/IGVkZ2UuaW50ZXJpb3JEaXN0YW5jZSgpIDogd2FsbC5sZW5ndGg7XHJcbiAgICBjb25zdCBzdGFydCA9IGF0RW5kID8gd2FsbC5nZXRTdGFydCgpIDogd2FsbC5nZXRFbmQoKTtcclxuICAgIGNvbnN0IGVuZCA9IGF0RW5kID8gd2FsbC5nZXRFbmQoKSA6IHdhbGwuZ2V0U3RhcnQoKTtcclxuICAgIGNvbnN0IGR4ID0gZW5kLnggLSBzdGFydC54O1xyXG4gICAgY29uc3QgZHkgPSBlbmQueSAtIHN0YXJ0Lnk7XHJcbiAgICBjb25zdCBrID0gbGVuZ3RoIC8gb3JpZ0xlbmd0aDtcclxuICAgIGVuZC5tb3ZlKGsgKiBkeCArIHN0YXJ0LngsIGsgKiBkeSArIHN0YXJ0LnkpO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUZsb29yc0FuZEVkZ2VzKCkudGhlbigoKSA9PiB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5uZXh0KCkpO1xyXG4gICAgdGhpcy5fbGlnaHRzU2VydmljZS51cGRhdGVBbGxPZmZzZXRzKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxMZW5ndGgnfSk7XHJcblxyXG4gICAgaWYgKHRoaXMud2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkICYmIHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuU2hvd0RldGFpbGVkV2FsbE1lYXN1cmVtZW50cykpIHtcclxuICAgICAgaWYgKGVkZ2UgJiYgTWF0aC5yb3VuZChlZGdlLmludGVyaW9yRGlzdGFuY2UoKSkgIT09IGxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1dhbGxMZW5ndGhJbmZvRGlhbG9nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dXYWxsTGVuZ3RoSW5mb0RpYWxvZygpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKEluZm9EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiAnSW5mbycsXHJcbiAgICAgICAgbWVzc2FnZTpcclxuICAgICAgICAgIGBSZXN1bHRpbmcgbGVuZ3RoIG9mIHdhbGwgc2xpZ2h0bHkgZGlmZmVycyBmcm9tIGxlbmd0aCB5b3Ugc3BlY2lmaWVkLlxyXG4gICAgICAgICAgVG8gZnVydGhlciByZWZpbmUgbGVuZ3RoIG9mIHRoZSB3YWxsLCB1c2UgMkQgZmxvb3JwbGFuIGJsdWVwcmludC5gXHJcbiAgICAgIH0sXHJcbiAgICAgIG1heFdpZHRoOiAnNTAwcHgnXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3N1YnMucHVzaChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoZG9udFNob3dBZ2FpbiA9PiB7XHJcbiAgICAgIHRoaXMud2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkID0gIWRvbnRTaG93QWdhaW47XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBzZXRXYWxsSGVpZ2h0KGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbC5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVDZWlsaW5ncygpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbEhlaWdodCd9KTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxUaGlja25lc3ModGhpY2tuZXNzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcclxuICAgIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UudXBkYXRlKCk7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVGbG9vcnNBbmRFZGdlcygpLnRoZW4oKCkgPT4gdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQubmV4dCgpKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLmZpcmVSZWRyYXcoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbFRoaWNrbmVzcyd9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRXYWxsVGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRWRnZXMuZm9yRWFjaChhc3luYyAoZWRnZSkgPT4gYXdhaXQgZWRnZS5zZXRUZXh0dXJlKHRleHR1cmUpKTtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5zZWxlY3RlZEVkZ2VzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkRWRnZXNbaV0uc2V0VGV4dHVyZSh0ZXh0dXJlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxUZXh0dXJlJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0V2FsbENvbG9yKGNvbG9yOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFZGdlcy5mb3JFYWNoKGFzeW5jIChlZGdlKSA9PiBhd2FpdCBlZGdlLnNldENvbG9yKGNvbG9yKSk7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsQ29sb3InLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENvcm5lcihjb3JuZXI6IENvcm5lcikge1xyXG4gICAgdGhpcy5mbG9vcnBsYW5uZXIuc2VsZWN0Q29ybmVyKGNvcm5lcik7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5XYWxsSGVpZ2h0KHdhbGw6IFdhbGwpOiBudW1iZXIge1xyXG4gICAgaWYgKCF3YWxsKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdCA9IDA7XHJcbiAgICBjb25zdCBjYXN0ZWRXYWxsOiBhbnkgPSB3YWxsO1xyXG5cclxuICAgIGlmIChjYXN0ZWRXYWxsLml0ZW1zKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjYXN0ZWRXYWxsLml0ZW1zKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBpdGVtLmhhbGZTaXplLnkgKyBpdGVtLnBvc2l0aW9uLnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNhc3RlZFdhbGwub25JdGVtcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2FzdGVkV2FsbC5vbkl0ZW1zKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBpdGVtLmhhbGZTaXplLnkgKyBpdGVtLnBvc2l0aW9uLnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE1hdGguY2VpbChyZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluR2xvYmFsV2FsbEhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgY29uc3Qgd2FsbHMgPSB0aGlzLl9yb29tU2VydmljZS53YWxscztcclxuICAgIGlmICghd2FsbHMpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgLi4ud2FsbHMubWFwKHRoaXMuZ2V0TWluV2FsbEhlaWdodCkpO1xyXG4gIH1cclxuXHJcbiAgd2FsbHNIZWlnaHRVcGRhdGVkKGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVXYWxsSGVpZ2h0cyhoZWlnaHQpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsSGVpZ2h0J30pO1xyXG4gIH1cclxuXHJcbiAgc2V0RHJhZ2dlZChvYmplY3Q6IE1vZGVsSW50ZXJmYWNlKSB7XHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YTogRHJhZ2dlZERhdGEgPSB7XHJcbiAgICAgIG5hbWU6IG9iamVjdC5uYW1lLFxyXG4gICAgICB0eXBlOiArb2JqZWN0LnR5cGUsXHJcbiAgICAgIGlPbmU6IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXREcmFnLCBkcmFnZ2VkRGF0YSk7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlRHJhZ2dlZCgpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuRXhpdERyYWcpO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZsb29yUGxhbihkYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmxvb3JwbGFuU2VydmljZS5sb2FkRmxvb3JwbGFuKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0QVJTZXNzaW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgY29uc3QgYXJPYmplY3QgPSB0aGlzLnNlbGVjdGVkT2JqZWN0LmNsb25lVmlzaWJsZSgpO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYXJNb2RlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fc2NlbmVTZXJ2aWNlLmFkZE9iamVjdChhck9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9DYXJ0KG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAob2JqZWN0Lm1ldGFkYXRhKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLmluaXRDb25uZWN0b3IoXHJcbiAgICAgICAgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5zZXR0aW5ncyA6IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLFxyXG4gICAgICAgIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzID8gb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MubmFtZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBmYWxzZSxcclxuICAgICAgICBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyAmJiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZSA/IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlLnNvdXJjZUlkIDogbnVsbFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3JTZXJ2aWNlLmFkZFRvQ2FydChcclxuICAgICAgICArb2JqZWN0Lm1ldGFkYXRhLmdvb2RJZCwgb2JqZWN0Lm1ldGFkYXRhLmdvb2RUeXBlLCAxLCArb2JqZWN0Lm1ldGFkYXRhLml0ZW1JZCwgISEob2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgJiYgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2UpKTtcclxuICAgICAgaWYgKG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxTb3VyY2U6IEV4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZSA9IHtcclxuICAgICAgICAgIGFydGljbGU6IGpzb24sXHJcbiAgICAgICAgICBxdWFudGl0eTogMSxcclxuICAgICAgICAgIGNhdGFsb2dEZWZpbml0aW9uOiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5jYXRhbG9nRGVmaW5pdGlvbixcclxuICAgICAgICAgIGV4dGVybmFsU291cmNlOiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmFkZEV4dGVybmFsU291cmNlVG9DYXJ0Lm5leHQoZXh0ZXJuYWxTb3VyY2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hZGRUb0NhcnQubmV4dCh7YXJ0aWNsZToganNvbiwgcXVhbnRpdHk6IDF9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZEl0ZW1zKGRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW1Nb2RlbCBvZiBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBuZXcgVmVjdG9yMyhpdGVtTW9kZWwueHBvcywgaXRlbU1vZGVsLnlwb3MsIGl0ZW1Nb2RlbC56cG9zKTtcclxuICAgICAgICBjb25zdCBvdmVycmlkZXMgPSB7XHJcbiAgICAgICAgICB3aWR0aDogaXRlbU1vZGVsLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBpdGVtTW9kZWwuaGVpZ2h0LFxyXG4gICAgICAgICAgdGV4dHVyZTogaXRlbU1vZGVsLnRleHR1cmUsXHJcbiAgICAgICAgICByb3RhdGlvbjogbmV3IEV1bGVyKDAsIGl0ZW1Nb2RlbC5yb3RhdGlvbiwgMCksXHJcbiAgICAgICAgICBvcGVuaW5nOiBpdGVtTW9kZWwub3BlbmluZyxcclxuICAgICAgICAgIGZyYW1lQ29sb3I6IGl0ZW1Nb2RlbC5mcmFtZUNvbG9yLFxyXG4gICAgICAgICAgZG9vckNvbG9yOiBpdGVtTW9kZWwuZG9vckNvbG9yLFxyXG4gICAgICAgICAgd2luZG93Q29sb3I6IGl0ZW1Nb2RlbC53aW5kb3dDb2xvcixcclxuICAgICAgICAgIGxvY2tlZDogaXRlbU1vZGVsLmxvY2tlZCxcclxuICAgICAgICAgIGlzR2xhc3M6IGl0ZW1Nb2RlbC5pc0dsYXNzXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBtb2RlbERhdGEgPSBhd2FpdCB0aGlzLm1vZGVsc1NlcnZpY2UuZ2V0KGl0ZW1Nb2RlbC5pdGVtX25hbWUsIG92ZXJyaWRlcyk7XHJcbiAgICAgICAgaWYgKG1vZGVsRGF0YSkge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1TZXJ2aWNlLmFkZEpzb25JdGVtKG1vZGVsRGF0YSwgcG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKGl0ZW1Nb2RlbC5pdGVtR3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVhdHRhY2hUb0l0ZW1Hcm91cChpdGVtTW9kZWwuaXRlbUdyb3VwLCBpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgV2FsbEl0ZW0pIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvc2VzdFdhbGxFZGdlID0gdGhpcy5fcm9vbVNlcnZpY2UuZ2V0Q2xvc2VzdFdhbGxFZGdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnopO1xyXG4gICAgICAgICAgICBpdGVtLnBsYWNlT25FZGdlKGNsb3Nlc3RXYWxsRWRnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5hYmxlIHRvIGdldCBtb2RlbCBmb3IgJHtpdGVtTW9kZWwuaXRlbV9uYW1lfSBmcm9tIE1vZGVsc1NlcnZpY2VgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRPYmplY3RzKHtpdGVtcywgZmxvb3JwbGFufSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmxvYWRJdGVtcyhpdGVtcyksXHJcbiAgICAgIHRoaXMubG9hZEZsb29yUGxhbihmbG9vcnBsYW4pLFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29weVNjZW5lSW5zdGFuY2Uoc2F2ZUFzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiByZXNvbHZlKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T2JqZWN0cygpIHtcclxuICAgIGNvbnN0IGl0ZW1zVG9TYXZlID0gdGhpcy5faXRlbVNlcnZpY2UuZ2V0Tm9uRnVybml0dXJlKCkubWFwKGkgPT4gdGhpcy5faXRlbVNlcmlhbGl6YXRpb25TZXJ2aWNlLml0ZW1Ub09iamVjdChpKSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmbG9vcnBsYW46IHRoaXMuX2Zsb29ycGxhblNlcnZpY2Uuc2F2ZUZsb29ycGxhbigpLFxyXG4gICAgICBpdGVtczogaXRlbXNUb1NhdmVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBoYXNDdXN0b21PYmplY3RzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tT2JqZWN0cy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT2JqZWN0TGlicmFyeUNsaWNrKG9iamVjdDogTW9kZWxJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIHRoaXMucmVsZWFzZURyYWdnZWQoKTtcclxuICAgIHRoaXMuc2V0RHJhZ2dlZChvYmplY3QpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydERyYWcsIHt4OiAwLCB5OiAwfSk7XHJcbiAgICBpZiAob2JqZWN0Lm5hbWUgPT09ICdXYWxrdGhyb3VnaCBDYW1lcmEnKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uR3JvdXBDbGljaygpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuR3JvdXBPYmplY3RzKTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxHcm91cFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2FuY2VsR3JvdXBPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgb25Vbkdyb3VwQ2xpY2soKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlVuZ3JvdXBPYmplY3RzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZUNvbnRleHRNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydEdyb3VwU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydEdyb3VwT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kQ29udmVyc2lvblRvVGFnTWFuYWdlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFydGljbGU6IEl0ZW0gfCBJdGVtR3JvdXAgPSB0aGlzLnNlbGVjdGVkT2JqZWN0O1xyXG4gICAgbGV0IGNvbnZlcnNpb25BY3Rpb246IHN0cmluZztcclxuICAgIGlmIChhcnRpY2xlIGluc3RhbmNlb2YgSXRlbSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCkge1xyXG4gICAgICAgIGNvbnZlcnNpb25BY3Rpb24gPSAncmVtb3ZlJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udmVyc2lvbkFjdGlvbiA9ICdhZGQnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kUHJvZHVjdENvbnZlcnNpb24oYXJ0aWNsZS5tZXRhZGF0YSwgY29udmVyc2lvbkFjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYXNTZXR0aW5ncyhpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGU6IGJvb2xlYW4gPSBpdGVtLm1ldGFkYXRhICYmIChcclxuICAgICAgaXNDdXN0b21TaGFwZVR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21TaGFwZVdhbGxUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpIHx8XHJcbiAgICAgIGlzQ3VzdG9tQ3lsaW5kZXJUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpIHx8XHJcbiAgICAgIGlzQ3VzdG9tQ3lsaW5kZXJXYWxsVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGhhc0NvbmZpZ3VyYWJsZVRleHR1cmU6IGJvb2xlYW4gPSAhIWl0ZW0gJiYgISEoaXRlbS5tZXRhZGF0YSAmJiBpdGVtLm1ldGFkYXRhLnRleHR1cmUpO1xyXG4gICAgY29uc3QgaGFzT3BlbmluZ0F0dHJpYnV0ZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIWl0ZW0ub3BlbmluZztcclxuICAgIGNvbnN0IGlzU2NhbGFibGU6IGJvb2xlYW4gPSAhIWl0ZW0gJiYgISEoaXRlbS5tZXRhZGF0YSAmJiBpdGVtLm1ldGFkYXRhLnNjYWxhYmxlKTtcclxuXHJcbiAgICByZXR1cm4gaXNDdXN0b21TaGFwZSB8fCBoYXNDb25maWd1cmFibGVUZXh0dXJlIHx8IGhhc09wZW5pbmdBdHRyaWJ1dGUgfHwgaXNTY2FsYWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzQ29uZmlndXJhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtR3JvdXApICYmICEhaXRlbSAmJiAhIWl0ZW0ubWV0YWRhdGEgJiYgISFpdGVtLm1ldGFkYXRhLml0ZW1JZGVudGlmaWVyICYmIGl0ZW0uY29uZmlndXJhYmxlICYmXHJcbiAgICAgICFpdGVtLmFsbHdheXNDb25maWd1cmVNb2RlICYmICFpdGVtLm9ic29sZXRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb252ZXJzaW9uSXRlbShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXRlbS5tZXRhZGF0YS5pb25lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtLm1ldGFkYXRhLmlvbmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0RlbGV0YWJsZShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIShpdGVtIGluc3RhbmNlb2YgUm9vbSB8fCBpdGVtIGluc3RhbmNlb2YgV2FsbCkgJiZcclxuICAgICAgKChpdGVtIGluc3RhbmNlb2YgSXRlbSAmJiBpdGVtLmNhbkRlbGV0ZSkgfHwgIShpdGVtIGluc3RhbmNlb2YgSXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb3B5YWJsZShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpc05vdFJvb21PcldhbGxPckRlY29yYXRpb246IGJvb2xlYW4gPSAhKGl0ZW0gaW5zdGFuY2VvZiBSb29tIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsIHx8IGl0ZW0gaW5zdGFuY2VvZiBGbG9vclBsYW5lSXRlbSk7XHJcbiAgICBjb25zdCBpc0NvcHlhYmxlSXRlbTogYm9vbGVhbiA9ICgoaXRlbSBpbnN0YW5jZW9mIEl0ZW0gJiYgaXRlbS5jYW5Db3B5ICYmICFpdGVtLm9ic29sZXRlKSB8fCAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtKSkgJiZcclxuICAgICAgIXRoaXMuX2l0ZW1TZXJ2aWNlLmdldFdhbGt0aHJvdWdoQ2FtZXJhKCk7XHJcbiAgICByZXR1cm4gaXNOb3RSb29tT3JXYWxsT3JEZWNvcmF0aW9uICYmIGlzQ29weWFibGVJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVhdHRhY2hUb0l0ZW1Hcm91cChpdGVtR3JvdXAsIG9iamVjdCkge1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UucmVtb3ZlSXRlbShvYmplY3QpO1xyXG4gICAgaXRlbUdyb3VwLmFkZEl0ZW0ob2JqZWN0KTtcclxuICAgIGl0ZW1Hcm91cC5jcmVhdGVCb3VuZGFyeUJveCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSBLZXkuQzpcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCAmJiAhdGhpcy5fdGV4dElucHV0QWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TaG93UHJvZHVjdENhdGFsb2cpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEtleS5BOlxyXG4gICAgICAgICAgLy8gaWYgKHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlICE9PSBudWxsICYmIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlID09PSB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyKSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgIC8vICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSBudWxsO1xyXG4gICAgICAgICAgLy8gfSBlbHNlXHJcbiAgICAgICAgICBpZiAodGhpcy5fbW9kZSAhPT0gVmlld01vZGUuRmxvb3JQbGFuMkQgJiYgIXRoaXMuX2NhdGFsb2dJc1Nob3duICYmICF0aGlzLl90ZXh0SW5wdXRBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBLZXkuVjpcclxuICAgICAgICAgIGlmICghdGhpcy5fY2F0YWxvZ0lzU2hvd24gJiYgIXRoaXMuX3RleHRJbnB1dEFjdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBWaWV3TW9kZS5Sb29tUGxhbjNEKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlKFZpZXdNb2RlLkZsb29yUGxhbjJELCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgS2V5LkVzYzpcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90ZXh0SW5wdXRBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpbnB1dHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoaW5wdXRzWzBdLnR5cGUgPT09ICd0ZXh0JyAmJiBpbnB1dHNbaV0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
|
|
1703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vbS1wbGFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvcm9vbS1wbGFubmVyL3Jvb20tcGxhbm5lci9yb29tLXBsYW5uZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFckMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHM0QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsVUFBVSxFQUNYLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQixVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBb0J4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFJakUsT0FBTyxFQUFD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LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7RXVsZXIsIFZlY3RvcjN9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uLy4uL3BsdWdpbi1pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhbm5lckNvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvZmxvb3JwbGFubmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SWNvbkVudW19IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9pY29uLmVudW0nO1xyXG5pbXBvcnQge0ljb25OYW1lfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1RocmVlZE1vZGVsfSBmcm9tICcuLi8uLi9jb3JlM2QvbW9kZWwvdGhyZWVkLW1vZGVsJztcclxuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jYXRlZ29yeSc7XHJcbmltcG9ydCB7XHJcbiAgaXNDdXN0b21DeWxpbmRlclR5cGUsXHJcbiAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVXYWxsVHlwZSxcclxuICBpc0Z1cm5pdHVyZVR5cGUsXHJcbiAgaXNXYWxsVHlwZVxyXG59IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtDb3JuZXIsIEhhbGZFZGdlLCBJbldhbGxJdGVtLCBSb29tLCBXYWxsLCBXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tZ3JvdXAnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ZpZXctbW9kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNb2RlbHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9tb2RlbHMuc2VydmljZSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAuc2VydmljZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUFuYWx5c2lzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NjcmVlbi1zaXplLWFuYWx5c2lzL3NjcmVlbi1zaXplLWFuYWx5c2lzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhblNlcnZpY2V9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2UvZmxvb3JwbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb29ycGxhbm5lci9zZXJ2aWNlL3Jvb20uc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJpYWxpemF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2l0ZW0tc2VyaWFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9saWdodHMuc2VydmljZSc7XHJcbmltcG9ydCB7QXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9hci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb25maWd1cmF0aW9uS2V5fSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vY29uZmlndXJhdGlvbi1rZXkuZW51bSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0ZWRXYWxsRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLXdhbGwtZXZlbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtTZWxlY3RlZEZsb29yRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLWZsb29yLWV2ZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUluZm99IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zY3JlZW4tc2l6ZS1hbmFseXNpcy9zY3JlZW4tc2l6ZS1pbmZvJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZUZsb29ySXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1zaGFwZS1mbG9vci1pdGVtJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZVdhbGxJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLXNoYXBlLXdhbGwtaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJGbG9vckl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20tY3lsaW5kZXItZmxvb3ItaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1jeWxpbmRlci13YWxsLWl0ZW0nO1xyXG5pbXBvcnQge0RyYWdnZWREYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL2RyYWdnZWQtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RleHR1cmV9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdGV4dHVyZSc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9pbnRlcmZhY2UvbW9kZWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtLZXl9IGZyb20gJy4uL2NvbnN0L2tleSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mbG9vci1wbGFuZS1pdGVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nb29nbGUtdGFnLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7UGVybWFuZW50U3RvcmVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvcGVybWFuZW50LXN0b3JlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0N1c3RvbUJ1dHRvbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jdXN0b20tYnV0dG9uJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0V4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZX0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvaW50ZXJmYWNlL2V4dGVybmFsLXNvdXJjZS1hcnRpY2xlLWFkZC5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdycC1yb29tLXBsYW5uZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwiUm9vbVBsYW5uZXJcIj5cclxuICAgICAgPGZsb29yLXBsYW5uZXJcclxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiF2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgKHNlbGVjdGVkV2FsbENoYW5nZSk9XCJzZWxlY3RXYWxsKCRldmVudClcIj48L2Zsb29yLXBsYW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiBzZWxlY3RlZFdhbGxcIlxyXG4gICAgICBbb3Blbk1vdXNlRXZlbnRdPVwiY29udGV4dE1lbnVNb3VzZUV2ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwIFwiPlxyXG4gICAgICAgIDxkaXYgKGNsaWNrKT1cInNob3dTZWxlY3RlZFdhbGxTaWRlYmFyKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPHJwLWNvbnRleHQtbWVudVxyXG4gICAgICAqbmdJZj1cIiF2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSAmJiBzaG93Q29udGV4dE1lbnUgJiYgc2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgIFtvcGVuTW91c2VFdmVudF09XCJjb250ZXh0TWVudU1vdXNlRXZlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2IChjbGljayk9XCJzaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbSBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPHJwLWl0ZW0tY29udGV4dC1tZW51XHJcbiAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiAhc2hvd0dyb3VwTWVudVwiXHJcbiAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgKGRlbGV0ZVByZXNzZWQpPVwiaGFuZGxlRGVsZXRlT2JqZWN0KClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDb250ZXh0TWVudSgpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLWljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2xvc2U8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGhpcy5zZWxlY3RlZE9iamVjdFwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8cD57eyB0aGlzLnNlbGVjdGVkT2JqZWN0Lm5hbWUgfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiIChjbGljayk9XCJzaG93U2VsZWN0ZWRPYmplY3RTaWRlYmFyKClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtIFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIHN2Z0ljb249XCJtYWdpYy13YW5kXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NvbmZpZ3VyYXRpb25CdXR0b25cIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGN1c3RvbUJ1dHRvbiBvZiBtb2RlbHNTZXJ2aWNlLmN1c3RvbUJ1dHRvbnNcIiAoY2xpY2spPVwiaGFuZGxlQ29uZmlndXJhdGlvbkJ1dHRvbkNsaWNrKGN1c3RvbUJ1dHRvbilcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxjby1pY29uIFtpY29uRGF0YV09XCJpY29uU2VydmljZS5nZXRJY29uKGljb24uTWFnaWNXYW5kKVwiPjwvY28taWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09ORklHVVJFJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb3B5QnV0dG9uXCIgKGNsaWNrKT1cImNvcHlTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+ZmlsZV9jb3B5PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPUFknIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRPYmplY3QoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmRlbGV0ZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdSRU1PVkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb25maWd1cmF0aW9uQnV0dG9uXCIgKGNsaWNrKT1cInNob3dTZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIoKVwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5zZXR0aW5nczwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvY2tCdXR0b24gJiYgc2VsZWN0ZWRPYmplY3RcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cInNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdsb2NrJyA6ICdsb2NrX29wZW4nXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cInN0YXJ0R3JvdXBTZWxlY3Rpb24oKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93Q29udmVyc2lvbkJ1dHRvbiAmJiBzZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2hvd0NvbnZlcnNpb25CdXR0b25zXCJcclxuICAgICAgICAgICAgIChjbGljayk9XCJzZW5kQ29udmVyc2lvblRvVGFnTWFuYWdlcigpXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJhZGRTZWxlY3RlZENsYXNzID8gJ2NvbnZlcnNpb24tYnV0dG9uLXNlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+YWRkX3Nob3BwaW5nX2NhcnQ8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09OVkVSU0lPTicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpY29uLXNlbGVjdGVkXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBUkJ1dHRvblwiIChjbGljayk9XCJzdGFydEFSU2Vzc2lvbigpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+d2Vla2VuZDwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBUicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uLWVsZXZhdGlvblxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZE9iamVjdCAmJiBzZWxlY3RlZE9iamVjdC5lbGV2YXRpb25BZGp1c3RhYmxlXCJcclxuICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCI+XHJcbiAgICAgICAgPC9idXR0b24tZWxldmF0aW9uPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzYWxhYmxlT2JqZWN0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlciBjb250ZXh0LW1lbnVcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImFkZFRvQ2FydChzZWxlY3RlZE9iamVjdClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gYWRkLXRvLWNhcnQtYnV0dG9uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBbc3ZnSWNvbl09XCInY2FydC1zaG9wcGluZy1yZWd1bGFyJ1wiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0FERF9UT19DQVJUJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1pdGVtLWNvbnRleHQtbWVudT5cclxuXHJcbiAgICA8cnAtaXRlbS1jb250ZXh0LW1lbnUgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNob3dHcm91cE1lbnUgJiYgIXVzZXJJc0dyb3VwaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJzZWxlY3RlZE9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZVByZXNzZWQpPVwiaGFuZGxlRGVsZXRlT2JqZWN0KClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvbkdyb3VwQ2xpY2soKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvblVuR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+bGlua19vZmY8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnVU5HUk9VUCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkT2JqZWN0KClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5kZWxldGU8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnUkVNT1ZFJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93TG9ja0J1dHRvbiAmJiBzZWxlY3RlZE9iamVjdCAmJiBzaG93R3JvdXBFZGl0TWVudUJ1dHRvbnNcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cInNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdsb2NrJyA6ICdsb2NrX29wZW4nXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkxpYnJhcnk+XHJcbiAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAqbmdJZj1cIiFwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCB2aWV3TW9kZVNlcnZpY2UuaXNXYWxrVGhyb3VnaFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgbWF0SWNvbj1cImhvbWVcIlxyXG4gICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLkFyY2hpdGVjdHVyZSB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkFjY2Vzc29pcmVzPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHZpZXdNb2RlU2VydmljZS5pc1dhbGtUaHJvdWdoVmlld0FjdGl2ZSgpXCJcclxuICAgICAgICBtYXRJY29uPVwibG9jYWxfZmxvcmlzdFwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuQWNjZXNzb3JpZXMgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAob25DbGljayk9XCJzaG93QWNjZXNzb2lyZUNhdGVnb3JpZXMoKVwiXHJcbiAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb24yZFZpZXc+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICpuZ0lmPVwiIXBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgc3ZnSWNvbj1cImN1YmUtdW5mb2xkZWRcIlxyXG4gICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlR3b2RGbG9vcnBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgfHwgIWRlc2t0b3BTaXplU2NyZWVuXCJcclxuICAgICAgICAob25DbGljayk9XCJ1cGRhdGVNb2RlKHZpZXdNb2Rlcy5GbG9vclBsYW4yRCwgdHJ1ZSlcIlxyXG4gICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uM2RWaWV3PlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgc3ZnSWNvbj1cImN1YmUtb3V0bGluZVwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuVGhyZWVkUm9vbXBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzM2RWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInVwZGF0ZU1vZGUodmlld01vZGVzLlJvb21QbGFuM0QsIHRydWUpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPHJwLXpvb20tY29udHJvbHNcclxuICAgICAgW3Zpc2libGVdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAob25ab29tSW4pPVwiem9vbUluKClcIlxyXG4gICAgICAob25ab29tUmVzZXQpPVwiem9vbVJlc2V0KClcIlxyXG4gICAgICAob25ab29tT3V0KT1cInpvb21PdXQoKVwiXHJcbiAgICA+PC9ycC16b29tLWNvbnRyb2xzPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb25TZXR0aW5ncz5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyX19kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgbWF0SWNvbj1cInNldHRpbmdzXCJcclxuICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5TZXR0aW5ncyB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInNob3dTZXR0aW5ncygpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZhcT5cclxuICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICpuZ0lmPVwic2hvd0ZhcSgpXCJcclxuICAgICAgICBtYXRJY29uPVwiaGVscFwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuRmFxIHwgbG9jYWxpemV9fVwiXHJcbiAgICAgICAgKG9uQ2xpY2spPVwib3BlbkZhcSh0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZlZWRiYWNrPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgKm5nSWY9XCJzaG93RmVlZGJhY2soKVwiXHJcbiAgICAgICAgbWF0SWNvbj1cImNoYXRfYnViYmxlXCJcclxuICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5GZWVkYmFjayB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cIm9wZW5GZWVkYmFjayh0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mZWVkYmFja1VybClcIlxyXG4gICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb25DYXJ0PlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXJfX2RpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgIDxycC10b29sYmFyLWljb24gY2xhc3M9XCJhZGQtdG8tY2FydC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHN2Z0ljb249XCJjYXJ0LXNob3BwaW5nLXJlZ3VsYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eydBRERfVE9fQ0FSVCcgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRBbGxUb0NhcnQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNzZXR0aW5nc1NpZGViYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2V0dGluZ3NcclxuICAgICAgICBbcGxhY2VDYW1lcmFEaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCBpdGVtU2VydmljZS5nZXRXYWxrdGhyb3VnaENhbWVyYSgpXCJcclxuICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KClcIlxyXG4gICAgICAgIChvbldhbGxzSGVpZ2h0VXBkYXRlKT1cIndhbGxzSGVpZ2h0VXBkYXRlZCgkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICA8L3JwLXNldHRpbmdzPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2NhdGVnb3JpZXNTaWRlYmFyPlxyXG4gICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnQVJDSElURUNUVVJFJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgPC9oZWFkZXI+XHJcbiAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgW2NhdGVnb3JpZXNdPVwiY2F0ZWdvcmllc1wiXHJcbiAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICA8L3JwLWNhdGVnb3J5LWxpYnJhcnk+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0FDQ0VTU09JUkVTJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgPC9oZWFkZXI+XHJcbiAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgW2NhdGVnb3JpZXNdPVwiYWNjZXNzb2lyZUNhdGVnb3JpZXNcIlxyXG4gICAgICAgIChjYXRlZ29yeUNsaWNrKT1cInNob3dMaWJyYXJ5Q2F0ZWdvcnkoJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1jYXRlZ29yeS1saWJyYXJ5PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVNoYXBlQ3JlYXRvclNpZGVCYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdDVVNUT01fU0hBUEVfQ1JFQVRPUicgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtY3VzdG9tLXNoYXBlLWNyZWF0b3IgW3NoYXBlXT1cInNlbGVjdGVkT2JqZWN0XCI+PC9ycC1jdXN0b20tc2hhcGUtY3JlYXRvcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyPlxyXG4gICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnQ1VTVE9NX1NIQVBFX0NSRUFUT1InIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICA8L2hlYWRlcj5cclxuICAgICAgPGN1c3RvbS1jeWxpbmRlci1jcmVhdG9yIFtzaGFwZV09XCJzZWxlY3RlZE9iamVjdFwiPjwvY3VzdG9tLWN5bGluZGVyLWNyZWF0b3I+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbGlicmFyeVNpZGViYXI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cIndpdGgtc2Nyb2xsYWJsZS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2hvd0FjdGl2ZUNhdGVnb3J5U2lkZWJhcigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5hcnJvd19iYWNrX2lvczwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnkubmFtZSB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5LmRlc2NyaXB0aW9uXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeS5kZXNjcmlwdGlvbiB8IGxvY2FsaXplIH19PC9wPlxyXG4gICAgICAgIDxzZWN0aW9uIGZ4RmxleD1cImdyb3dcIiAqbmdJZj1cImxpYnJhcnlPYmplY3RzPy5sZW5ndGggPiAwIHx8IGhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0yXCI+e3sgJ0NVU1RPTScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgIDxycC1vYmplY3QtbGlicmFyeVxyXG4gICAgICAgICAgICAgIFtvYmplY3RzXT1cImN1c3RvbU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKHJlbGVhc2VEcmFnZ2VkKT1cInJlbGVhc2VEcmFnZ2VkKClcIlxyXG4gICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvcnAtb2JqZWN0LWxpYnJhcnk+XHJcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlicmFyeU9iamVjdHM/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMlwiPnt7ICdMSUJSQVJZJyB8IGxvY2FsaXplIH19PC9oMz5cclxuICAgICAgICAgICAgPHJwLW9iamVjdC1saWJyYXJ5XHJcbiAgICAgICAgICAgICAgW29iamVjdHNdPVwibGlicmFyeU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKHJlbGVhc2VEcmFnZ2VkKT1cInJlbGVhc2VEcmFnZ2VkKClcIlxyXG4gICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvcnAtb2JqZWN0LWxpYnJhcnk+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkT2JqZWN0U2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ09CSkVDVCcgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtb2JqZWN0XHJcbiAgICAgICAgW29iamVjdF09XCJzZWxlY3RlZE9iamVjdFwiXHJcbiAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC1vYmplY3Q+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRXYWxsU2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1dBTEwnfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtd2FsbFxyXG4gICAgICAgIFt3YWxsXT1cInNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgW3RleHR1cmVQbGFuZV09XCJzZWxlY3RlZEVkZ2VzWzBdXCJcclxuICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5XYWxsSGVpZ2h0KHNlbGVjdGVkV2FsbClcIlxyXG4gICAgICAgIFttYXhXYWxsSGVpZ2h0XT1cIm1heFdhbGxIZWlnaHRcIlxyXG4gICAgICAgIFttYXhXYWxsVGhpY2tuZXNzXT1cIm1heFdhbGxUaGlja25lc3NcIlxyXG4gICAgICAgIFttYXhXYWxsTGVuZ3RoXT1cIm1heFdhbGxMZW5ndGhcIlxyXG4gICAgICAgIFttaW5XYWxsTGVuZ3RoXT1cIm1pbldhbGxMZW5ndGhcIlxyXG4gICAgICAgIChyZW1vdmUpPVwicmVtb3ZlV2FsbCgkZXZlbnQpXCJcclxuICAgICAgICAoc2V0TGVuZ3RoKT1cInNldFdhbGxMZW5ndGgoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNldEhlaWdodCk9XCJzZXRXYWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgIChzZXRUaGlja25lc3MpPVwic2V0V2FsbFRoaWNrbmVzcygkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0Q29ybmVyKT1cInNlbGVjdENvcm5lcigkZXZlbnQpXCJcclxuICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRXYWxsVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAoc2V0Q29sb3IpPVwic2V0V2FsbENvbG9yKCRldmVudClcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvcnAtc2VsZWN0ZWQtd2FsbD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiIFt0ZXh0Q29udGVudF09XCInU0VUVElOR1MnIHwgbG9jYWxpemVcIj48L2gyPlxyXG4gICAgICA8L2hlYWRlcj5cclxuICAgICAgPHJwLXNlbGVjdGVkLXRocmVlZC1vYmplY3RcclxuICAgICAgICBbb2JqZWN0XT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgICBbc2hvd0NvcHldPVwic2hvd0NvcHlCdXR0b25cIlxyXG4gICAgICAgIFtzaG93RGVsZXRlXT1cInNob3dEZWxldGVCdXR0b25cIlxyXG4gICAgICAgIFtzaG93TG9ja109XCJzaG93TG9ja0J1dHRvblwiXHJcbiAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC10aHJlZWQtb2JqZWN0PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkRmxvb3JTaWRlYmFyPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnRkxPT1InIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtZmxvb3JcclxuICAgICAgICBbZmxvb3JdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgW3RleHR1cmVQbGFuZV09XCJzZWxlY3RlZEZsb29yXCJcclxuICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRGbG9vclRleHR1cmUoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNldENvbG9yKT1cInNldEZsb29yQ29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNlbGVjdGVkRmxvb3JDbG9zZWQpPVwic2VsZWN0ZWRGbG9vciA9IHVuZGVmaW5lZFwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC1mbG9vcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJJc0dyb3VwaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwIG1ycC1zYXZlLWdyb3VwaW5nXCIgKm5nSWY9XCJ1c2VySXNHcm91cGluZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2hlY2s8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVBJTkcnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwiY2FuY2VsR3JvdXBTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNhbmNlbDwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDQU5DRUwnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcm9vbS1wbGFubmVyLmNvbXBvbmVudC5zY3NzJ10vKixcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCovXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb29tUGxhbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBQbHVnaW5JbnRlcmZhY2Uge1xyXG4gIEBWaWV3Q2hpbGQoRmxvb3JwbGFubmVyQ29tcG9uZW50LCB7c3RhdGljOiB0cnVlfSlcclxuICBwdWJsaWMgZmxvb3JwbGFubmVyOiBGbG9vcnBsYW5uZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25MaWJyYXJ5Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uTGlicmFyeTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkFjY2Vzc29pcmVzJywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uQWNjZXNzb2lyZXM6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25TZXR0aW5ncycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvblNldHRpbmdzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uMmRWaWV3Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uMmRWaWV3OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uM2RWaWV3Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uM2RWaWV3OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NhdGVnb3JpZXNTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGNhdGVnb3JpZXNTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2FjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdjdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyJywge3N0YXRpYzogdHJ1ZX0pIGN1c3RvbVNoYXBlQ3JlYXRvclNpZGVCYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhcicsIHtzdGF0aWM6IHRydWV9KSBjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NldHRpbmdzU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZXR0aW5nc1NpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnbGlicmFyeVNpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgbGlicmFyeVNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRPYmplY3RTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkT2JqZWN0U2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RlZFdhbGxTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkV2FsbFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RlZEZsb29yU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZEZsb29yU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkZhcScsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkZhcTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkZlZWRiYWNrJywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uRmVlZGJhY2s6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25DYXJ0Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uQ2FydDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGxheWVyQ2xhc3MgPSAnbGF5ZXInO1xyXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgQE91dHB1dCgpIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNob3dQbHVnaW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXNDb250cm9scyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGljb246IHR5cGVvZiBJY29uRW51bSA9IEljb25FbnVtO1xyXG4gIHB1YmxpYyByZWFkb25seSBpY29uTmFtZTogdHlwZW9mIEljb25OYW1lID0gSWNvbk5hbWU7XHJcbiAgcHVibGljIHJlYWRvbmx5IHZpZXdNb2RlczogdHlwZW9mIFZpZXdNb2RlID0gVmlld01vZGU7XHJcblxyXG4gIG9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgY3VzdG9tT2JqZWN0czogVGhyZWVkTW9kZWxbXTtcclxuICBsaWJyYXJ5T2JqZWN0czogVGhyZWVkTW9kZWxbXTtcclxuICBjYXRlZ29yaWVzOiBDYXRlZ29yeVtdO1xyXG4gIGFjY2Vzc29pcmVDYXRlZ29yaWVzOiBDYXRlZ29yeVtdO1xyXG4gIHNlbGVjdGVkQ2F0ZWdvcnk6IENhdGVnb3J5O1xyXG4gIHNob3dDb250ZXh0TWVudTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHNlbGVjdGVkV2FsbDogV2FsbDtcclxuICBzZWxlY3RlZEVkZ2U6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBGbG9vclBsYW5lSXRlbTtcclxuICBzZWxlY3RlZFJvb206IFJvb207XHJcbiAgc2VsZWN0ZWRPYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyB3YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgPSB0cnVlO1xyXG4gIHB1YmxpYyBtYXhXYWxsSGVpZ2h0OiBudW1iZXI7XHJcbiAgcHVibGljIG1heFdhbGxUaGlja25lc3M6IG51bWJlcjtcclxuICBwdWJsaWMgbWF4V2FsbExlbmd0aDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtaW5XYWxsTGVuZ3RoOiBudW1iZXI7XHJcbiAgcHVibGljIGRlc2t0b3BTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyB0YWJsZXRTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyBwaG9uZVNpemVTY3JlZW46IGJvb2xlYW47XHJcbiAgcHVibGljIGNvbnRleHRNZW51TW91c2VFdmVudDogTW91c2VFdmVudDtcclxuICBwdWJsaWMgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBzaG93Q29uZmlndXJhdGlvbkJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0RlbGV0ZUJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0xvY2tCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBzaG93QVJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBzaG93Q29weUJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0dyb3VwTWVudTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93R3JvdXBFZGl0TWVudUJ1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0ljb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdXNlcklzR3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0NvbnZlcnNpb25CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYWRkU2VsZWN0ZWRDbGFzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzYWxhYmxlT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgcHJpdmF0ZSBfbW9kZSA9IFZpZXdNb2RlLlJvb21QbGFuM0Q7XHJcbiAgcHJpdmF0ZSBfY2F0YWxvZ0lzU2hvd246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfYmxvY2tMZWZ0U2lkZUJhciA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBpY29uU2VydmljZTogSG9tZWRlY29yYXRvckljb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgdmlld01vZGVTZXJ2aWNlOiBWaWV3TW9kZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgbW9kZWxzU2VydmljZTogTW9kZWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldHNTZXJ2aWNlOiBQcmVzZXRzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NyZWVuQW5hbHlzaXM6IFNjcmVlblNpemVBbmFseXNpc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF91dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZmxvb3JwbGFuU2VydmljZTogRmxvb3JwbGFuU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX3Jvb21TZXJ2aWNlOiBSb29tU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NhbWVyYVNlcnZpY2U6IENhbWVyYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VyaWFsaXphdGlvblNlcnZpY2U6IEl0ZW1TZXJpYWxpemF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xpZ2h0c1NlcnZpY2U6IExpZ2h0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hclNlcnZpY2U6IEFyU2VydmljZSxcclxuICAgIHB1YmxpYyBpdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wZXJtYW5lbnRTdG9yZVNlcnZpY2U6IFBlcm1hbmVudFN0b3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2Nvbm5lY3RvclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY29ubmVjdG9yQWRhcHRlclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fcHJlc2V0c1NlcnZpY2UucmVnaXN0ZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgaGFuZGxlRG9jS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZEVkZ2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRFZGdlID9cclxuICAgICAgW3RoaXMuc2VsZWN0ZWRXYWxsW3RoaXMuc2VsZWN0ZWRFZGdlXV0gOlxyXG4gICAgICBbdGhpcy5zZWxlY3RlZFdhbGwgJiYgdGhpcy5zZWxlY3RlZFdhbGwuYmFja0VkZ2UsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdhbGwgJiYgdGhpcy5zZWxlY3RlZFdhbGwuZnJvbnRFZGdlXHJcbiAgICAgIF0uZmlsdGVyKGVkZ2UgPT4gZWRnZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubWF4V2FsbEhlaWdodCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWF4V2FsbEhlaWdodCk7XHJcbiAgICB0aGlzLm1heFdhbGxUaGlja25lc3MgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1heFdhbGxUaGlja25lc3MpO1xyXG4gICAgdGhpcy5tYXhXYWxsTGVuZ3RoID0gdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5NYXhXYWxsTGVuZ3RoKTtcclxuICAgIHRoaXMubWluV2FsbExlbmd0aCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWluV2FsbExlbmd0aCk7XHJcblxyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uTGlicmFyeSxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogMjAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkFjY2Vzc29pcmVzLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiAyMDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uMmRWaWV3LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA0MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uM2RWaWV3LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA0MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uU2V0dGluZ3MsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDUwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25GYXEsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDYwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25GZWVkYmFjayxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNzAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkNhcnQsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDEwMDBcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fYXBwU2VydmljZS5jYXRlZ29yaWVzTG9hZGVkLnN1YnNjcmliZSgoY2F0ZWdvcmllczogQ2F0ZWdvcnlbXSkgPT4ge1xyXG4gICAgICAgIGlmIChjYXRlZ29yaWVzKSB7XHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSB0aGlzLl9hcHBTZXJ2aWNlLmdldENhdGVnb3JpZXMoJ2FyY2hpdGVjdHVyZScpO1xyXG4gICAgICAgICAgdGhpcy5hY2Nlc3NvaXJlQ2F0ZWdvcmllcyA9IHRoaXMuX2FwcFNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygnYWNjZXNzb2lyZXMnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLnZpZXdNb2RlU2VydmljZS52aWV3TW9kZUNoYW5nZWQuc3Vic2NyaWJlKChtb2RlOiBWaWV3TW9kZSkgPT4gdGhpcy5fdmlld01vZGVDaGFuZ2VkKG1vZGUpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldDJEVmlldywgKHtzZW5kVXBkYXRlc30pID0+IHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5GbG9vclBsYW4yRCwgc2VuZFVwZGF0ZXMpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldDNEVmlldywgKHtzZW5kVXBkYXRlc30pID0+IHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5Sb29tUGxhbjNELCBzZW5kVXBkYXRlcykpLFxyXG4gICAgICB0aGlzLl9pbml0U2NyZWVuU2l6ZUhhbmRsaW5nKCksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Hcm91cE1vZGVDaGFuZ2VkLCAoe3Nob3dHcm91cE1lbnV9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93R3JvdXBNZW51ID0gc2hvd0dyb3VwTWVudTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtU2VsZWN0ZWQsIChpdGVtKSA9PiB0aGlzLm9iamVjdFNlbGVjdGVkKGl0ZW0pKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkl0ZW1VbnNlbGVjdGVkLCAoaXRlbSkgPT4gdGhpcy5vYmplY3RVbnNlbGVjdGVkKCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuTGVmdFNpZGViYXJDbG9zZUNsaWNrZWQsICgpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdhbGwgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZSksXHJcbiAgICAgIHRoaXMuX3Jvb21TZXJ2aWNlLndhbGxTZWxlY3RlZC5zdWJzY3JpYmUoKHNlbGVjdGVkV2FsbEV2ZW50OiBTZWxlY3RlZFdhbGxFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdFdhbGwoc2VsZWN0ZWRXYWxsRXZlbnQpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fcm9vbVNlcnZpY2UuZmxvb3JTZWxlY3RlZC5zdWJzY3JpYmUoKHNlbGVjdGVkRmxvb3JFdmVudDogU2VsZWN0ZWRGbG9vckV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRXYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdEZsb29yKHNlbGVjdGVkRmxvb3JFdmVudCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5jb3B5SXRlbS5zdWJzY3JpYmUoKGl0ZW06IEl0ZW0pID0+IHRoaXMuX2NvcHlJdGVtKGl0ZW0pKSxcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuZGVsZXRlSXRlbS5zdWJzY3JpYmUoKGl0ZW06IEl0ZW0pID0+IHRoaXMuX3JlbW92ZU9iamVjdChpdGVtKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TaG93UHJvZHVjdENhdGFsb2csICgpID0+IHRoaXMuX2NhdGFsb2dJc1Nob3duID0gdHJ1ZSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2csICgpID0+IHRoaXMuX2NhdGFsb2dJc1Nob3duID0gZmFsc2UpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuQmxvY2tMZWZ0U2lkZWJhciwgKGJsb2NrKSA9PiB0aGlzLl9ibG9ja0xlZnRTaWRlQmFyID0gYmxvY2spLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuU2hvd0Z1cm5pdHVyZVNpZGViYXIsIChjYXRlZ29yeTogQ2F0ZWdvcnkpID0+IHRoaXMuc2hvd0xpYnJhcnlDYXRlZ29yeShjYXRlZ29yeSkpLFxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2Uub2JqZWN0TW92aW5nT3JSb3RhdGluZy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zaG93QVJCdXR0b24gPSB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnNob3dBckJ1dHRvbiAmJiBhd2FpdCB0aGlzLl9hclNlcnZpY2UuYXJTdXBwb3J0ZWQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMudG9vbGJhckljb25MaWJyYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvbkFjY2Vzc29pcmVzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvblNldHRpbmdzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvbjJkVmlldyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb24zZFZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5hY2Nlc3NvaXJlc0NhdGVnb3JpZXNTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZXR0aW5nc1NpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmxpYnJhcnlTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vclNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTY3JlZW5TaXplSGFuZGxpbmcoKTogU3Vic2NyaXB0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JlZW5BbmFseXNpcy5zY3JlZW5TaXplQ2hhbmdlZC5zdWJzY3JpYmUoKGluZm86IFNjcmVlblNpemVJbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMuZGVza3RvcFNpemVTY3JlZW4gPSBpbmZvLmlzRGVza3RvcFNpemU7XHJcbiAgICAgIHRoaXMudGFibGV0U2l6ZVNjcmVlbiA9IGluZm8uaXNUYWJsZXRTaXplO1xyXG4gICAgICB0aGlzLnBob25lU2l6ZVNjcmVlbiA9IGluZm8uaXNQaG9uZVNpemU7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZGVza3RvcFNpemVTY3JlZW4gJiYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgfHwgdGhpcy52aWV3TW9kZVNlcnZpY2UuaXNWUlZpZXdBY3RpdmUoKSkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmlld01vZGVDaGFuZ2VkKG1vZGU6IFZpZXdNb2RlKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gbW9kZTtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICB9XHJcblxyXG4gIG9iamVjdFNlbGVjdGVkKG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5zYWxhYmxlT2JqZWN0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW0pIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEgJiYgdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5nb29kSWQpIHtcclxuICAgICAgICB0aGlzLnNhbGFibGVPYmplY3QgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dTZXR0aW5nc0J1dHRvbiA9IHRoaXMuX2hhc1NldHRpbmdzKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dDb25maWd1cmF0aW9uQnV0dG9uID0gdGhpcy5faXNDb25maWd1cmFibGUodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIHRoaXMuc2hvd0RlbGV0ZUJ1dHRvbiA9IHRoaXMuX2lzRGVsZXRhYmxlKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dDb3B5QnV0dG9uID0gdGhpcy5faXNDb3B5YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29udmVyc2lvbkJ1dHRvbiA9IHRoaXMuX2lzQ29udmVyc2lvbkl0ZW0odGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCkge1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl91dGlsc1NlcnZpY2UuZm9yY2VDaGFuZ2VEZXRlY3Rpb24odGhpcy5fY2QsIHRoaXMsICdzZWxlY3RlZE9iamVjdCcpO1xyXG4gICAgdGhpcy5zZWxlY3RlZCgpO1xyXG4gIH1cclxuXHJcbiAgc2hvd1NlbGVjdGVkT2JqZWN0U2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhO1xyXG4gICAgaWYgKG1ldGFkYXRhICYmIChpc0N1c3RvbVNoYXBlVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkgfHwgaXNDdXN0b21TaGFwZVdhbGxUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5jdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyKTtcclxuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEgJiYgKGlzQ3VzdG9tQ3lsaW5kZXJUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSB8fCBpc0N1c3RvbUN5bGluZGVyV2FsbFR5cGUobWV0YWRhdGEuaXRlbVR5cGUpKSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmN1c3RvbUN5bGluZGVyQ3JlYXRvclNpZGVCYXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZE9iamVjdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUNvbmZpZ3VyYXRpb25CdXR0b25DbGljayhidG46IEN1c3RvbUJ1dHRvbik6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIGJ0bi5oYW5kbGVyKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgb2JqZWN0VW5zZWxlY3RlZCgpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93R3JvdXBFZGl0TWVudUJ1dHRvbnMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkT2JqZWN0SHVkKCkge1xyXG4gICAgdGhpcy5faHVkU2VydmljZS51cGRhdGVTZWxlY3RlZEl0ZW1IdWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVEZWxldGVPYmplY3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCAmJiB0aGlzLl9pc0RlbGV0YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KSkge1xyXG4gICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkT2JqZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWxlY3RlZE9iamVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9yZW1vdmVPYmplY3QodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICB0aGlzLm9iamVjdFVuc2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVMb2NrU2VsZWN0ZWRPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdC5sb2NrZWQgPSAhdGhpcy5zZWxlY3RlZE9iamVjdC5sb2NrZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVPYmplY3Qob2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwKSB7XHJcbiAgICBpZiAoaXNXYWxsVHlwZShvYmplY3QudXNlckRhdGEuaXRlbVR5cGUpKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRXYWxsID0gKDxXYWxsSXRlbT5vYmplY3QpLmN1cnJlbnRXYWxsO1xyXG4gICAgICBpZiAoY3VycmVudFdhbGwpIHtcclxuICAgICAgICBjdXJyZW50V2FsbC5yZW1vdmVJdGVtKDxJdGVtPm9iamVjdCk7XHJcbiAgICAgICAgY3VycmVudFdhbGwucmVtb3ZlT25JdGVtKDxJdGVtPm9iamVjdCk7XHJcbiAgICAgICAgY3VycmVudFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzRnVybml0dXJlVHlwZShvYmplY3QudXNlckRhdGEuaXRlbVR5cGUpKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVtb3ZlU2VsZWN0ZWRGdXJuaXR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0LmNhbkJlUmVtb3ZlZCgpKSB7XHJcbiAgICAgIHRoaXMuX3JlbW92ZUl0ZW0ob2JqZWN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9iamVjdC5yZW1vdmVkKCk7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVJdGVtKG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UucmVtb3ZlSXRlbShvYmplY3QpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdyZW1vdmVPYmplY3QnfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb3B5U2VsZWN0ZWRPYmplY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fY29weUl0ZW0odGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9jb3B5SXRlbShvcmlnaW5hbDogSXRlbSB8IEl0ZW1Hcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZUl0ZW06IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEN1c3RvbVNoYXBlRmxvb3JJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZVdhbGxJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21TaGFwZVdhbGxJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21DeWxpbmRlckl0ZW06IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEN1c3RvbUN5bGluZGVyRmxvb3JJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21DeWxpbmRlcldhbGxJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21DeWxpbmRlcldhbGxJdGVtO1xyXG4gICAgY29uc3QgaXNSZXNpemFibGVEb29yT3JXaW5kb3c6IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEluV2FsbEl0ZW0gJiYgb3JpZ2luYWwuaXNDdXN0b207XHJcbiAgICBpZiAoaXNDdXN0b21TaGFwZUl0ZW0gfHwgaXNDdXN0b21TaGFwZVdhbGxJdGVtIHx8IGlzQ3VzdG9tQ3lsaW5kZXJJdGVtIHx8IGlzQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbSB8fCBpc1Jlc2l6YWJsZURvb3JPcldpbmRvdykge1xyXG4gICAgICBjb25zdCBjb3B5ID0gKG9yaWdpbmFsIGFzIEN1c3RvbVNoYXBlRmxvb3JJdGVtIHwgSW5XYWxsSXRlbSkuY2xvbmVJdGVtKCk7XHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmFkZEl0ZW0oY29weSk7XHJcbiAgICAgIGlmIChjb3B5IGluc3RhbmNlb2YgV2FsbEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjbG9zZXN0V2FsbEVkZ2UgPSB0aGlzLl9yb29tU2VydmljZS5nZXRDbG9zZXN0V2FsbEVkZ2Uob3JpZ2luYWwucG9zaXRpb24ueCwgb3JpZ2luYWwucG9zaXRpb24ueik7XHJcbiAgICAgICAgY29weS5wbGFjZU9uRWRnZShjbG9zZXN0V2FsbEVkZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0RHJhZywgY29weSk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU3RhcnREcmFnLCBvcmlnaW5hbC5wb3NpdGlvbik7XHJcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsLnVzZXJEYXRhICYmIG9yaWdpbmFsLnVzZXJEYXRhLml0ZW1JZGVudGlmaWVyKSB7XHJcbiAgICAgIGlmIChvcmlnaW5hbC5tZXRhZGF0YS50aGlyZFBhcnR5TW9kZWwpIHtcclxuICAgICAgICAvLyBXaGVuIGl0J3MgYSB0aGlyZCBwYXJ0eSBtb2RlbCwgd2Ugc2hvdWxkIGp1c3QgY2xvbmUgdGhlIE9iamVjdCgzRClcclxuICAgICAgICAvLyBjb25zdCBjbG9uZSA9IG9yaWdpbmFsLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5DbG9uZVRoaXJkUGFydHlNb2RlbCwgb3JpZ2luYWwgYXMgSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5Db3B5SU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVLCBvcmlnaW5hbCBhcyBJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZHJhZ2dlZERhdGE6IERyYWdnZWREYXRhID0ge1xyXG4gICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWUsXHJcbiAgICAgICAgdHlwZTogb3JpZ2luYWwubWV0YWRhdGEuaXRlbVR5cGUsXHJcbiAgICAgICAgaU9uZTogZmFsc2UsXHJcbiAgICAgICAgb3ZlcnJpZGVzOiB7XHJcbiAgICAgICAgICByb3RhdGlvbjogb3JpZ2luYWwucm90YXRpb24gJiYgb3JpZ2luYWwucm90YXRpb24uY2xvbmUoKSxcclxuICAgICAgICAgIC8vIHNjYWxlOiBvcmlnaW5hbC5zY2FsZSAmJiBvcmlnaW5hbC5zY2FsZS5jbG9uZSgpLFxyXG4gICAgICAgICAgb3BlbmluZzogKG9yaWdpbmFsIGFzIGFueSkub3BlbmluZyxcclxuICAgICAgICAgIHRleHR1cmU6IChvcmlnaW5hbCBhcyBhbnkpLnRleHR1cmUsXHJcbiAgICAgICAgICBpc0NvcHk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0RHJhZywgZHJhZ2dlZERhdGEpO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgb3JpZ2luYWwucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgem9vbVJlc2V0KCkge1xyXG4gICAgdGhpcy5mbG9vcnBsYW5uZXIuem9vbVJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FudFpvb21PdXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vcnBsYW5uZXIuY2FudFpvb21PdXQ7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FudFpvb21JbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29ycGxhbm5lci5jYW50Wm9vbUluO1xyXG4gIH1cclxuXHJcbiAgem9vbU91dCgpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21PdXQoKTtcclxuICB9XHJcblxyXG4gIHpvb21JbigpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21JbigpO1xyXG4gIH1cclxuXHJcbiAgdW5zZWxlY3RBbGwoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEVkZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdCA9IG51bGw7XHJcbiAgICBpZiAoIXRoaXMuX2Jsb2NrTGVmdFNpZGVCYXIpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGUodmFsdWU6IFZpZXdNb2RlLCBzZW5kVXBkYXRlcyA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gdmFsdWU7XHJcbiAgICBpZiAoc2VuZFVwZGF0ZXMpIHtcclxuICAgICAgdGhpcy52aWV3TW9kZVNlcnZpY2Uuc2V0Vmlld01vZGUodGhpcy5fZmxvb3JwbGFuU2VydmljZS5nZXRTaXplKCksIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UuZ2V0Q2VudGVyKCksIHZhbHVlKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5WaWV3TW9kZUNoYW5nZWQsIHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuY2F0ZWdvcmllc1NpZGViYXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dBY2Nlc3NvaXJlQ2F0ZWdvcmllcygpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcik7XHJcbiAgICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93QWN0aXZlQ2F0ZWdvcnlTaWRlYmFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2hvd0xpYnJhcnlDYXRlZ29yeShjYXRlZ29yeTogQ2F0ZWdvcnkpIHtcclxuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubW9kZWxzU2VydmljZS5nZXRJdGVtc0Zyb21DYXRlZ29yeShjYXRlZ29yeS5pZCk7XHJcbiAgICB0aGlzLmN1c3RvbU9iamVjdHMgPSB0aGlzLm9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiBvYmplY3QuaXNDdXN0b20pO1xyXG4gICAgdGhpcy5saWJyYXJ5T2JqZWN0cyA9IHRoaXMub2JqZWN0cy5maWx0ZXIob2JqZWN0ID0+ICFvYmplY3QuaXNDdXN0b20pO1xyXG4gICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcnk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmxpYnJhcnlTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHNob3dTZXR0aW5ncygpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2V0dGluZ3NTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuRmFxKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gd2luZG93Lm9wZW4odXJsLCB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dGYXEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZhcVVybCAhPT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5GZWVkYmFjayh1cmw6IHN0cmluZykge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mZWVkYmFja1VybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkQWxsVG9DYXJ0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dGZWVkYmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dJY29uID0gdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwgIT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0YWJsZXMgPSBbXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRFZGdlICYmIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsW3RoaXMuc2VsZWN0ZWRFZGdlXSxcclxuICAgICAgdGhpcy5zZWxlY3RlZFdhbGwsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHNlbGVjdGFibGUgPSBzZWxlY3RhYmxlc1swXTtcclxuICAgIGlmIChzZWxlY3RhYmxlKSB7XHJcbiAgICAgIHRoaXMuX21vZGUgPSBWaWV3TW9kZS5Sb29tUGxhbjNEO1xyXG4gICAgICB0aGlzLnNob3dQbHVnaW4uZW1pdChzZWxlY3RhYmxlKTtcclxuICAgIH0gZWxzZSBpZiAoIXNlbGVjdGFibGUpIHtcclxuICAgICAgdGhpcy5kb25lLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmRFZGdlV2FsbFBsYWNlbWVudCh3YWxsLCBlZGdlKSB7XHJcbiAgICBjb25zdCBlZGdlUGxhY2VtZW50cyA9IFsnZnJvbnRFZGdlJywgJ2JhY2tFZGdlJ107XHJcbiAgICByZXR1cm4gZWRnZVBsYWNlbWVudHMucmVkdWNlKChwbGFjZW1lbnQsIHApID0+IHtcclxuICAgICAgaWYgKHdhbGxbcF0gPT09IGVkZ2UpIHtcclxuICAgICAgICBwbGFjZW1lbnQgPSBwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XHJcbiAgICB9LCBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RXYWxsKHNlbGVjdGVkV2FsbEV2ZW50OiBTZWxlY3RlZFdhbGxFdmVudCkge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwgPSBzZWxlY3RlZFdhbGxFdmVudC53YWxsO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudU1vdXNlRXZlbnQgPSBzZWxlY3RlZFdhbGxFdmVudC5ldmVudDtcclxuICAgIGlmIChzZWxlY3RlZFdhbGxFdmVudC53YWxsKSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZFdhbGxFdmVudC5lZGdlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVkZ2UgPSB0aGlzLmZpbmRFZGdlV2FsbFBsYWNlbWVudChzZWxlY3RlZFdhbGxFdmVudC53YWxsLCBzZWxlY3RlZFdhbGxFdmVudC5lZGdlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VsZWN0ZWRXYWxsU2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkV2FsbFNpZGViYXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dTZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rmxvb3Ioc2VsZWN0ZWRGbG9vckV2ZW50OiBTZWxlY3RlZEZsb29yRXZlbnQpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb29tID0gc2VsZWN0ZWRGbG9vckV2ZW50LnJvb207XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSBzZWxlY3RlZEZsb29yRXZlbnQucm9vbS5mbG9vclBsYW5lO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudU1vdXNlRXZlbnQgPSBzZWxlY3RlZEZsb29yRXZlbnQuZXZlbnQ7XHJcbiAgICBpZiAoc2VsZWN0ZWRGbG9vckV2ZW50LnJvb20pIHtcclxuICAgICAgaWYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLnNob3dTZWxlY3RlZEZsb29yU2lkZWJhcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dTZWxlY3RlZEZsb29yU2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkRmxvb3JTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRGbG9vclRleHR1cmUodGV4dHVyZTogVGV4dHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5fcm9vbVNlcnZpY2Uuc2V0Rmxvb3JUZXh0dXJlKHRoaXMuc2VsZWN0ZWRSb29tLCB0ZXh0dXJlKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnZmxvb3JUZXh0dXJlJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Rmxvb3JDb2xvcihjb2xvcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS5zZXRGbG9vckNvbG9yKHRoaXMuc2VsZWN0ZWRSb29tLCBjb2xvcik7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ2Zsb29yQ29sb3InLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVdhbGwod2FsbDogV2FsbCkge1xyXG4gICAgd2FsbC5yZW1vdmUoKTtcclxuICAgIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UucmVtb3ZlV2FsbCh3YWxsKTtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAncmVtb3ZlV2FsbCd9KTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxMZW5ndGgoe2xlbmd0aCwgYXRFbmQsIGVkZ2V9OiB7IGxlbmd0aDogbnVtYmVyLCBhdEVuZDogYm9vbGVhbiwgZWRnZT86IEhhbGZFZGdlIH0pIHtcclxuICAgIGNvbnN0IHdhbGwgPSB0aGlzLnNlbGVjdGVkV2FsbDtcclxuICAgIGNvbnN0IG9yaWdMZW5ndGggPSBlZGdlID8gZWRnZS5pbnRlcmlvckRpc3RhbmNlKCkgOiB3YWxsLmxlbmd0aDtcclxuICAgIGNvbnN0IHN0YXJ0ID0gYXRFbmQgPyB3YWxsLmdldFN0YXJ0KCkgOiB3YWxsLmdldEVuZCgpO1xyXG4gICAgY29uc3QgZW5kID0gYXRFbmQgPyB3YWxsLmdldEVuZCgpIDogd2FsbC5nZXRTdGFydCgpO1xyXG4gICAgY29uc3QgZHggPSBlbmQueCAtIHN0YXJ0Lng7XHJcbiAgICBjb25zdCBkeSA9IGVuZC55IC0gc3RhcnQueTtcclxuICAgIGNvbnN0IGsgPSBsZW5ndGggLyBvcmlnTGVuZ3RoO1xyXG4gICAgZW5kLm1vdmUoayAqIGR4ICsgc3RhcnQueCwgayAqIGR5ICsgc3RhcnQueSk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5fcm9vbVNlcnZpY2UudXBkYXRlRmxvb3JzQW5kRWRnZXMoKS50aGVuKCgpID0+IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhTW92ZW1lbnRDaGFuZ2VkLm5leHQoKSk7XHJcbiAgICB0aGlzLl9saWdodHNTZXJ2aWNlLnVwZGF0ZUFsbE9mZnNldHMoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbExlbmd0aCd9KTtcclxuXHJcbiAgICBpZiAodGhpcy53YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgJiYgdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5TaG93RGV0YWlsZWRXYWxsTWVhc3VyZW1lbnRzKSkge1xyXG4gICAgICBpZiAoZWRnZSAmJiBNYXRoLnJvdW5kKGVkZ2UuaW50ZXJpb3JEaXN0YW5jZSgpKSAhPT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5zaG93V2FsbExlbmd0aEluZm9EaWFsb2coKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1dhbGxMZW5ndGhJbmZvRGlhbG9nKCkge1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4oSW5mb0RpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdGl0bGU6ICdJbmZvJyxcclxuICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgYFJlc3VsdGluZyBsZW5ndGggb2Ygd2FsbCBzbGlnaHRseSBkaWZmZXJzIGZyb20gbGVuZ3RoIHlvdSBzcGVjaWZpZWQuXHJcbiAgICAgICAgICBUbyBmdXJ0aGVyIHJlZmluZSBsZW5ndGggb2YgdGhlIHdhbGwsIHVzZSAyRCBmbG9vcnBsYW4gYmx1ZXByaW50LmBcclxuICAgICAgfSxcclxuICAgICAgbWF4V2lkdGg6ICc1MDBweCdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShkb250U2hvd0FnYWluID0+IHtcclxuICAgICAgdGhpcy53YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgPSAhZG9udFNob3dBZ2FpbjtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxIZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLmhlaWdodCA9IGhlaWdodDtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUNlaWxpbmdzKCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbC5maXJlUmVkcmF3KCk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsSGVpZ2h0J30pO1xyXG4gIH1cclxuXHJcbiAgc2V0V2FsbFRoaWNrbmVzcyh0aGlja25lc3M6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwudGhpY2tuZXNzID0gdGhpY2tuZXNzO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUZsb29yc0FuZEVkZ2VzKCkudGhlbigoKSA9PiB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5uZXh0KCkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsVGhpY2tuZXNzJ30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFdhbGxUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRFZGdlcy5mb3JFYWNoKGFzeW5jIChlZGdlKSA9PiBhd2FpdCBlZGdlLnNldFRleHR1cmUodGV4dHVyZSkpO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGVkRWRnZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2VsZWN0ZWRFZGdlc1tpXS5zZXRUZXh0dXJlKHRleHR1cmUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbFRleHR1cmUnLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRXYWxsQ29sb3IoY29sb3I6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZWxlY3RlZEVkZ2VzLmZvckVhY2goYXN5bmMgKGVkZ2UpID0+IGF3YWl0IGVkZ2Uuc2V0Q29sb3IoY29sb3IpKTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxDb2xvcicsIHBhdGNoOiBmYWxzZX0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q29ybmVyKGNvcm5lcjogQ29ybmVyKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci5zZWxlY3RDb3JuZXIoY29ybmVyKTtcclxuICB9XHJcblxyXG4gIGdldE1pbldhbGxIZWlnaHQod2FsbDogV2FsbCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXdhbGwpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGNvbnN0IGNhc3RlZFdhbGw6IGFueSA9IHdhbGw7XHJcblxyXG4gICAgaWYgKGNhc3RlZFdhbGwuaXRlbXMpIHtcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNhc3RlZFdhbGwuaXRlbXMpIHtcclxuICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGl0ZW0uaGFsZlNpemUueSArIGl0ZW0ucG9zaXRpb24ueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FzdGVkV2FsbC5vbkl0ZW1zKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjYXN0ZWRXYWxsLm9uSXRlbXMpIHtcclxuICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGl0ZW0uaGFsZlNpemUueSArIGl0ZW0ucG9zaXRpb24ueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICBjb25zdCB3YWxscyA9IHRoaXMuX3Jvb21TZXJ2aWNlLndhbGxzO1xyXG4gICAgaWYgKCF3YWxscykge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAuLi53YWxscy5tYXAodGhpcy5nZXRNaW5XYWxsSGVpZ2h0KSk7XHJcbiAgfVxyXG5cclxuICB3YWxsc0hlaWdodFVwZGF0ZWQoaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZVdhbGxIZWlnaHRzKGhlaWdodCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxIZWlnaHQnfSk7XHJcbiAgfVxyXG5cclxuICBzZXREcmFnZ2VkKG9iamVjdDogTW9kZWxJbnRlcmZhY2UpIHtcclxuICAgIGNvbnN0IGRyYWdnZWREYXRhOiBEcmFnZ2VkRGF0YSA9IHtcclxuICAgICAgbmFtZTogb2JqZWN0Lm5hbWUsXHJcbiAgICAgIHR5cGU6ICtvYmplY3QudHlwZSxcclxuICAgICAgaU9uZTogZmFsc2VcclxuICAgIH07XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGRyYWdnZWREYXRhKTtcclxuICB9XHJcblxyXG4gIHJlbGVhc2VEcmFnZ2VkKCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5FeGl0RHJhZyk7XHJcbiAgfVxyXG5cclxuICBsb2FkRmxvb3JQbGFuKGRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLmxvYWRGbG9vcnBsYW4oZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRBUlNlc3Npb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCkge1xyXG4gICAgICBjb25zdCBhck9iamVjdCA9IHRoaXMuc2VsZWN0ZWRPYmplY3QuY2xvbmVWaXNpYmxlKCk7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5hck1vZGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYWRkT2JqZWN0KGFyT2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhZGRUb0NhcnQob2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChvYmplY3QubWV0YWRhdGEpIHtcclxuICAgICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5fY29ubmVjdG9yQWRhcHRlclNlcnZpY2UuaW5pdENvbm5lY3RvcihcclxuICAgICAgICBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzIDogdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MsXHJcbiAgICAgICAgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzICYmIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlID8gb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2Uuc291cmNlSWQgOiBudWxsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX2Nvbm5lY3RvclNlcnZpY2UuYWRkVG9DYXJ0KFxyXG4gICAgICAgICtvYmplY3QubWV0YWRhdGEuZ29vZElkLCBvYmplY3QubWV0YWRhdGEuZ29vZFR5cGUsIDEsICtvYmplY3QubWV0YWRhdGEuaXRlbUlkLCAhIShvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyAmJiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZSkpO1xyXG4gICAgICBpZiAob2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MpIHtcclxuICAgICAgICBjb25zdCBleHRlcm5hbFNvdXJjZTogRXh0ZXJuYWxTb3VyY2VBcnRpY2xlQWRkSW50ZXJmYWNlID0ge1xyXG4gICAgICAgICAgYXJ0aWNsZToganNvbixcclxuICAgICAgICAgIHF1YW50aXR5OiAxLFxyXG4gICAgICAgICAgY2F0YWxvZ0RlZmluaXRpb246IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmNhdGFsb2dEZWZpbml0aW9uLFxyXG4gICAgICAgICAgZXh0ZXJuYWxTb3VyY2U6IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuYWRkRXh0ZXJuYWxTb3VyY2VUb0NhcnQubmV4dChleHRlcm5hbFNvdXJjZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmFkZFRvQ2FydC5uZXh0KHthcnRpY2xlOiBqc29uLCBxdWFudGl0eTogMX0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkSXRlbXMoZGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbU1vZGVsIG9mIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKGl0ZW1Nb2RlbC54cG9zLCBpdGVtTW9kZWwueXBvcywgaXRlbU1vZGVsLnpwb3MpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlcyA9IHtcclxuICAgICAgICAgIHdpZHRoOiBpdGVtTW9kZWwud2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGl0ZW1Nb2RlbC5oZWlnaHQsXHJcbiAgICAgICAgICB0ZXh0dXJlOiBpdGVtTW9kZWwudGV4dHVyZSxcclxuICAgICAgICAgIHJvdGF0aW9uOiBuZXcgRXVsZXIoMCwgaXRlbU1vZGVsLnJvdGF0aW9uLCAwKSxcclxuICAgICAgICAgIG9wZW5pbmc6IGl0ZW1Nb2RlbC5vcGVuaW5nLFxyXG4gICAgICAgICAgZnJhbWVDb2xvcjogaXRlbU1vZGVsLmZyYW1lQ29sb3IsXHJcbiAgICAgICAgICBkb29yQ29sb3I6IGl0ZW1Nb2RlbC5kb29yQ29sb3IsXHJcbiAgICAgICAgICB3aW5kb3dDb2xvcjogaXRlbU1vZGVsLndpbmRvd0NvbG9yLFxyXG4gICAgICAgICAgbG9ja2VkOiBpdGVtTW9kZWwubG9ja2VkLFxyXG4gICAgICAgICAgaXNHbGFzczogaXRlbU1vZGVsLmlzR2xhc3NcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IG1vZGVsRGF0YSA9IGF3YWl0IHRoaXMubW9kZWxzU2VydmljZS5nZXQoaXRlbU1vZGVsLml0ZW1fbmFtZSwgb3ZlcnJpZGVzKTtcclxuICAgICAgICBpZiAobW9kZWxEYXRhKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5faXRlbVNlcnZpY2UuYWRkSnNvbkl0ZW0obW9kZWxEYXRhLCBwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAoaXRlbU1vZGVsLml0ZW1Hcm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWF0dGFjaFRvSXRlbUdyb3VwKGl0ZW1Nb2RlbC5pdGVtR3JvdXAsIGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBXYWxsSXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0V2FsbEVkZ2UgPSB0aGlzLl9yb29tU2VydmljZS5nZXRDbG9zZXN0V2FsbEVkZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueik7XHJcbiAgICAgICAgICAgIGl0ZW0ucGxhY2VPbkVkZ2UoY2xvc2VzdFdhbGxFZGdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbmFibGUgdG8gZ2V0IG1vZGVsIGZvciAke2l0ZW1Nb2RlbC5pdGVtX25hbWV9IGZyb20gTW9kZWxzU2VydmljZWApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZE9iamVjdHMoe2l0ZW1zLCBmbG9vcnBsYW59KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMubG9hZEl0ZW1zKGl0ZW1zKSxcclxuICAgICAgdGhpcy5sb2FkRmxvb3JQbGFuKGZsb29ycGxhbiksXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5U2NlbmVJbnN0YW5jZShzYXZlQXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24pID0+IHJlc29sdmUoKSk7XHJcbiAgfVxyXG5cclxuICBnZXRPYmplY3RzKCkge1xyXG4gICAgY29uc3QgaXRlbXNUb1NhdmUgPSB0aGlzLl9pdGVtU2VydmljZS5nZXROb25GdXJuaXR1cmUoKS5tYXAoaSA9PiB0aGlzLl9pdGVtU2VyaWFsaXphdGlvblNlcnZpY2UuaXRlbVRvT2JqZWN0KGkpKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZsb29ycGxhbjogdGhpcy5fZmxvb3JwbGFuU2VydmljZS5zYXZlRmxvb3JwbGFuKCksXHJcbiAgICAgIGl0ZW1zOiBpdGVtc1RvU2F2ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGhhc0N1c3RvbU9iamVjdHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21PYmplY3RzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25PYmplY3RMaWJyYXJ5Q2xpY2sob2JqZWN0OiBNb2RlbEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWxlYXNlRHJhZ2dlZCgpO1xyXG4gICAgdGhpcy5zZXREcmFnZ2VkKG9iamVjdCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywge3g6IDAsIHk6IDB9KTtcclxuICAgIGlmIChvYmplY3QubmFtZSA9PT0gJ1dhbGt0aHJvdWdoIENhbWVyYScpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uR3JvdXBDbGljaygpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuR3JvdXBPYmplY3RzKTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsR3JvdXBTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJJc0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkNhbmNlbEdyb3VwT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIG9uVW5Hcm91cENsaWNrKCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5Vbmdyb3VwT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDb250ZXh0TWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRHcm91cFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xyXG4gICAgdGhpcy51c2VySXNHcm91cGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0R3JvdXBPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmRDb252ZXJzaW9uVG9UYWdNYW5hZ2VyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYXJ0aWNsZTogSXRlbSB8IEl0ZW1Hcm91cCA9IHRoaXMuc2VsZWN0ZWRPYmplY3Q7XHJcbiAgICBsZXQgY29udmVyc2lvbkFjdGlvbjogc3RyaW5nO1xyXG4gICAgaWYgKGFydGljbGUgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kKSB7XHJcbiAgICAgICAgY29udmVyc2lvbkFjdGlvbiA9ICdyZW1vdmUnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2xhc3MgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb252ZXJzaW9uQWN0aW9uID0gJ2FkZCc7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9nb29nbGVUYWdNYW5hZ2VyLnNlbmRQcm9kdWN0Q29udmVyc2lvbihhcnRpY2xlLm1ldGFkYXRhLCBjb252ZXJzaW9uQWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhc1NldHRpbmdzKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZTogYm9vbGVhbiA9IGl0ZW0ubWV0YWRhdGEgJiYgKFxyXG4gICAgICBpc0N1c3RvbVNoYXBlVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSB8fFxyXG4gICAgICBpc0N1c3RvbVNoYXBlV2FsbFR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21DeWxpbmRlclR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpXHJcbiAgICApO1xyXG4gICAgY29uc3QgaGFzQ29uZmlndXJhYmxlVGV4dHVyZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIShpdGVtLm1ldGFkYXRhICYmIGl0ZW0ubWV0YWRhdGEudGV4dHVyZSk7XHJcbiAgICBjb25zdCBoYXNPcGVuaW5nQXR0cmlidXRlOiBib29sZWFuID0gISFpdGVtICYmICEhaXRlbS5vcGVuaW5nO1xyXG4gICAgY29uc3QgaXNTY2FsYWJsZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIShpdGVtLm1ldGFkYXRhICYmIGl0ZW0ubWV0YWRhdGEuc2NhbGFibGUpO1xyXG5cclxuICAgIHJldHVybiBpc0N1c3RvbVNoYXBlIHx8IGhhc0NvbmZpZ3VyYWJsZVRleHR1cmUgfHwgaGFzT3BlbmluZ0F0dHJpYnV0ZSB8fCBpc1NjYWxhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb25maWd1cmFibGUoaXRlbTogSXRlbSB8IEl0ZW1Hcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoaXRlbSBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkgJiYgISFpdGVtICYmICEhaXRlbS5tZXRhZGF0YSAmJiAhIWl0ZW0ubWV0YWRhdGEuaXRlbUlkZW50aWZpZXIgJiYgaXRlbS5jb25maWd1cmFibGUgJiZcclxuICAgICAgIWl0ZW0uYWxsd2F5c0NvbmZpZ3VyZU1vZGUgJiYgIWl0ZW0ub2Jzb2xldGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NvbnZlcnNpb25JdGVtKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGlmIChpdGVtLm1ldGFkYXRhLmlvbmUpIHtcclxuICAgICAgcmV0dXJuIGl0ZW0ubWV0YWRhdGEuaW9uZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzRGVsZXRhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBSb29tIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsKSAmJlxyXG4gICAgICAoKGl0ZW0gaW5zdGFuY2VvZiBJdGVtICYmIGl0ZW0uY2FuRGVsZXRlKSB8fCAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NvcHlhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzTm90Um9vbU9yV2FsbE9yRGVjb3JhdGlvbjogYm9vbGVhbiA9ICEoaXRlbSBpbnN0YW5jZW9mIFJvb20gfHwgaXRlbSBpbnN0YW5jZW9mIFdhbGwgfHwgaXRlbSBpbnN0YW5jZW9mIEZsb29yUGxhbmVJdGVtKTtcclxuICAgIGNvbnN0IGlzQ29weWFibGVJdGVtOiBib29sZWFuID0gKChpdGVtIGluc3RhbmNlb2YgSXRlbSAmJiBpdGVtLmNhbkNvcHkgJiYgIWl0ZW0ub2Jzb2xldGUpIHx8ICEoaXRlbSBpbnN0YW5jZW9mIEl0ZW0pKSAmJlxyXG4gICAgICAhdGhpcy5faXRlbVNlcnZpY2UuZ2V0V2Fsa3Rocm91Z2hDYW1lcmEoKTtcclxuICAgIHJldHVybiBpc05vdFJvb21PcldhbGxPckRlY29yYXRpb24gJiYgaXNDb3B5YWJsZUl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZWF0dGFjaFRvSXRlbUdyb3VwKGl0ZW1Hcm91cCwgb2JqZWN0KSB7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKG9iamVjdCk7XHJcbiAgICBpdGVtR3JvdXAuYWRkSXRlbShvYmplY3QpO1xyXG4gICAgaXRlbUdyb3VwLmNyZWF0ZUJvdW5kYXJ5Qm94KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleSkge1xyXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICBjYXNlIEtleS5DOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX21vZGUgIT09IFZpZXdNb2RlLkZsb29yUGxhbjJEICYmICF0aGlzLl90ZXh0SW5wdXRBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNob3dQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgS2V5LkE6XHJcbiAgICAgICAgICAvLyBpZiAodGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgIT09IG51bGwgJiYgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPT09IHRoaXMuY2F0ZWdvcmllc1NpZGViYXIpIHtcclxuICAgICAgICAgIC8vICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgICAgICAgLy8gICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAvLyB9IGVsc2VcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCAmJiAhdGhpcy5fY2F0YWxvZ0lzU2hvd24gJiYgIXRoaXMuX3RleHRJbnB1dEFjdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0xpYnJhcnlDYXRlZ29yaWVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEtleS5WOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9jYXRhbG9nSXNTaG93biAmJiAhdGhpcy5fdGV4dElucHV0QWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IFZpZXdNb2RlLlJvb21QbGFuM0QpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuRmxvb3JQbGFuMkQsIHRydWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5Sb29tUGxhbjNELCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBLZXkuRXNjOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX21vZGUgIT09IFZpZXdNb2RlLkZsb29yUGxhbjJEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RleHRJbnB1dEFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChpbnB1dHNbMF0udHlwZSA9PT0gJ3RleHQnICYmIGlucHV0c1tpXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|