@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47
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/README.md +24 -24
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
- package/esm2020/lib/components/loader/loader.component.mjs +23 -23
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
- package/esm2020/lib/config.mjs +4 -4
- package/esm2020/lib/helpers.service.mjs +470 -470
- package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
- package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
- package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
- package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
- package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
- package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
- package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
- package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
- package/esm2020/lib/mattertagData.mjs +165 -165
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
- package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
- package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
- package/esm2020/lib/services/base-tab.service.mjs +24 -24
- package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
- package/esm2020/lib/services/content.service.mjs +135 -135
- package/esm2020/lib/services/filter.service.mjs +599 -599
- package/esm2020/lib/services/intervention.service.mjs +236 -236
- package/esm2020/lib/services/locale.service.mjs +45 -45
- package/esm2020/lib/services/matterport-import.service.mjs +340 -340
- package/esm2020/lib/services/matterport.service.mjs +1587 -1587
- package/esm2020/lib/services/models/affectation.service.mjs +60 -60
- package/esm2020/lib/services/models/base-object.service.mjs +70 -70
- package/esm2020/lib/services/models/capture.service.mjs +34 -34
- package/esm2020/lib/services/models/comment.service.mjs +98 -98
- package/esm2020/lib/services/models/domain.service.mjs +78 -78
- package/esm2020/lib/services/models/equipment.service.mjs +683 -683
- package/esm2020/lib/services/models/event.service.mjs +128 -128
- package/esm2020/lib/services/models/feature.service.mjs +380 -380
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
- package/esm2020/lib/services/models/layer.service.mjs +33 -33
- package/esm2020/lib/services/models/measurement.service.mjs +199 -199
- package/esm2020/lib/services/models/mission.service.mjs +206 -206
- package/esm2020/lib/services/models/navigation.service.mjs +92 -92
- package/esm2020/lib/services/models/node.service.mjs +31 -31
- package/esm2020/lib/services/models/object3D.service.mjs +364 -364
- package/esm2020/lib/services/models/operation.service.mjs +59 -59
- package/esm2020/lib/services/models/organisation.service.mjs +73 -73
- package/esm2020/lib/services/models/plan.service.mjs +799 -799
- package/esm2020/lib/services/models/poi.service.mjs +103 -103
- package/esm2020/lib/services/models/profile.service.mjs +58 -58
- package/esm2020/lib/services/models/property.service.mjs +44 -44
- package/esm2020/lib/services/models/space.service.mjs +204 -204
- package/esm2020/lib/services/models/template.service.mjs +41 -41
- package/esm2020/lib/services/models/ticket.service.mjs +526 -526
- package/esm2020/lib/services/models/visit.service.mjs +130 -130
- package/esm2020/lib/services/models/zone.service.mjs +225 -225
- package/esm2020/lib/services/navigator.service.mjs +212 -212
- package/esm2020/lib/services/s3.service.mjs +137 -137
- package/esm2020/lib/services/search.service.mjs +124 -124
- package/esm2020/lib/services/support.service.mjs +42 -42
- package/esm2020/lib/services/tag.service.mjs +111 -111
- package/esm2020/lib/services/user.service.mjs +501 -501
- package/esm2020/lib/services/validators.service.mjs +50 -50
- package/esm2020/lib/services/viewer.service.mjs +389 -389
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
- package/esm2020/lib/services/zoneChange.service.mjs +30 -30
- package/esm2020/lib/types.service.mjs +311 -311
- package/esm2020/lib/validators/email.directive.mjs +7 -7
- package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
- package/esm2020/lib/validators/number.directive.mjs +12 -12
- package/esm2020/lib/validators/text.directive.mjs +12 -12
- package/esm2020/public-api.mjs +72 -72
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13014 -13014
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/csv-export/csv-export.component.d.ts +18 -18
- package/lib/components/loader/loader.component.d.ts +10 -10
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
- package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
- package/lib/components/search-bar/search-bar.component.d.ts +16 -16
- package/lib/components/support-modal/support-modal.component.d.ts +26 -26
- package/lib/config.d.ts +22 -22
- package/lib/helpers.service.d.ts +79 -79
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
- package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
- package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
- package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
- package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
- package/lib/mattertagData.d.ts +70 -70
- package/lib/ngx-smarterplan-core.module.d.ts +29 -29
- package/lib/ngx-smarterplan-core.service.d.ts +6 -6
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
- package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
- package/lib/pipes/safe-url.pipe.d.ts +10 -10
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
- package/lib/pipes/username-from-id.pipe.d.ts +11 -11
- package/lib/services/amplify-cache.service.d.ts +37 -37
- package/lib/services/base-tab.service.d.ts +10 -10
- package/lib/services/baseVisibility.service.d.ts +9 -9
- package/lib/services/content.service.d.ts +28 -28
- package/lib/services/filter.service.d.ts +60 -60
- package/lib/services/intervention.service.d.ts +25 -25
- package/lib/services/locale.service.d.ts +23 -23
- package/lib/services/matterport-import.service.d.ts +53 -53
- package/lib/services/matterport.service.d.ts +336 -336
- package/lib/services/models/affectation.service.d.ts +14 -14
- package/lib/services/models/base-object.service.d.ts +20 -20
- package/lib/services/models/capture.service.d.ts +13 -13
- package/lib/services/models/comment.service.d.ts +26 -26
- package/lib/services/models/domain.service.d.ts +19 -19
- package/lib/services/models/equipment.service.d.ts +93 -93
- package/lib/services/models/event.service.d.ts +43 -43
- package/lib/services/models/feature.service.d.ts +75 -75
- package/lib/services/models/hashtag.service.d.ts +13 -13
- package/lib/services/models/layer.service.d.ts +11 -11
- package/lib/services/models/measurement.service.d.ts +51 -51
- package/lib/services/models/mission.service.d.ts +39 -39
- package/lib/services/models/navigation.service.d.ts +29 -29
- package/lib/services/models/node.service.d.ts +12 -12
- package/lib/services/models/object3D.service.d.ts +57 -57
- package/lib/services/models/operation.service.d.ts +15 -15
- package/lib/services/models/organisation.service.d.ts +19 -19
- package/lib/services/models/plan.service.d.ts +133 -133
- package/lib/services/models/poi.service.d.ts +25 -25
- package/lib/services/models/profile.service.d.ts +16 -16
- package/lib/services/models/property.service.d.ts +13 -13
- package/lib/services/models/space.service.d.ts +46 -46
- package/lib/services/models/template.service.d.ts +15 -15
- package/lib/services/models/ticket.service.d.ts +93 -93
- package/lib/services/models/visit.service.d.ts +24 -24
- package/lib/services/models/zone.service.d.ts +50 -50
- package/lib/services/navigator.service.d.ts +61 -61
- package/lib/services/s3.service.d.ts +14 -14
- package/lib/services/search.service.d.ts +20 -20
- package/lib/services/support.service.d.ts +17 -17
- package/lib/services/tag.service.d.ts +29 -29
- package/lib/services/user.service.d.ts +118 -118
- package/lib/services/validators.service.d.ts +18 -18
- package/lib/services/viewer.service.d.ts +110 -110
- package/lib/services/zone-drawer.service.d.ts +7 -7
- package/lib/services/zoneChange.service.d.ts +17 -17
- package/lib/types.service.d.ts +842 -842
- package/lib/validators/email.directive.d.ts +2 -2
- package/lib/validators/no-empty.directive.d.ts +2 -2
- package/lib/validators/number.directive.d.ts +2 -2
- package/lib/validators/text.directive.d.ts +2 -2
- package/package.json +2 -2
- package/public-api.d.ts +64 -64
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
|
@@ -1,384 +1,384 @@
|
|
|
1
|
-
import { Component, Inject, ViewChild } from '@angular/core';
|
|
2
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
-
import { waitUntil } from '../../../helpers.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/router";
|
|
6
|
-
import * as i2 from "../../../services/models/space.service";
|
|
7
|
-
import * as i3 from "../../../services/user.service";
|
|
8
|
-
import * as i4 from "../../../services/models/zone.service";
|
|
9
|
-
import * as i5 from "../../../services/models/visit.service";
|
|
10
|
-
import * as i6 from "../../../services/viewer.service";
|
|
11
|
-
import * as i7 from "../../../services/navigator.service";
|
|
12
|
-
import * as i8 from "../../../services/zoneChange.service";
|
|
13
|
-
import * as i9 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
-
import * as i10 from "@angular/forms";
|
|
15
|
-
import * as i11 from "@angular/common";
|
|
16
|
-
import * as i12 from "@ngx-translate/core";
|
|
17
|
-
export class NavigationBarComponent {
|
|
18
|
-
constructor(awsKinesisAnalyticsInjected, router, spaceService, userService, zoneService, visitService, viewerService, navigatorService, zoneChangeService) {
|
|
19
|
-
this.router = router;
|
|
20
|
-
this.spaceService = spaceService;
|
|
21
|
-
this.userService = userService;
|
|
22
|
-
this.zoneService = zoneService;
|
|
23
|
-
this.visitService = visitService;
|
|
24
|
-
this.viewerService = viewerService;
|
|
25
|
-
this.navigatorService = navigatorService;
|
|
26
|
-
this.zoneChangeService = zoneChangeService;
|
|
27
|
-
this.selectedLocation = null;
|
|
28
|
-
this.selectedFloor = null;
|
|
29
|
-
this.selectedZone = null;
|
|
30
|
-
this.selectedChildZone = null;
|
|
31
|
-
this.visitsPerSpace = null;
|
|
32
|
-
this.floorsPerSpace = null;
|
|
33
|
-
this.zonesPerSpace = null;
|
|
34
|
-
this.zonesPerFloor = null;
|
|
35
|
-
this.childrenZones = null;
|
|
36
|
-
this.destroy$ = new Subject();
|
|
37
|
-
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
38
|
-
this.spaceService.locationUpdated
|
|
39
|
-
.pipe(takeUntil(this.destroy$))
|
|
40
|
-
.subscribe((locs) => {
|
|
41
|
-
this.locations = locs;
|
|
42
|
-
if (this.selectedLocation) {
|
|
43
|
-
this.selectedLocation = this.findLocationByID(this.selectedLocation.id); // Update Object (object address will change);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
this.viewerService.viewerIsOn
|
|
47
|
-
.pipe(takeUntil(this.destroy$))
|
|
48
|
-
.subscribe((data) => {
|
|
49
|
-
// console.log('menu navigation received update', data);
|
|
50
|
-
this.currentLocationID = data.spaceID;
|
|
51
|
-
this.currentModel3d = data.model3D;
|
|
52
|
-
if (!data.spaceID) {
|
|
53
|
-
this.selectedLocation = null;
|
|
54
|
-
localStorage.removeItem('locationId');
|
|
55
|
-
this.sendUpdateLocationEvent();
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if ((!this.selectedLocation ||
|
|
59
|
-
this.selectedLocation.id !== data.spaceID) &&
|
|
60
|
-
this.locations) {
|
|
61
|
-
this.selectedLocation = this.findLocationByID(data.spaceID);
|
|
62
|
-
this.sendUpdateLocationEvent();
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
/**
|
|
66
|
-
* We listen for Location change event
|
|
67
|
-
*/
|
|
68
|
-
this.navigatorService.locationIDChange
|
|
69
|
-
.pipe(takeUntil(this.destroy$))
|
|
70
|
-
.subscribe((id) => {
|
|
71
|
-
this.clearData();
|
|
72
|
-
this.currentLocationID = id;
|
|
73
|
-
this.selectedLocation = this.findLocationByID(id);
|
|
74
|
-
this.navigatorService.currentNavBarLocationID = id;
|
|
75
|
-
this.onSelectedLocationChanged().catch((e) => console.log(e.message));
|
|
76
|
-
});
|
|
77
|
-
this.zoneChangeService.zonesForUserChange
|
|
78
|
-
.pipe(takeUntil(this.destroy$))
|
|
79
|
-
.subscribe(async (zones) => {
|
|
80
|
-
if (zones) {
|
|
81
|
-
await waitUntil(() => this.floorsPerSpace !== null);
|
|
82
|
-
const floorZone = zones.find((zone) => zone.layer && zone.layer.name === 'FLOOR');
|
|
83
|
-
if (floorZone) {
|
|
84
|
-
this.selectedFloor = this.floorsPerSpace.find((f) => f.id === floorZone.id);
|
|
85
|
-
// Emit event to dispatch value of this.selectedFloor in all poi/ticket/equipment/measure services
|
|
86
|
-
this.zoneChangeService.floorHasChanged.emit(this.selectedFloor);
|
|
87
|
-
this.onFloorClick(false).catch((e) => console.log(e.message));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
async ngOnInit() {
|
|
93
|
-
await this.initLocations();
|
|
94
|
-
this.handleStartUrl();
|
|
95
|
-
}
|
|
96
|
-
ngOnDestroy() {
|
|
97
|
-
this.destroy$.next(true);
|
|
98
|
-
this.destroy$.complete();
|
|
99
|
-
}
|
|
100
|
-
// Capture the "id" in localisation/:id routes
|
|
101
|
-
handleStartUrl() {
|
|
102
|
-
if (this.router.url.includes('localisation/')) {
|
|
103
|
-
const paths = this.router.url.split('/'); // /dashboard/localisation/fc0aadb7-3c89-4349-ad1f-bfe9b44916c0
|
|
104
|
-
// eslint-disable-next-line prefer-destructuring
|
|
105
|
-
const locID = paths[3];
|
|
106
|
-
if (this.currentLocationID !== locID) {
|
|
107
|
-
this.clearData();
|
|
108
|
-
this.currentLocationID = locID;
|
|
109
|
-
this.selectedLocation = this.findLocationByID(locID);
|
|
110
|
-
this.navigatorService.currentNavBarLocationID = locID;
|
|
111
|
-
this.onSelectedLocationChanged().catch((e) => console.log(e.message));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async initLocations() {
|
|
116
|
-
this.locations = this.spaceService.locationsForUser;
|
|
117
|
-
if (this.locations.length === 0) {
|
|
118
|
-
this.locations = await this.spaceService.getLocationsForCurrentUser();
|
|
119
|
-
}
|
|
120
|
-
if (this.currentLocationID && this.locations.length > 0) {
|
|
121
|
-
this.selectedLocation = this.findLocationByID(this.currentLocationID);
|
|
122
|
-
if (this.selectedLocation) {
|
|
123
|
-
this.sendUpdateLocationEvent();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Find a location with a given ID
|
|
129
|
-
* @param id ID for the location
|
|
130
|
-
* @returns The location or null if no location were found
|
|
131
|
-
*/
|
|
132
|
-
findLocationByID(id) {
|
|
133
|
-
const space = this.locations.find((loc) => loc.id === id);
|
|
134
|
-
return space || null; /** Convert to null if undefined */
|
|
135
|
-
}
|
|
136
|
-
clearData(clearVisits = true) {
|
|
137
|
-
this.floorsPerSpace = null;
|
|
138
|
-
this.selectedFloor = null;
|
|
139
|
-
this.zonesPerFloor = null;
|
|
140
|
-
this.childrenZones = null;
|
|
141
|
-
this.selectedModel3d = null;
|
|
142
|
-
this.sweepToGo = null;
|
|
143
|
-
this.floorToGo = null;
|
|
144
|
-
this.selectedZone = null;
|
|
145
|
-
this.selectedChildZone = null;
|
|
146
|
-
if (clearVisits) {
|
|
147
|
-
this.visitsPerSpace = null;
|
|
148
|
-
this.zonesPerSpace = null;
|
|
149
|
-
}
|
|
150
|
-
localStorage.removeItem('locationId');
|
|
151
|
-
localStorage.removeItem('floorId');
|
|
152
|
-
localStorage.removeItem('zoneId');
|
|
153
|
-
localStorage.removeItem('childZoneId');
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* When the selectedLocation changes
|
|
157
|
-
* Send a event to locationIDChange from NavigatorService
|
|
158
|
-
* The event will be catch by this component and the filter bar will be update
|
|
159
|
-
*/
|
|
160
|
-
sendUpdateLocationEvent() {
|
|
161
|
-
const locationID = this.selectedLocation ? this.selectedLocation.id : null;
|
|
162
|
-
this.navigatorService.locationIDChange.next(locationID);
|
|
163
|
-
if (this.selectedLocation) {
|
|
164
|
-
localStorage.setItem('locationId', this.selectedLocation.id);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
localStorage.removeItem('locationId');
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
async onSelectedLocationChanged() {
|
|
171
|
-
if (!this.selectedLocation) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
try {
|
|
175
|
-
this.visitsPerSpace = await this.visitService.getVisitsForSpaceForUser(this.selectedLocation.id);
|
|
176
|
-
this.zonesPerSpace = await this.zoneService.getZonesBySpaceForUser(this.selectedLocation.id);
|
|
177
|
-
if (this.visitsPerSpace.length === 1) {
|
|
178
|
-
this.selectedModel3d = this.visitsPerSpace[0].model3d;
|
|
179
|
-
this.floorsPerSpace = this.zonesPerSpace.filter((zone) => zone.layer && zone.layer.name.includes('FLOOR'));
|
|
180
|
-
// sort from highest floor to lowest
|
|
181
|
-
this.floorsPerSpace.sort((a, b) => {
|
|
182
|
-
if (a.metadata && b.metadata) {
|
|
183
|
-
const metadataA = JSON.parse(a.metadata);
|
|
184
|
-
const metadataB = JSON.parse(b.metadata);
|
|
185
|
-
return (metadataB.matterportFloorSequence -
|
|
186
|
-
metadataA.matterportFloorSequence);
|
|
187
|
-
}
|
|
188
|
-
return a.name.localeCompare(b.name);
|
|
189
|
-
});
|
|
190
|
-
const multiFloorZones = this.zonesPerSpace.filter((zone) => zone.isMultipleFloorZone);
|
|
191
|
-
// sort alphabetically
|
|
192
|
-
multiFloorZones.sort((a, b) => a.name.localeCompare(b.name));
|
|
193
|
-
// merge multiFloor and Floors
|
|
194
|
-
this.floorsPerSpace = [...this.floorsPerSpace, ...multiFloorZones];
|
|
195
|
-
if (this.floorsPerSpace.length === 1) {
|
|
196
|
-
[this.selectedFloor] = this.floorsPerSpace;
|
|
197
|
-
this.onFloorClick(false).catch((e) => console.log(e.message));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
console.log('error onChosenLocation', error);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
onLocationClick() {
|
|
206
|
-
this.clearData();
|
|
207
|
-
this.sendUpdateLocationEvent();
|
|
208
|
-
}
|
|
209
|
-
async onFloorClick(emitEvent = true) {
|
|
210
|
-
if (this.selectedFloor) {
|
|
211
|
-
localStorage.setItem('floorId', this.selectedFloor.id);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
localStorage.removeItem('floorId');
|
|
215
|
-
}
|
|
216
|
-
if (this.selectedFloor && this.selectedFloor.isMultipleFloorZone) {
|
|
217
|
-
this.selectedZone = this.selectedFloor;
|
|
218
|
-
this.onZoneClick().catch((e) => console.log(e.message));
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
this.onZoneClick().catch((e) => console.log(e.message));
|
|
223
|
-
}
|
|
224
|
-
this.sweepToGo = null;
|
|
225
|
-
this.selectedZone = null;
|
|
226
|
-
this.selectedChildZone = null;
|
|
227
|
-
localStorage.removeItem('zoneId');
|
|
228
|
-
localStorage.removeItem('childZoneId');
|
|
229
|
-
if (this.selectedFloor === null) {
|
|
230
|
-
this.navigatorService.navBarZoneIDChange.next(null);
|
|
231
|
-
this.navigatorService.currentNavBarZoneID = null;
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
if (emitEvent) {
|
|
235
|
-
this.navigatorService.navBarZoneIDChange.next(this.selectedFloor.id);
|
|
236
|
-
}
|
|
237
|
-
this.navigatorService.currentNavBarZoneID = this.selectedFloor.id;
|
|
238
|
-
await waitUntil(() => this.zonesPerSpace !== null && this.zonesPerSpace !== undefined);
|
|
239
|
-
this.zonesPerFloor = this.zonesPerSpace.filter((zone) =>
|
|
240
|
-
// zone.id === this.selectedFloor.id ||
|
|
241
|
-
zone.parentID === this.selectedFloor.id);
|
|
242
|
-
this.zonesPerFloor.sort((a, b) => {
|
|
243
|
-
const Collator = new Intl.Collator(undefined, {
|
|
244
|
-
numeric: true,
|
|
245
|
-
sensitivity: 'accent',
|
|
246
|
-
});
|
|
247
|
-
return (Collator.compare(a.code_ref, b.code_ref) ||
|
|
248
|
-
Collator.compare(a.name, b.name));
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
async onZoneClick() {
|
|
252
|
-
this.selectedChildZone = null;
|
|
253
|
-
localStorage.removeItem('childZoneId');
|
|
254
|
-
if (this.selectedZone) {
|
|
255
|
-
localStorage.setItem('zoneId', this.selectedZone.id);
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
localStorage.removeItem('zoneId');
|
|
259
|
-
}
|
|
260
|
-
if (this.selectedZone === null) {
|
|
261
|
-
if (this.selectedFloor === null) {
|
|
262
|
-
this.navigatorService.navBarZoneIDChange.next(null);
|
|
263
|
-
this.navigatorService.currentNavBarZoneID = null;
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
this.navigatorService.navBarZoneIDChange.next(this.selectedFloor.id);
|
|
267
|
-
this.navigatorService.currentNavBarZoneID = this.selectedFloor.id;
|
|
268
|
-
}
|
|
269
|
-
this.sendKinesisAnalyticsEventForZone(this.selectedZone?.id, this.selectedZone?.name).catch((e) => console.log(e.message));
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
this.childrenZones = this.zonesPerSpace.filter((zone) => zone.parentID === this.selectedZone.id);
|
|
273
|
-
this.navigatorService.navBarZoneIDChange.next(this.selectedZone.id);
|
|
274
|
-
this.navigatorService.currentNavBarZoneID = this.selectedZone.id;
|
|
275
|
-
this.sendKinesisAnalyticsEventForZone(this.selectedZone?.id, this.selectedZone?.name).catch((e) => console.log(e.message));
|
|
276
|
-
}
|
|
277
|
-
onChildZoneClick() {
|
|
278
|
-
if (this.selectedChildZone) {
|
|
279
|
-
localStorage.setItem('childZoneId', this.selectedChildZone?.id);
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
localStorage.removeItem('childZoneId');
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
async sendKinesisAnalyticsEventForZone(zoneId, zoneName) {
|
|
286
|
-
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
287
|
-
this.awsKinesisAnalytics.getInstance().record(
|
|
288
|
-
// @ts-ignore
|
|
289
|
-
{
|
|
290
|
-
data: {
|
|
291
|
-
eventType: 'Zone Change',
|
|
292
|
-
zoneId: zoneId,
|
|
293
|
-
zoneName: zoneName,
|
|
294
|
-
locationId: this.selectedLocation?.id,
|
|
295
|
-
locationName: this.selectedLocation?.name,
|
|
296
|
-
user: this.userService?.cu,
|
|
297
|
-
timestamp: new Date(),
|
|
298
|
-
floorId: this.selectedFloor?.id,
|
|
299
|
-
childZoneId: this.selectedChildZone?.id,
|
|
300
|
-
},
|
|
301
|
-
streamName: 'smarterplanKinesis-analytics',
|
|
302
|
-
// partitionKey: "",
|
|
303
|
-
}, 'AWSKinesis');
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
async onVisitClick(event) {
|
|
307
|
-
this.clearData(false);
|
|
308
|
-
const index = event.target.value;
|
|
309
|
-
const visit = this.visitsPerSpace[index];
|
|
310
|
-
this.selectedModel3d = visit.model3d;
|
|
311
|
-
const parentZoneForVisit = await this.visitService.getDefaultZoneForVisit(visit);
|
|
312
|
-
this.floorsPerSpace = this.zonesPerSpace.filter((zone) => zone.layer &&
|
|
313
|
-
zone.layer.name.includes('FLOOR') &&
|
|
314
|
-
zone.parentID === parentZoneForVisit.id);
|
|
315
|
-
}
|
|
316
|
-
async goTo() {
|
|
317
|
-
if (this.selectedZone && !this.selectedZone.virtual) {
|
|
318
|
-
this.sweepToGo = this.selectedZone.startSweepID
|
|
319
|
-
? this.selectedZone.startSweepID
|
|
320
|
-
: this.selectedZone.sweepIDs[0];
|
|
321
|
-
}
|
|
322
|
-
if (this.selectedFloor && !this.selectedZone) {
|
|
323
|
-
this.floorToGo = this.selectedFloor;
|
|
324
|
-
}
|
|
325
|
-
if (this.isWithinSameVisit()) {
|
|
326
|
-
this.goToSweepOrFloor();
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
if (this.sweepToGo) {
|
|
330
|
-
this.viewerService.setSweepToMove(this.sweepToGo);
|
|
331
|
-
}
|
|
332
|
-
if (this.floorToGo && this.floorsPerSpace.length !== 1) {
|
|
333
|
-
this.navigatorService.floorToGo = this.floorToGo;
|
|
334
|
-
}
|
|
335
|
-
this.router
|
|
336
|
-
.navigate(['visit', this.selectedLocation.id], {
|
|
337
|
-
queryParams: { model3D: this.selectedModel3d },
|
|
338
|
-
})
|
|
339
|
-
.catch((e) => console.log(e.message));
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
isWithinSameVisit() {
|
|
343
|
-
return (this.currentLocationID === this.selectedLocation.id &&
|
|
344
|
-
this.selectedModel3d === this.currentModel3d);
|
|
345
|
-
}
|
|
346
|
-
goToSweepOrFloor() {
|
|
347
|
-
if (this.sweepToGo) {
|
|
348
|
-
this.navigatorService.goToSweepWithRotation(this.sweepToGo);
|
|
349
|
-
}
|
|
350
|
-
if (this.floorToGo) {
|
|
351
|
-
this.navigatorService.goToFloor(this.floorToGo);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
// hasHistory(): boolean {
|
|
355
|
-
// return this.navigatorService.modelHasHistory(this.selectedModel3d);
|
|
356
|
-
// }
|
|
357
|
-
canGo() {
|
|
358
|
-
const viewerIsReady = this.viewerService.isLoaded && this.viewerService.showingViewer;
|
|
359
|
-
const noViewer = !this.viewerService.showingViewer;
|
|
360
|
-
return viewerIsReady || noViewer;
|
|
361
|
-
}
|
|
362
|
-
showLocation() {
|
|
363
|
-
if (window.innerWidth < 750 &&
|
|
364
|
-
this.navbarSelectMenu &&
|
|
365
|
-
this.navbarSelectMenu.nativeElement.className.search('show') === -1 &&
|
|
366
|
-
this.selectedLocation) {
|
|
367
|
-
return this.selectedLocation.name;
|
|
368
|
-
}
|
|
369
|
-
return '';
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
NavigationBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NavigationBarComponent, deps: [{ token: 'currentAwsKinesisAnalyticsService' }, { token: i1.Router }, { token: i2.SpaceService }, { token: i3.BaseUserService }, { token: i4.ZoneService }, { token: i5.VisitService }, { token: i6.ViewerService }, { token: i7.NavigatorService }, { token: i8.ZoneChangeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
373
|
-
NavigationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: NavigationBarComponent, selector: "lib-navigation-bar", viewQueries: [{ propertyName: "navbarSelectMenu", first: true, predicate: ["navbarSelectMenu"], descendants: true }], ngImport: i0, template: "<nav class=\"navbar navbar-expand-md navbar-dark navbar-inverse second-nav\">\n <div class=\"d-flex col-12\">\n <div #navbarSelectMenu class=\"collapse navbar-collapse\" id=\"nav-item-container-blue\">\n <div class=\"d-flex flex-column flex-md-row \">\n <select class=\"form-control flex-fill location select-menu\" [(ngModel)]=\"selectedLocation\"\n (ngModelChange)=\"onLocationClick()\">\n <option [ngValue]=\"null\" selected>{{ 'Location' | translate }}</option>\n <option *ngFor=\"let loc of locations; index as index\" [ngValue]=\"loc\"> {{ loc.name }}</option>\n </select>\n <select class=\"form-control flex-fill select-menu\" (change)=\"onVisitClick($event)\"\n *ngIf=\"visitsPerSpace && visitsPerSpace.length > 1\">\n <option value=\"default\" selected disabled hidden>{{'Visit' | translate}}</option>\n <option *ngFor=\"let visit of visitsPerSpace; index as index\" value=\"{{index}}\">{{ visit.name}}\n </option>\n </select>\n <select class=\"form-control flex-fill floor select-menu\" [(ngModel)]=\"selectedFloor\"\n (ngModelChange)=\"onFloorClick()\">\n <option [ngValue]=\"null\" selected>{{'Floor' | translate}}</option>\n <option *ngFor=\"let floor of floorsPerSpace\" [ngValue]=\"floor\">{{ floor.name}}</option>\n </select>\n <select class=\"form-control flex-fill select-menu zone\" [(ngModel)]=\"selectedZone\"\n (ngModelChange)=\"onZoneClick()\">\n <option [ngValue]=\"null\" selected>{{'Zone' | translate}}</option>\n <option *ngFor=\"let zone of zonesPerFloor\" [ngValue]=\"zone\"><span\n *ngIf=\"zone.code_ref\">{{zone.code_ref}}_</span>{{zone.name}}</option>\n </select>\n <select class=\"form-control flex-fill select-menu\" [(ngModel)]=\"selectedChildZone\"\n *ngIf=\"childrenZones && childrenZones.length>0\" (ngModelChange)=\"onChildZoneClick()\">\n <option [ngValue]=\"null\" selected disabled>{{'Zone' | translate}}</option>\n <option *ngFor=\"let zone of childrenZones\" [ngValue]=\"zone\">{{ zone.name}}</option>\n </select>\n <!-- <select class=\"form-control flex-fill\">\n <option i18n>{{'Favorites' | translate}}</option>\n </select> -->\n </div>\n <div class=\"row\" style=\"margin-left: 0;\">\n <div class=\"outer_circle\">\n <button id='btn-icon' [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\"\n (click)=\"goTo()\"></button>\n </div>\n <button (click)=\"goTo()\" class=\"btn rounded-pill btn-3d\"\n [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\">{{'3D visit' | translate}}</button>\n </div>\n </div>\n\n <h4 style=\"line-height: 29px;margin: 0;\" *ngIf=\"showLocation()\">\n {{ showLocation() }}\n </h4>\n </div>\n</nav>", styles: [":host{position:sticky;top:0;height:123px}.navbar{z-index:200;padding:.4rem 1rem}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0}.form-control{width:auto;min-width:80px;max-width:18%}.location{width:auto;max-width:35%}.floor,.zone{width:auto;max-width:30%}button{color:#fff;padding:5px 10px;font-size:1.1em}.btn-3d:active:hover:not([disabled]){color:var(--smarterplan-secondary)}.btn-3d[disabled]:hover{color:#fff}.navbar-toggler{margin-right:1em}.select-menu{max-width:inherit}#btn-icon{width:30px;height:30px;background:url(../../../../../assets/icons/goTo3d.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../../assets/icons/goTo3d-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../../assets/icons/goTo3d.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px}@media (max-width: 767px){.navbar{padding:.2rem .5rem}.form-control,.location,.floor,.zone{max-width:100%;margin-bottom:15px}input,select{margin-right:0;margin-bottom:15px}#btn-icon{width:20px;height:20px}}\n"], directives: [{ type: i9.NgbNavbar, selector: ".navbar" }, { type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i12.TranslatePipe } });
|
|
374
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NavigationBarComponent, decorators: [{
|
|
375
|
-
type: Component,
|
|
376
|
-
args: [{ selector: 'lib-navigation-bar', template: "<nav class=\"navbar navbar-expand-md navbar-dark navbar-inverse second-nav\">\n <div class=\"d-flex col-12\">\n <div #navbarSelectMenu class=\"collapse navbar-collapse\" id=\"nav-item-container-blue\">\n <div class=\"d-flex flex-column flex-md-row \">\n <select class=\"form-control flex-fill location select-menu\" [(ngModel)]=\"selectedLocation\"\n (ngModelChange)=\"onLocationClick()\">\n <option [ngValue]=\"null\" selected>{{ 'Location' | translate }}</option>\n <option *ngFor=\"let loc of locations; index as index\" [ngValue]=\"loc\"> {{ loc.name }}</option>\n </select>\n <select class=\"form-control flex-fill select-menu\" (change)=\"onVisitClick($event)\"\n *ngIf=\"visitsPerSpace && visitsPerSpace.length > 1\">\n <option value=\"default\" selected disabled hidden>{{'Visit' | translate}}</option>\n <option *ngFor=\"let visit of visitsPerSpace; index as index\" value=\"{{index}}\">{{ visit.name}}\n </option>\n </select>\n <select class=\"form-control flex-fill floor select-menu\" [(ngModel)]=\"selectedFloor\"\n (ngModelChange)=\"onFloorClick()\">\n <option [ngValue]=\"null\" selected>{{'Floor' | translate}}</option>\n <option *ngFor=\"let floor of floorsPerSpace\" [ngValue]=\"floor\">{{ floor.name}}</option>\n </select>\n <select class=\"form-control flex-fill select-menu zone\" [(ngModel)]=\"selectedZone\"\n (ngModelChange)=\"onZoneClick()\">\n <option [ngValue]=\"null\" selected>{{'Zone' | translate}}</option>\n <option *ngFor=\"let zone of zonesPerFloor\" [ngValue]=\"zone\"><span\n *ngIf=\"zone.code_ref\">{{zone.code_ref}}_</span>{{zone.name}}</option>\n </select>\n <select class=\"form-control flex-fill select-menu\" [(ngModel)]=\"selectedChildZone\"\n *ngIf=\"childrenZones && childrenZones.length>0\" (ngModelChange)=\"onChildZoneClick()\">\n <option [ngValue]=\"null\" selected disabled>{{'Zone' | translate}}</option>\n <option *ngFor=\"let zone of childrenZones\" [ngValue]=\"zone\">{{ zone.name}}</option>\n </select>\n <!-- <select class=\"form-control flex-fill\">\n <option i18n>{{'Favorites' | translate}}</option>\n </select> -->\n </div>\n <div class=\"row\" style=\"margin-left: 0;\">\n <div class=\"outer_circle\">\n <button id='btn-icon' [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\"\n (click)=\"goTo()\"></button>\n </div>\n <button (click)=\"goTo()\" class=\"btn rounded-pill btn-3d\"\n [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\">{{'3D visit' | translate}}</button>\n </div>\n </div>\n\n <h4 style=\"line-height: 29px;margin: 0;\" *ngIf=\"showLocation()\">\n {{ showLocation() }}\n </h4>\n </div>\n</nav>", styles: [":host{position:sticky;top:0;height:123px}.navbar{z-index:200;padding:.4rem 1rem}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0}.form-control{width:auto;min-width:80px;max-width:18%}.location{width:auto;max-width:35%}.floor,.zone{width:auto;max-width:30%}button{color:#fff;padding:5px 10px;font-size:1.1em}.btn-3d:active:hover:not([disabled]){color:var(--smarterplan-secondary)}.btn-3d[disabled]:hover{color:#fff}.navbar-toggler{margin-right:1em}.select-menu{max-width:inherit}#btn-icon{width:30px;height:30px;background:url(../../../../../assets/icons/goTo3d.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../../assets/icons/goTo3d-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../../assets/icons/goTo3d.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px}@media (max-width: 767px){.navbar{padding:.2rem .5rem}.form-control,.location,.floor,.zone{max-width:100%;margin-bottom:15px}input,select{margin-right:0;margin-bottom:15px}#btn-icon{width:20px;height:20px}}\n"] }]
|
|
377
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
378
|
-
type: Inject,
|
|
379
|
-
args: ['currentAwsKinesisAnalyticsService']
|
|
380
|
-
}] }, { type: i1.Router }, { type: i2.SpaceService }, { type: i3.BaseUserService }, { type: i4.ZoneService }, { type: i5.VisitService }, { type: i6.ViewerService }, { type: i7.NavigatorService }, { type: i8.ZoneChangeService }]; }, propDecorators: { navbarSelectMenu: [{
|
|
381
|
-
type: ViewChild,
|
|
382
|
-
args: ['navbarSelectMenu']
|
|
383
|
-
}] } });
|
|
384
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtYmFyL25hdmlnYXRpb24tYmFyL25hdmlnYXRpb24tYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9uYXZpZ2F0aW9uLWJhci9uYXZpZ2F0aW9uLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQWVyRCxNQUFNLE9BQU8sc0JBQXNCO0lBdUNqQyxZQUVFLDJCQUFnQyxFQUN4QixNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsV0FBNEIsRUFDNUIsV0FBd0IsRUFDeEIsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGlCQUFvQztRQVBwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXRDOUMscUJBQWdCLEdBQVUs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VUFBVSxHQUFHLEdBQUc7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxnQkFBZ0IsRUFDckI7WUFDQSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7U0FDbkM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O21IQWhjVSxzQkFBc0Isa0JBd0N2QixtQ0FBbUM7dUdBeENsQyxzQkFBc0IsZ0xDbEJuQywydkdBaURNOzJGRC9CTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9COzswQkE0QzNCLE1BQU07MkJBQUMsbUNBQW1DOzBRQXJDZCxnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kZWxzL3NwYWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzaXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kZWxzL3Zpc2l0LnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RlbHMvem9uZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhY2UsIFZpc2l0LCBab25lIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtab25lQ2hhbmdlU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3pvbmVDaGFuZ2Uuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbmF2aWdhdGlvbi1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uYXZpZ2F0aW9uLWJhci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgYXdzS2luZXNpc0FuYWx5dGljczogYW55OyAvL0FXU1xuXG4gIEBWaWV3Q2hpbGQoJ25hdmJhclNlbGVjdE1lbnUnKSBuYXZiYXJTZWxlY3RNZW51ITogYW55O1xuXG4gIGxvY2F0aW9uczogU3BhY2VbXTtcblxuICBjdXJyZW50TG9jYXRpb25JRDogc3RyaW5nO1xuXG4gIGN1cnJlbnRNb2RlbDNkOiBzdHJpbmc7XG5cbiAgc2VsZWN0ZWRMb2NhdGlvbjogU3BhY2UgPSBudWxsO1xuXG4gIHNlbGVjdGVkTW9kZWwzZDogc3RyaW5nO1xuXG4gIHNlbGVjdGVkRmxvb3I6IFpvbmUgPSBudWxsO1xuXG4gIHNlbGVjdGVkWm9uZTogWm9uZSA9IG51bGw7XG5cbiAgc2VsZWN0ZWRDaGlsZFpvbmU6IFpvbmUgPSBudWxsO1xuXG4gIHZpc2l0c1BlclNwYWNlOiBWaXNpdFtdID0gbnVsbDtcblxuICBmbG9vcnNQZXJTcGFjZTogWm9uZVtdID0gbnVsbDtcblxuICB6b25lc1BlclNwYWNlOiBab25lW10gPSBudWxsO1xuXG4gIHpvbmVzUGVyRmxvb3I6IFpvbmVbXSA9IG51bGw7XG5cbiAgY2hpbGRyZW5ab25lczogWm9uZVtdID0gbnVsbDtcblxuICBzd2VlcFRvR286IHN0cmluZztcblxuICBmbG9vclRvR286IFpvbmU7XG5cbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIG5hdkV2ZW50czogT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uRW5kPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdjdXJyZW50QXdzS2luZXNpc0FuYWx5dGljc1NlcnZpY2UnKVxuICAgIGF3c0tpbmVzaXNBbmFseXRpY3NJbmplY3RlZDogYW55LFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcbiAgICBwcml2YXRlIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9uZUNoYW5nZVNlcnZpY2U6IFpvbmVDaGFuZ2VTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcyA9IGF3c0tpbmVzaXNBbmFseXRpY3NJbmplY3RlZDtcbiAgICB0aGlzLnNwYWNlU2VydmljZS5sb2NhdGlvblVwZGF0ZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxvY3MpID0+IHtcbiAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NzO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb25CeUlEKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uLmlkXG4gICAgICAgICAgKTsgLy8gVXBkYXRlIE9iamVjdCAob2JqZWN0IGFkZHJlc3Mgd2lsbCBjaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2Uudmlld2VySXNPblxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IHsgc3BhY2VJRDogc3RyaW5nOyBtb2RlbDNEOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0pID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbWVudSBuYXZpZ2F0aW9uIHJlY2VpdmVkIHVwZGF0ZScsIGRhdGEpO1xuICAgICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uSUQgPSBkYXRhLnNwYWNlSUQ7XG4gICAgICAgICAgdGhpcy5jdXJyZW50TW9kZWwzZCA9IGRhdGEubW9kZWwzRDtcbiAgICAgICAgICBpZiAoIWRhdGEuc3BhY2VJRCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdsb2NhdGlvbklkJyk7XG4gICAgICAgICAgICB0aGlzLnNlbmRVcGRhdGVMb2NhdGlvbkV2ZW50KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICghdGhpcy5zZWxlY3RlZExvY2F0aW9uIHx8XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCAhPT0gZGF0YS5zcGFjZUlEKSAmJlxuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IHRoaXMuZmluZExvY2F0aW9uQnlJRChkYXRhLnNwYWNlSUQpO1xuICAgICAgICAgICAgdGhpcy5zZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgIC8qKlxuICAgICAqIFdlIGxpc3RlbiBmb3IgTG9jYXRpb24gY2hhbmdlIGV2ZW50XG4gICAgICovXG4gICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmxvY2F0aW9uSURDaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckRhdGEoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb25JRCA9IGlkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSB0aGlzLmZpbmRMb2NhdGlvbkJ5SUQoaWQpO1xuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhckxvY2F0aW9uSUQgPSBpZDtcbiAgICAgICAgdGhpcy5vblNlbGVjdGVkTG9jYXRpb25DaGFuZ2VkKCkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLnpvbmVzRm9yVXNlckNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoem9uZXMpID0+IHtcbiAgICAgICAgaWYgKHpvbmVzKSB7XG4gICAgICAgICAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHRoaXMuZmxvb3JzUGVyU3BhY2UgIT09IG51bGwpO1xuICAgICAgICAgIGNvbnN0IGZsb29yWm9uZSA9IHpvbmVzLmZpbmQoXG4gICAgICAgICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdGTE9PUidcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmbG9vclpvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IHRoaXMuZmxvb3JzUGVyU3BhY2UuZmluZChcbiAgICAgICAgICAgICAgKGYpID0+IGYuaWQgPT09IGZsb29yWm9uZS5pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gZGlzcGF0Y2ggdmFsdWUgb2YgIHRoaXMuc2VsZWN0ZWRGbG9vciBpbiBhbGwgcG9pL3RpY2tldC9lcXVpcG1lbnQvbWVhc3VyZSBzZXJ2aWNlc1xuICAgICAgICAgICAgdGhpcy56b25lQ2hhbmdlU2VydmljZS5mbG9vckhhc0NoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkRmxvb3IpO1xuICAgICAgICAgICAgdGhpcy5vbkZsb29yQ2xpY2soZmFsc2UpLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0TG9jYXRpb25zKCk7XG4gICAgdGhpcy5oYW5kbGVTdGFydFVybCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIENhcHR1cmUgdGhlIFwiaWRcIiBpbiBsb2NhbGlzYXRpb24vOmlkIHJvdXRlc1xuICBoYW5kbGVTdGFydFVybCgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCdsb2NhbGlzYXRpb24vJykpIHtcbiAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCcvJyk7IC8vIC9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uL2ZjMGFhZGI3LTNjODktNDM0OS1hZDFmLWJmZTliNDQ5MTZjMFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICBjb25zdCBsb2NJRCA9IHBhdGhzWzNdO1xuICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uSUQgIT09IGxvY0lEKSB7XG4gICAgICAgIHRoaXMuY2xlYXJEYXRhKCk7XG4gICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uSUQgPSBsb2NJRDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb25CeUlEKGxvY0lEKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJMb2NhdGlvbklEID0gbG9jSUQ7XG4gICAgICAgIHRoaXMub25TZWxlY3RlZExvY2F0aW9uQ2hhbmdlZCgpLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0TG9jYXRpb25zKCkge1xuICAgIHRoaXMubG9jYXRpb25zID0gdGhpcy5zcGFjZVNlcnZpY2UubG9jYXRpb25zRm9yVXNlcjtcbiAgICBpZiAodGhpcy5sb2NhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2F0aW9ucyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldExvY2F0aW9uc0ZvckN1cnJlbnRVc2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRMb2NhdGlvbklEICYmIHRoaXMubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IHRoaXMuZmluZExvY2F0aW9uQnlJRCh0aGlzLmN1cnJlbnRMb2NhdGlvbklEKTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgbG9jYXRpb24gd2l0aCBhIGdpdmVuIElEXG4gICAqIEBwYXJhbSBpZCBJRCBmb3IgdGhlIGxvY2F0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBsb2NhdGlvbiBvciBudWxsIGlmIG5vIGxvY2F0aW9uIHdlcmUgZm91bmRcbiAgICovXG4gIGZpbmRMb2NhdGlvbkJ5SUQoaWQ6IHN0cmluZyk6IFNwYWNlIHtcbiAgICBjb25zdCBzcGFjZSA9IHRoaXMubG9jYXRpb25zLmZpbmQoKGxvYykgPT4gbG9jLmlkID09PSBpZCk7XG4gICAgcmV0dXJuIHNwYWNlIHx8IG51bGw7IC8qKiBDb252ZXJ0IHRvIG51bGwgaWYgdW5kZWZpbmVkICovXG4gIH1cblxuICBjbGVhckRhdGEoY2xlYXJWaXNpdHM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5mbG9vcnNQZXJTcGFjZSA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZEZsb29yID0gbnVsbDtcbiAgICB0aGlzLnpvbmVzUGVyRmxvb3IgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRyZW5ab25lcyA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZE1vZGVsM2QgPSBudWxsO1xuICAgIHRoaXMuc3dlZXBUb0dvID0gbnVsbDtcbiAgICB0aGlzLmZsb29yVG9HbyA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFpvbmUgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRDaGlsZFpvbmUgPSBudWxsO1xuICAgIGlmIChjbGVhclZpc2l0cykge1xuICAgICAgdGhpcy52aXNpdHNQZXJTcGFjZSA9IG51bGw7XG4gICAgICB0aGlzLnpvbmVzUGVyU3BhY2UgPSBudWxsO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbG9jYXRpb25JZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdmbG9vcklkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3pvbmVJZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjaGlsZFpvbmVJZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHNlbGVjdGVkTG9jYXRpb24gY2hhbmdlc1xuICAgKiBTZW5kIGEgZXZlbnQgdG8gbG9jYXRpb25JRENoYW5nZSBmcm9tIE5hdmlnYXRvclNlcnZpY2VcbiAgICogVGhlIGV2ZW50IHdpbGwgYmUgY2F0Y2ggYnkgdGhpcyBjb21wb25lbnQgYW5kIHRoZSBmaWx0ZXIgYmFyIHdpbGwgYmUgdXBkYXRlXG4gICAqL1xuICBzZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpIHtcbiAgICBjb25zdCBsb2NhdGlvbklEID0gdGhpcy5zZWxlY3RlZExvY2F0aW9uID8gdGhpcy5zZWxlY3RlZExvY2F0aW9uLmlkIDogbnVsbDtcbiAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KGxvY2F0aW9uSUQpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTG9jYXRpb24pIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsb2NhdGlvbklkJywgdGhpcy5zZWxlY3RlZExvY2F0aW9uLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xvY2F0aW9uSWQnKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNlbGVjdGVkTG9jYXRpb25DaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZExvY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZpc2l0c1BlclNwYWNlID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0VmlzaXRzRm9yU3BhY2VGb3JVc2VyKFxuICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWRcbiAgICAgICk7XG4gICAgICB0aGlzLnpvbmVzUGVyU3BhY2UgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZUZvclVzZXIoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnZpc2l0c1BlclNwYWNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9kZWwzZCA9IHRoaXMudmlzaXRzUGVyU3BhY2VbMF0ubW9kZWwzZDtcbiAgICAgICAgdGhpcy5mbG9vcnNQZXJTcGFjZSA9IHRoaXMuem9uZXNQZXJTcGFjZS5maWx0ZXIoXG4gICAgICAgICAgKHpvbmUpID0+IHpvbmUubGF5ZXIgJiYgem9uZS5sYXllci5uYW1lLmluY2x1ZGVzKCdGTE9PUicpXG4gICAgICAgICk7XG4gICAgICAgIC8vIHNvcnQgZnJvbSBoaWdoZXN0IGZsb29yIHRvIGxvd2VzdFxuICAgICAgICB0aGlzLmZsb29yc1BlclNwYWNlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBpZiAoYS5tZXRhZGF0YSAmJiBiLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YUEgPSBKU09OLnBhcnNlKGEubWV0YWRhdGEpO1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFCID0gSlNPTi5wYXJzZShiLm1ldGFkYXRhKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIG1ldGFkYXRhQi5tYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSAtXG4gICAgICAgICAgICAgIG1ldGFkYXRhQS5tYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtdWx0aUZsb29yWm9uZXMgPSB0aGlzLnpvbmVzUGVyU3BhY2UuZmlsdGVyKFxuICAgICAgICAgICh6b25lKSA9PiB6b25lLmlzTXVsdGlwbGVGbG9vclpvbmVcbiAgICAgICAgKTtcbiAgICAgICAgLy8gc29ydCBhbHBoYWJldGljYWxseVxuICAgICAgICBtdWx0aUZsb29yWm9uZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgICAgIC8vIG1lcmdlIG11bHRpRmxvb3IgYW5kIEZsb29yc1xuICAgICAgICB0aGlzLmZsb29yc1BlclNwYWNlID0gWy4uLnRoaXMuZmxvb3JzUGVyU3BhY2UsIC4uLm11bHRpRmxvb3Jab25lc107XG4gICAgICAgIGlmICh0aGlzLmZsb29yc1BlclNwYWNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIFt0aGlzLnNlbGVjdGVkRmxvb3JdID0gdGhpcy5mbG9vcnNQZXJTcGFjZTtcbiAgICAgICAgICB0aGlzLm9uRmxvb3JDbGljayhmYWxzZSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBvbkNob3NlbkxvY2F0aW9uJywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG9uTG9jYXRpb25DbGljaygpIHtcbiAgICB0aGlzLmNsZWFyRGF0YSgpO1xuICAgIHRoaXMuc2VuZFVwZGF0ZUxvY2F0aW9uRXZlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIG9uRmxvb3JDbGljayhlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGbG9vcikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Zsb29ySWQnLCB0aGlzLnNlbGVjdGVkRmxvb3IuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZmxvb3JJZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yICYmIHRoaXMuc2VsZWN0ZWRGbG9vci5pc011bHRpcGxlRmxvb3Jab25lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkWm9uZSA9IHRoaXMuc2VsZWN0ZWRGbG9vcjtcbiAgICAgIHRoaXMub25ab25lQ2xpY2soKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25ab25lQ2xpY2soKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgfVxuICAgIHRoaXMuc3dlZXBUb0dvID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkWm9uZSA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZENoaWxkWm9uZSA9IG51bGw7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3pvbmVJZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjaGlsZFpvbmVJZCcpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5uYXZCYXJab25lSURDaGFuZ2UubmV4dChudWxsKTtcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50TmF2QmFyWm9uZUlEID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLm5hdkJhclpvbmVJRENoYW5nZS5uZXh0KHRoaXMuc2VsZWN0ZWRGbG9vci5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJab25lSUQgPSB0aGlzLnNlbGVjdGVkRmxvb3IuaWQ7XG4gICAgYXdhaXQgd2FpdFVudGlsKFxuICAgICAgKCkgPT4gdGhpcy56b25lc1BlclNwYWNlICE9PSBudWxsICYmIHRoaXMuem9uZXNQZXJTcGFjZSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgICB0aGlzLnpvbmVzUGVyRmxvb3IgPSB0aGlzLnpvbmVzUGVyU3BhY2UuZmlsdGVyKFxuICAgICAgKHpvbmUpID0+XG4gICAgICAgIC8vIHpvbmUuaWQgPT09IHRoaXMuc2VsZWN0ZWRGbG9vci5pZCB8fFxuICAgICAgICB6b25lLnBhcmVudElEID09PSB0aGlzLnNlbGVjdGVkRmxvb3IuaWRcbiAgICApO1xuICAgIHRoaXMuem9uZXNQZXJGbG9vci5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBDb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwge1xuICAgICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgICBzZW5zaXRpdml0eTogJ2FjY2VudCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIENvbGxhdG9yLmNvbXBhcmUoYS5jb2RlX3JlZiwgYi5jb2RlX3JlZikgfHxcbiAgICAgICAgQ29sbGF0b3IuY29tcGFyZShhLm5hbWUsIGIubmFtZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBvblpvbmVDbGljaygpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2hpbGRab25lID0gbnVsbDtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2hpbGRab25lSWQnKTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFpvbmUpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd6b25lSWQnLCB0aGlzLnNlbGVjdGVkWm9uZS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd6b25lSWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRab25lID09PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5uYXZCYXJab25lSURDaGFuZ2UubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJab25lSUQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLm5hdkJhclpvbmVJRENoYW5nZS5uZXh0KHRoaXMuc2VsZWN0ZWRGbG9vci5pZCk7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50TmF2QmFyWm9uZUlEID0gdGhpcy5zZWxlY3RlZEZsb29yLmlkO1xuICAgICAgfVxuICAgICAgdGhpcy5zZW5kS2luZXNpc0FuYWx5dGljc0V2ZW50Rm9yWm9uZShcbiAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmU/LmlkLFxuICAgICAgICB0aGlzLnNlbGVjdGVkWm9uZT8ubmFtZVxuICAgICAgKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hpbGRyZW5ab25lcyA9IHRoaXMuem9uZXNQZXJTcGFjZS5maWx0ZXIoXG4gICAgICAoem9uZSkgPT4gem9uZS5wYXJlbnRJRCA9PT0gdGhpcy5zZWxlY3RlZFpvbmUuaWRcbiAgICApO1xuICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5uYXZCYXJab25lSURDaGFuZ2UubmV4dCh0aGlzLnNlbGVjdGVkWm9uZS5pZCk7XG4gICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJab25lSUQgPSB0aGlzLnNlbGVjdGVkWm9uZS5pZDtcbiAgICB0aGlzLnNlbmRLaW5lc2lzQW5hbHl0aWNzRXZlbnRGb3Jab25lKFxuICAgICAgdGhpcy5zZWxlY3RlZFpvbmU/LmlkLFxuICAgICAgdGhpcy5zZWxlY3RlZFpvbmU/Lm5hbWVcbiAgICApLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpKTtcbiAgfVxuXG4gIG9uQ2hpbGRab25lQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDaGlsZFpvbmUpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjaGlsZFpvbmVJZCcsIHRoaXMuc2VsZWN0ZWRDaGlsZFpvbmU/LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NoaWxkWm9uZUlkJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VuZEtpbmVzaXNBbmFseXRpY3NFdmVudEZvclpvbmUoXG4gICAgem9uZUlkOiBzdHJpbmcsXG4gICAgem9uZU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoISF0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MgJiYgISF0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkICYmIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5yZWNvcmQoKSkge1xuICAgICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLmdldEluc3RhbmNlKCkucmVjb3JkKFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdab25lIENoYW5nZScsXG4gICAgICAgICAgICB6b25lSWQ6IHpvbmVJZCxcbiAgICAgICAgICAgIHpvbmVOYW1lOiB6b25lTmFtZSxcbiAgICAgICAgICAgIGxvY2F0aW9uSWQ6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQsXG4gICAgICAgICAgICBsb2NhdGlvbk5hbWU6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8ubmFtZSxcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlclNlcnZpY2U/LmN1LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29yPy5pZCxcbiAgICAgICAgICAgIGNoaWxkWm9uZUlkOiB0aGlzLnNlbGVjdGVkQ2hpbGRab25lPy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cmVhbU5hbWU6ICdzbWFydGVycGxhbktpbmVzaXMtYW5hbHl0aWNzJyxcbiAgICAgICAgICAvLyBwYXJ0aXRpb25LZXk6IFwiXCIsXG4gICAgICAgIH0sXG4gICAgICAgICdBV1NLaW5lc2lzJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblZpc2l0Q2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLmNsZWFyRGF0YShmYWxzZSk7XG4gICAgY29uc3QgaW5kZXggPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgY29uc3QgdmlzaXQgPSB0aGlzLnZpc2l0c1BlclNwYWNlW2luZGV4XTtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwzZCA9IHZpc2l0Lm1vZGVsM2Q7XG4gICAgY29uc3QgcGFyZW50Wm9uZUZvclZpc2l0ID0gYXdhaXQgdGhpcy52aXNpdFNlcnZpY2UuZ2V0RGVmYXVsdFpvbmVGb3JWaXNpdChcbiAgICAgIHZpc2l0XG4gICAgKTtcbiAgICB0aGlzLmZsb29yc1BlclNwYWNlID0gdGhpcy56b25lc1BlclNwYWNlLmZpbHRlcihcbiAgICAgICh6b25lKSA9PlxuICAgICAgICB6b25lLmxheWVyICYmXG4gICAgICAgIHpvbmUubGF5ZXIubmFtZS5pbmNsdWRlcygnRkxPT1InKSAmJlxuICAgICAgICB6b25lLnBhcmVudElEID09PSBwYXJlbnRab25lRm9yVmlzaXQuaWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ29UbygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFpvbmUgJiYgIXRoaXMuc2VsZWN0ZWRab25lLnZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc3dlZXBUb0dvID0gdGhpcy5zZWxlY3RlZFpvbmUuc3RhcnRTd2VlcElEXG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFpvbmUuc3RhcnRTd2VlcElEXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZFpvbmUuc3dlZXBJRHNbMF07XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IgJiYgIXRoaXMuc2VsZWN0ZWRab25lKSB7XG4gICAgICB0aGlzLmZsb29yVG9HbyA9IHRoaXMuc2VsZWN0ZWRGbG9vcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNXaXRoaW5TYW1lVmlzaXQoKSkge1xuICAgICAgdGhpcy5nb1RvU3dlZXBPckZsb29yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN3ZWVwVG9Hbykge1xuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0U3dlZXBUb01vdmUodGhpcy5zd2VlcFRvR28pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZmxvb3JUb0dvICYmIHRoaXMuZmxvb3JzUGVyU3BhY2UubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5mbG9vclRvR28gPSB0aGlzLmZsb29yVG9HbztcbiAgICAgIH1cbiAgICAgIHRoaXMucm91dGVyXG4gICAgICAgIC5uYXZpZ2F0ZShbJ3Zpc2l0JywgdGhpcy5zZWxlY3RlZExvY2F0aW9uLmlkXSwge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGVsM0Q6IHRoaXMuc2VsZWN0ZWRNb2RlbDNkIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgaXNXaXRoaW5TYW1lVmlzaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uSUQgPT09IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsM2QgPT09IHRoaXMuY3VycmVudE1vZGVsM2RcbiAgICApO1xuICB9XG5cbiAgZ29Ub1N3ZWVwT3JGbG9vcigpIHtcbiAgICBpZiAodGhpcy5zd2VlcFRvR28pIHtcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5nb1RvU3dlZXBXaXRoUm90YXRpb24odGhpcy5zd2VlcFRvR28pO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbG9vclRvR28pIHtcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5nb1RvRmxvb3IodGhpcy5mbG9vclRvR28pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhhc0hpc3RvcnkoKTogYm9vbGVhbiB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLm1vZGVsSGFzSGlzdG9yeSh0aGlzLnNlbGVjdGVkTW9kZWwzZCk7XG4gIC8vIH1cblxuICBjYW5HbygpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ZXJJc1JlYWR5ID1cbiAgICAgIHRoaXMudmlld2VyU2VydmljZS5pc0xvYWRlZCAmJiB0aGlzLnZpZXdlclNlcnZpY2Uuc2hvd2luZ1ZpZXdlcjtcbiAgICBjb25zdCBub1ZpZXdlciA9ICF0aGlzLnZpZXdlclNlcnZpY2Uuc2hvd2luZ1ZpZXdlcjtcbiAgICByZXR1cm4gdmlld2VySXNSZWFkeSB8fCBub1ZpZXdlcjtcbiAgfVxuXG4gIHNob3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIDwgNzUwICYmXG4gICAgICB0aGlzLm5hdmJhclNlbGVjdE1lbnUgJiZcbiAgICAgIHRoaXMubmF2YmFyU2VsZWN0TWVudS5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5zZWFyY2goJ3Nob3cnKSA9PT0gLTEgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvblxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiIsIjxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBuYXZiYXItZGFyayBuYXZiYXItaW52ZXJzZSBzZWNvbmQtbmF2XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtMTJcIj5cbiAgICAgICAgPGRpdiAjbmF2YmFyU2VsZWN0TWVudSBjbGFzcz1cImNvbGxhcHNlIG5hdmJhci1jb2xsYXBzZVwiIGlkPVwibmF2LWl0ZW0tY29udGFpbmVyLWJsdWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZmxleC1tZC1yb3cgXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBmbGV4LWZpbGwgbG9jYXRpb24gc2VsZWN0LW1lbnVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTG9jYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkxvY2F0aW9uQ2xpY2soKVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIiBzZWxlY3RlZD57eyAnTG9jYXRpb24nIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvYyBvZiBsb2NhdGlvbnM7IGluZGV4IGFzIGluZGV4XCIgW25nVmFsdWVdPVwibG9jXCI+IHt7IGxvYy5uYW1lIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBmbGV4LWZpbGwgc2VsZWN0LW1lbnVcIiAoY2hhbmdlKT1cIm9uVmlzaXRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2aXNpdHNQZXJTcGFjZSAmJiB2aXNpdHNQZXJTcGFjZS5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkZWZhdWx0XCIgc2VsZWN0ZWQgZGlzYWJsZWQgaGlkZGVuPnt7J1Zpc2l0JyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZpc2l0IG9mIHZpc2l0c1BlclNwYWNlOyBpbmRleCBhcyBpbmRleFwiIHZhbHVlPVwie3tpbmRleH19XCI+e3sgdmlzaXQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZmxleC1maWxsIGZsb29yIHNlbGVjdC1tZW51XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GbG9vckNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCIgc2VsZWN0ZWQ+e3snRmxvb3InIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZmxvb3Igb2YgZmxvb3JzUGVyU3BhY2VcIiBbbmdWYWx1ZV09XCJmbG9vclwiPnt7IGZsb29yLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZmxleC1maWxsIHNlbGVjdC1tZW51IHpvbmVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkWm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uWm9uZUNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCIgc2VsZWN0ZWQ+e3snWm9uZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzUGVyRmxvb3JcIiBbbmdWYWx1ZV09XCJ6b25lXCI+PHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInpvbmUuY29kZV9yZWZcIj57e3pvbmUuY29kZV9yZWZ9fV88L3NwYW4+e3t6b25lLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZmxleC1maWxsIHNlbGVjdC1tZW51XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENoaWxkWm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hpbGRyZW5ab25lcyAmJiBjaGlsZHJlblpvbmVzLmxlbmd0aD4wXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGlsZFpvbmVDbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiIHNlbGVjdGVkIGRpc2FibGVkPnt7J1pvbmUnIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiBjaGlsZHJlblpvbmVzXCIgW25nVmFsdWVdPVwiem9uZVwiPnt7IHpvbmUubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPCEtLSA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZmlsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGkxOG4+e3snRmF2b3JpdGVzJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXJfY2lyY2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9J2J0bi1pY29uJyBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkTG9jYXRpb24gfHwgIXNlbGVjdGVkTW9kZWwzZCB8fCAhY2FuR28oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29UbygpXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZ29UbygpXCIgY2xhc3M9XCJidG4gcm91bmRlZC1waWxsIGJ0bi0zZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRMb2NhdGlvbiB8fCAhc2VsZWN0ZWRNb2RlbDNkIHx8ICFjYW5HbygpXCI+e3snM0QgdmlzaXQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aDQgc3R5bGU9XCJsaW5lLWhlaWdodDogMjlweDttYXJnaW46IDA7XCIgKm5nSWY9XCJzaG93TG9jYXRpb24oKVwiPlxuICAgICAgICAgICAge3sgc2hvd0xvY2F0aW9uKCkgfX1cbiAgICAgICAgPC9oND5cbiAgICA8L2Rpdj5cbjwvbmF2PiJdfQ==
|
|
1
|
+
import { Component, Inject, ViewChild } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { waitUntil } from '../../../helpers.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
import * as i2 from "../../../services/models/space.service";
|
|
7
|
+
import * as i3 from "../../../services/user.service";
|
|
8
|
+
import * as i4 from "../../../services/models/zone.service";
|
|
9
|
+
import * as i5 from "../../../services/models/visit.service";
|
|
10
|
+
import * as i6 from "../../../services/viewer.service";
|
|
11
|
+
import * as i7 from "../../../services/navigator.service";
|
|
12
|
+
import * as i8 from "../../../services/zoneChange.service";
|
|
13
|
+
import * as i9 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
+
import * as i10 from "@angular/forms";
|
|
15
|
+
import * as i11 from "@angular/common";
|
|
16
|
+
import * as i12 from "@ngx-translate/core";
|
|
17
|
+
export class NavigationBarComponent {
|
|
18
|
+
constructor(awsKinesisAnalyticsInjected, router, spaceService, userService, zoneService, visitService, viewerService, navigatorService, zoneChangeService) {
|
|
19
|
+
this.router = router;
|
|
20
|
+
this.spaceService = spaceService;
|
|
21
|
+
this.userService = userService;
|
|
22
|
+
this.zoneService = zoneService;
|
|
23
|
+
this.visitService = visitService;
|
|
24
|
+
this.viewerService = viewerService;
|
|
25
|
+
this.navigatorService = navigatorService;
|
|
26
|
+
this.zoneChangeService = zoneChangeService;
|
|
27
|
+
this.selectedLocation = null;
|
|
28
|
+
this.selectedFloor = null;
|
|
29
|
+
this.selectedZone = null;
|
|
30
|
+
this.selectedChildZone = null;
|
|
31
|
+
this.visitsPerSpace = null;
|
|
32
|
+
this.floorsPerSpace = null;
|
|
33
|
+
this.zonesPerSpace = null;
|
|
34
|
+
this.zonesPerFloor = null;
|
|
35
|
+
this.childrenZones = null;
|
|
36
|
+
this.destroy$ = new Subject();
|
|
37
|
+
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
38
|
+
this.spaceService.locationUpdated
|
|
39
|
+
.pipe(takeUntil(this.destroy$))
|
|
40
|
+
.subscribe((locs) => {
|
|
41
|
+
this.locations = locs;
|
|
42
|
+
if (this.selectedLocation) {
|
|
43
|
+
this.selectedLocation = this.findLocationByID(this.selectedLocation.id); // Update Object (object address will change);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
this.viewerService.viewerIsOn
|
|
47
|
+
.pipe(takeUntil(this.destroy$))
|
|
48
|
+
.subscribe((data) => {
|
|
49
|
+
// console.log('menu navigation received update', data);
|
|
50
|
+
this.currentLocationID = data.spaceID;
|
|
51
|
+
this.currentModel3d = data.model3D;
|
|
52
|
+
if (!data.spaceID) {
|
|
53
|
+
this.selectedLocation = null;
|
|
54
|
+
localStorage.removeItem('locationId');
|
|
55
|
+
this.sendUpdateLocationEvent();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if ((!this.selectedLocation ||
|
|
59
|
+
this.selectedLocation.id !== data.spaceID) &&
|
|
60
|
+
this.locations) {
|
|
61
|
+
this.selectedLocation = this.findLocationByID(data.spaceID);
|
|
62
|
+
this.sendUpdateLocationEvent();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* We listen for Location change event
|
|
67
|
+
*/
|
|
68
|
+
this.navigatorService.locationIDChange
|
|
69
|
+
.pipe(takeUntil(this.destroy$))
|
|
70
|
+
.subscribe((id) => {
|
|
71
|
+
this.clearData();
|
|
72
|
+
this.currentLocationID = id;
|
|
73
|
+
this.selectedLocation = this.findLocationByID(id);
|
|
74
|
+
this.navigatorService.currentNavBarLocationID = id;
|
|
75
|
+
this.onSelectedLocationChanged().catch((e) => console.log(e.message));
|
|
76
|
+
});
|
|
77
|
+
this.zoneChangeService.zonesForUserChange
|
|
78
|
+
.pipe(takeUntil(this.destroy$))
|
|
79
|
+
.subscribe(async (zones) => {
|
|
80
|
+
if (zones) {
|
|
81
|
+
await waitUntil(() => this.floorsPerSpace !== null);
|
|
82
|
+
const floorZone = zones.find((zone) => zone.layer && zone.layer.name === 'FLOOR');
|
|
83
|
+
if (floorZone) {
|
|
84
|
+
this.selectedFloor = this.floorsPerSpace.find((f) => f.id === floorZone.id);
|
|
85
|
+
// Emit event to dispatch value of this.selectedFloor in all poi/ticket/equipment/measure services
|
|
86
|
+
this.zoneChangeService.floorHasChanged.emit(this.selectedFloor);
|
|
87
|
+
this.onFloorClick(false).catch((e) => console.log(e.message));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async ngOnInit() {
|
|
93
|
+
await this.initLocations();
|
|
94
|
+
this.handleStartUrl();
|
|
95
|
+
}
|
|
96
|
+
ngOnDestroy() {
|
|
97
|
+
this.destroy$.next(true);
|
|
98
|
+
this.destroy$.complete();
|
|
99
|
+
}
|
|
100
|
+
// Capture the "id" in localisation/:id routes
|
|
101
|
+
handleStartUrl() {
|
|
102
|
+
if (this.router.url.includes('localisation/')) {
|
|
103
|
+
const paths = this.router.url.split('/'); // /dashboard/localisation/fc0aadb7-3c89-4349-ad1f-bfe9b44916c0
|
|
104
|
+
// eslint-disable-next-line prefer-destructuring
|
|
105
|
+
const locID = paths[3];
|
|
106
|
+
if (this.currentLocationID !== locID) {
|
|
107
|
+
this.clearData();
|
|
108
|
+
this.currentLocationID = locID;
|
|
109
|
+
this.selectedLocation = this.findLocationByID(locID);
|
|
110
|
+
this.navigatorService.currentNavBarLocationID = locID;
|
|
111
|
+
this.onSelectedLocationChanged().catch((e) => console.log(e.message));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async initLocations() {
|
|
116
|
+
this.locations = this.spaceService.locationsForUser;
|
|
117
|
+
if (this.locations.length === 0) {
|
|
118
|
+
this.locations = await this.spaceService.getLocationsForCurrentUser();
|
|
119
|
+
}
|
|
120
|
+
if (this.currentLocationID && this.locations.length > 0) {
|
|
121
|
+
this.selectedLocation = this.findLocationByID(this.currentLocationID);
|
|
122
|
+
if (this.selectedLocation) {
|
|
123
|
+
this.sendUpdateLocationEvent();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Find a location with a given ID
|
|
129
|
+
* @param id ID for the location
|
|
130
|
+
* @returns The location or null if no location were found
|
|
131
|
+
*/
|
|
132
|
+
findLocationByID(id) {
|
|
133
|
+
const space = this.locations.find((loc) => loc.id === id);
|
|
134
|
+
return space || null; /** Convert to null if undefined */
|
|
135
|
+
}
|
|
136
|
+
clearData(clearVisits = true) {
|
|
137
|
+
this.floorsPerSpace = null;
|
|
138
|
+
this.selectedFloor = null;
|
|
139
|
+
this.zonesPerFloor = null;
|
|
140
|
+
this.childrenZones = null;
|
|
141
|
+
this.selectedModel3d = null;
|
|
142
|
+
this.sweepToGo = null;
|
|
143
|
+
this.floorToGo = null;
|
|
144
|
+
this.selectedZone = null;
|
|
145
|
+
this.selectedChildZone = null;
|
|
146
|
+
if (clearVisits) {
|
|
147
|
+
this.visitsPerSpace = null;
|
|
148
|
+
this.zonesPerSpace = null;
|
|
149
|
+
}
|
|
150
|
+
localStorage.removeItem('locationId');
|
|
151
|
+
localStorage.removeItem('floorId');
|
|
152
|
+
localStorage.removeItem('zoneId');
|
|
153
|
+
localStorage.removeItem('childZoneId');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* When the selectedLocation changes
|
|
157
|
+
* Send a event to locationIDChange from NavigatorService
|
|
158
|
+
* The event will be catch by this component and the filter bar will be update
|
|
159
|
+
*/
|
|
160
|
+
sendUpdateLocationEvent() {
|
|
161
|
+
const locationID = this.selectedLocation ? this.selectedLocation.id : null;
|
|
162
|
+
this.navigatorService.locationIDChange.next(locationID);
|
|
163
|
+
if (this.selectedLocation) {
|
|
164
|
+
localStorage.setItem('locationId', this.selectedLocation.id);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
localStorage.removeItem('locationId');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async onSelectedLocationChanged() {
|
|
171
|
+
if (!this.selectedLocation) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
this.visitsPerSpace = await this.visitService.getVisitsForSpaceForUser(this.selectedLocation.id);
|
|
176
|
+
this.zonesPerSpace = await this.zoneService.getZonesBySpaceForUser(this.selectedLocation.id);
|
|
177
|
+
if (this.visitsPerSpace.length === 1) {
|
|
178
|
+
this.selectedModel3d = this.visitsPerSpace[0].model3d;
|
|
179
|
+
this.floorsPerSpace = this.zonesPerSpace.filter((zone) => zone.layer && zone.layer.name.includes('FLOOR'));
|
|
180
|
+
// sort from highest floor to lowest
|
|
181
|
+
this.floorsPerSpace.sort((a, b) => {
|
|
182
|
+
if (a.metadata && b.metadata) {
|
|
183
|
+
const metadataA = JSON.parse(a.metadata);
|
|
184
|
+
const metadataB = JSON.parse(b.metadata);
|
|
185
|
+
return (metadataB.matterportFloorSequence -
|
|
186
|
+
metadataA.matterportFloorSequence);
|
|
187
|
+
}
|
|
188
|
+
return a.name.localeCompare(b.name);
|
|
189
|
+
});
|
|
190
|
+
const multiFloorZones = this.zonesPerSpace.filter((zone) => zone.isMultipleFloorZone);
|
|
191
|
+
// sort alphabetically
|
|
192
|
+
multiFloorZones.sort((a, b) => a.name.localeCompare(b.name));
|
|
193
|
+
// merge multiFloor and Floors
|
|
194
|
+
this.floorsPerSpace = [...this.floorsPerSpace, ...multiFloorZones];
|
|
195
|
+
if (this.floorsPerSpace.length === 1) {
|
|
196
|
+
[this.selectedFloor] = this.floorsPerSpace;
|
|
197
|
+
this.onFloorClick(false).catch((e) => console.log(e.message));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.log('error onChosenLocation', error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
onLocationClick() {
|
|
206
|
+
this.clearData();
|
|
207
|
+
this.sendUpdateLocationEvent();
|
|
208
|
+
}
|
|
209
|
+
async onFloorClick(emitEvent = true) {
|
|
210
|
+
if (this.selectedFloor) {
|
|
211
|
+
localStorage.setItem('floorId', this.selectedFloor.id);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
localStorage.removeItem('floorId');
|
|
215
|
+
}
|
|
216
|
+
if (this.selectedFloor && this.selectedFloor.isMultipleFloorZone) {
|
|
217
|
+
this.selectedZone = this.selectedFloor;
|
|
218
|
+
this.onZoneClick().catch((e) => console.log(e.message));
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this.onZoneClick().catch((e) => console.log(e.message));
|
|
223
|
+
}
|
|
224
|
+
this.sweepToGo = null;
|
|
225
|
+
this.selectedZone = null;
|
|
226
|
+
this.selectedChildZone = null;
|
|
227
|
+
localStorage.removeItem('zoneId');
|
|
228
|
+
localStorage.removeItem('childZoneId');
|
|
229
|
+
if (this.selectedFloor === null) {
|
|
230
|
+
this.navigatorService.navBarZoneIDChange.next(null);
|
|
231
|
+
this.navigatorService.currentNavBarZoneID = null;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (emitEvent) {
|
|
235
|
+
this.navigatorService.navBarZoneIDChange.next(this.selectedFloor.id);
|
|
236
|
+
}
|
|
237
|
+
this.navigatorService.currentNavBarZoneID = this.selectedFloor.id;
|
|
238
|
+
await waitUntil(() => this.zonesPerSpace !== null && this.zonesPerSpace !== undefined);
|
|
239
|
+
this.zonesPerFloor = this.zonesPerSpace.filter((zone) =>
|
|
240
|
+
// zone.id === this.selectedFloor.id ||
|
|
241
|
+
zone.parentID === this.selectedFloor.id);
|
|
242
|
+
this.zonesPerFloor.sort((a, b) => {
|
|
243
|
+
const Collator = new Intl.Collator(undefined, {
|
|
244
|
+
numeric: true,
|
|
245
|
+
sensitivity: 'accent',
|
|
246
|
+
});
|
|
247
|
+
return (Collator.compare(a.code_ref, b.code_ref) ||
|
|
248
|
+
Collator.compare(a.name, b.name));
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async onZoneClick() {
|
|
252
|
+
this.selectedChildZone = null;
|
|
253
|
+
localStorage.removeItem('childZoneId');
|
|
254
|
+
if (this.selectedZone) {
|
|
255
|
+
localStorage.setItem('zoneId', this.selectedZone.id);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
localStorage.removeItem('zoneId');
|
|
259
|
+
}
|
|
260
|
+
if (this.selectedZone === null) {
|
|
261
|
+
if (this.selectedFloor === null) {
|
|
262
|
+
this.navigatorService.navBarZoneIDChange.next(null);
|
|
263
|
+
this.navigatorService.currentNavBarZoneID = null;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
this.navigatorService.navBarZoneIDChange.next(this.selectedFloor.id);
|
|
267
|
+
this.navigatorService.currentNavBarZoneID = this.selectedFloor.id;
|
|
268
|
+
}
|
|
269
|
+
this.sendKinesisAnalyticsEventForZone(this.selectedZone?.id, this.selectedZone?.name).catch((e) => console.log(e.message));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
this.childrenZones = this.zonesPerSpace.filter((zone) => zone.parentID === this.selectedZone.id);
|
|
273
|
+
this.navigatorService.navBarZoneIDChange.next(this.selectedZone.id);
|
|
274
|
+
this.navigatorService.currentNavBarZoneID = this.selectedZone.id;
|
|
275
|
+
this.sendKinesisAnalyticsEventForZone(this.selectedZone?.id, this.selectedZone?.name).catch((e) => console.log(e.message));
|
|
276
|
+
}
|
|
277
|
+
onChildZoneClick() {
|
|
278
|
+
if (this.selectedChildZone) {
|
|
279
|
+
localStorage.setItem('childZoneId', this.selectedChildZone?.id);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
localStorage.removeItem('childZoneId');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async sendKinesisAnalyticsEventForZone(zoneId, zoneName) {
|
|
286
|
+
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
287
|
+
this.awsKinesisAnalytics.getInstance().record(
|
|
288
|
+
// @ts-ignore
|
|
289
|
+
{
|
|
290
|
+
data: {
|
|
291
|
+
eventType: 'Zone Change',
|
|
292
|
+
zoneId: zoneId,
|
|
293
|
+
zoneName: zoneName,
|
|
294
|
+
locationId: this.selectedLocation?.id,
|
|
295
|
+
locationName: this.selectedLocation?.name,
|
|
296
|
+
user: this.userService?.cu,
|
|
297
|
+
timestamp: new Date(),
|
|
298
|
+
floorId: this.selectedFloor?.id,
|
|
299
|
+
childZoneId: this.selectedChildZone?.id,
|
|
300
|
+
},
|
|
301
|
+
streamName: 'smarterplanKinesis-analytics',
|
|
302
|
+
// partitionKey: "",
|
|
303
|
+
}, 'AWSKinesis');
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async onVisitClick(event) {
|
|
307
|
+
this.clearData(false);
|
|
308
|
+
const index = event.target.value;
|
|
309
|
+
const visit = this.visitsPerSpace[index];
|
|
310
|
+
this.selectedModel3d = visit.model3d;
|
|
311
|
+
const parentZoneForVisit = await this.visitService.getDefaultZoneForVisit(visit);
|
|
312
|
+
this.floorsPerSpace = this.zonesPerSpace.filter((zone) => zone.layer &&
|
|
313
|
+
zone.layer.name.includes('FLOOR') &&
|
|
314
|
+
zone.parentID === parentZoneForVisit.id);
|
|
315
|
+
}
|
|
316
|
+
async goTo() {
|
|
317
|
+
if (this.selectedZone && !this.selectedZone.virtual) {
|
|
318
|
+
this.sweepToGo = this.selectedZone.startSweepID
|
|
319
|
+
? this.selectedZone.startSweepID
|
|
320
|
+
: this.selectedZone.sweepIDs[0];
|
|
321
|
+
}
|
|
322
|
+
if (this.selectedFloor && !this.selectedZone) {
|
|
323
|
+
this.floorToGo = this.selectedFloor;
|
|
324
|
+
}
|
|
325
|
+
if (this.isWithinSameVisit()) {
|
|
326
|
+
this.goToSweepOrFloor();
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
if (this.sweepToGo) {
|
|
330
|
+
this.viewerService.setSweepToMove(this.sweepToGo);
|
|
331
|
+
}
|
|
332
|
+
if (this.floorToGo && this.floorsPerSpace.length !== 1) {
|
|
333
|
+
this.navigatorService.floorToGo = this.floorToGo;
|
|
334
|
+
}
|
|
335
|
+
this.router
|
|
336
|
+
.navigate(['visit', this.selectedLocation.id], {
|
|
337
|
+
queryParams: { model3D: this.selectedModel3d },
|
|
338
|
+
})
|
|
339
|
+
.catch((e) => console.log(e.message));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
isWithinSameVisit() {
|
|
343
|
+
return (this.currentLocationID === this.selectedLocation.id &&
|
|
344
|
+
this.selectedModel3d === this.currentModel3d);
|
|
345
|
+
}
|
|
346
|
+
goToSweepOrFloor() {
|
|
347
|
+
if (this.sweepToGo) {
|
|
348
|
+
this.navigatorService.goToSweepWithRotation(this.sweepToGo);
|
|
349
|
+
}
|
|
350
|
+
if (this.floorToGo) {
|
|
351
|
+
this.navigatorService.goToFloor(this.floorToGo);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// hasHistory(): boolean {
|
|
355
|
+
// return this.navigatorService.modelHasHistory(this.selectedModel3d);
|
|
356
|
+
// }
|
|
357
|
+
canGo() {
|
|
358
|
+
const viewerIsReady = this.viewerService.isLoaded && this.viewerService.showingViewer;
|
|
359
|
+
const noViewer = !this.viewerService.showingViewer;
|
|
360
|
+
return viewerIsReady || noViewer;
|
|
361
|
+
}
|
|
362
|
+
showLocation() {
|
|
363
|
+
if (window.innerWidth < 750 &&
|
|
364
|
+
this.navbarSelectMenu &&
|
|
365
|
+
this.navbarSelectMenu.nativeElement.className.search('show') === -1 &&
|
|
366
|
+
this.selectedLocation) {
|
|
367
|
+
return this.selectedLocation.name;
|
|
368
|
+
}
|
|
369
|
+
return '';
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
NavigationBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NavigationBarComponent, deps: [{ token: 'currentAwsKinesisAnalyticsService' }, { token: i1.Router }, { token: i2.SpaceService }, { token: i3.BaseUserService }, { token: i4.ZoneService }, { token: i5.VisitService }, { token: i6.ViewerService }, { token: i7.NavigatorService }, { token: i8.ZoneChangeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
373
|
+
NavigationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: NavigationBarComponent, selector: "lib-navigation-bar", viewQueries: [{ propertyName: "navbarSelectMenu", first: true, predicate: ["navbarSelectMenu"], descendants: true }], ngImport: i0, template: "<nav class=\"navbar navbar-expand-md navbar-dark navbar-inverse second-nav\">\r\n <div class=\"d-flex col-12\">\r\n <div #navbarSelectMenu class=\"collapse navbar-collapse\" id=\"nav-item-container-blue\">\r\n <div class=\"d-flex flex-column flex-md-row \">\r\n <select class=\"form-control flex-fill location select-menu\" [(ngModel)]=\"selectedLocation\"\r\n (ngModelChange)=\"onLocationClick()\">\r\n <option [ngValue]=\"null\" selected>{{ 'Location' | translate }}</option>\r\n <option *ngFor=\"let loc of locations; index as index\" [ngValue]=\"loc\"> {{ loc.name }}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu\" (change)=\"onVisitClick($event)\"\r\n *ngIf=\"visitsPerSpace && visitsPerSpace.length > 1\">\r\n <option value=\"default\" selected disabled hidden>{{'Visit' | translate}}</option>\r\n <option *ngFor=\"let visit of visitsPerSpace; index as index\" value=\"{{index}}\">{{ visit.name}}\r\n </option>\r\n </select>\r\n <select class=\"form-control flex-fill floor select-menu\" [(ngModel)]=\"selectedFloor\"\r\n (ngModelChange)=\"onFloorClick()\">\r\n <option [ngValue]=\"null\" selected>{{'Floor' | translate}}</option>\r\n <option *ngFor=\"let floor of floorsPerSpace\" [ngValue]=\"floor\">{{ floor.name}}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu zone\" [(ngModel)]=\"selectedZone\"\r\n (ngModelChange)=\"onZoneClick()\">\r\n <option [ngValue]=\"null\" selected>{{'Zone' | translate}}</option>\r\n <option *ngFor=\"let zone of zonesPerFloor\" [ngValue]=\"zone\"><span\r\n *ngIf=\"zone.code_ref\">{{zone.code_ref}}_</span>{{zone.name}}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu\" [(ngModel)]=\"selectedChildZone\"\r\n *ngIf=\"childrenZones && childrenZones.length>0\" (ngModelChange)=\"onChildZoneClick()\">\r\n <option [ngValue]=\"null\" selected disabled>{{'Zone' | translate}}</option>\r\n <option *ngFor=\"let zone of childrenZones\" [ngValue]=\"zone\">{{ zone.name}}</option>\r\n </select>\r\n <!-- <select class=\"form-control flex-fill\">\r\n <option i18n>{{'Favorites' | translate}}</option>\r\n </select> -->\r\n </div>\r\n <div class=\"row\" style=\"margin-left: 0;\">\r\n <div class=\"outer_circle\">\r\n <button id='btn-icon' [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\"\r\n (click)=\"goTo()\"></button>\r\n </div>\r\n <button (click)=\"goTo()\" class=\"btn rounded-pill btn-3d\"\r\n [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\">{{'3D visit' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <h4 style=\"line-height: 29px;margin: 0;\" *ngIf=\"showLocation()\">\r\n {{ showLocation() }}\r\n </h4>\r\n </div>\r\n</nav>", styles: [":host{position:sticky;top:0;height:123px}.navbar{z-index:200;padding:.4rem 1rem}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0}.form-control{width:auto;min-width:80px;max-width:18%}.location{width:auto;max-width:35%}.floor,.zone{width:auto;max-width:30%}button{color:#fff;padding:5px 10px;font-size:1.1em}.btn-3d:active:hover:not([disabled]){color:var(--smarterplan-secondary)}.btn-3d[disabled]:hover{color:#fff}.navbar-toggler{margin-right:1em}.select-menu{max-width:inherit}#btn-icon{width:30px;height:30px;background:url(../../../../../assets/icons/goTo3d.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../../assets/icons/goTo3d-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../../assets/icons/goTo3d.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px}@media (max-width: 767px){.navbar{padding:.2rem .5rem}.form-control,.location,.floor,.zone{max-width:100%;margin-bottom:15px}input,select{margin-right:0;margin-bottom:15px}#btn-icon{width:20px;height:20px}}\n"], directives: [{ type: i9.NgbNavbar, selector: ".navbar" }, { type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i12.TranslatePipe } });
|
|
374
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: NavigationBarComponent, decorators: [{
|
|
375
|
+
type: Component,
|
|
376
|
+
args: [{ selector: 'lib-navigation-bar', template: "<nav class=\"navbar navbar-expand-md navbar-dark navbar-inverse second-nav\">\r\n <div class=\"d-flex col-12\">\r\n <div #navbarSelectMenu class=\"collapse navbar-collapse\" id=\"nav-item-container-blue\">\r\n <div class=\"d-flex flex-column flex-md-row \">\r\n <select class=\"form-control flex-fill location select-menu\" [(ngModel)]=\"selectedLocation\"\r\n (ngModelChange)=\"onLocationClick()\">\r\n <option [ngValue]=\"null\" selected>{{ 'Location' | translate }}</option>\r\n <option *ngFor=\"let loc of locations; index as index\" [ngValue]=\"loc\"> {{ loc.name }}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu\" (change)=\"onVisitClick($event)\"\r\n *ngIf=\"visitsPerSpace && visitsPerSpace.length > 1\">\r\n <option value=\"default\" selected disabled hidden>{{'Visit' | translate}}</option>\r\n <option *ngFor=\"let visit of visitsPerSpace; index as index\" value=\"{{index}}\">{{ visit.name}}\r\n </option>\r\n </select>\r\n <select class=\"form-control flex-fill floor select-menu\" [(ngModel)]=\"selectedFloor\"\r\n (ngModelChange)=\"onFloorClick()\">\r\n <option [ngValue]=\"null\" selected>{{'Floor' | translate}}</option>\r\n <option *ngFor=\"let floor of floorsPerSpace\" [ngValue]=\"floor\">{{ floor.name}}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu zone\" [(ngModel)]=\"selectedZone\"\r\n (ngModelChange)=\"onZoneClick()\">\r\n <option [ngValue]=\"null\" selected>{{'Zone' | translate}}</option>\r\n <option *ngFor=\"let zone of zonesPerFloor\" [ngValue]=\"zone\"><span\r\n *ngIf=\"zone.code_ref\">{{zone.code_ref}}_</span>{{zone.name}}</option>\r\n </select>\r\n <select class=\"form-control flex-fill select-menu\" [(ngModel)]=\"selectedChildZone\"\r\n *ngIf=\"childrenZones && childrenZones.length>0\" (ngModelChange)=\"onChildZoneClick()\">\r\n <option [ngValue]=\"null\" selected disabled>{{'Zone' | translate}}</option>\r\n <option *ngFor=\"let zone of childrenZones\" [ngValue]=\"zone\">{{ zone.name}}</option>\r\n </select>\r\n <!-- <select class=\"form-control flex-fill\">\r\n <option i18n>{{'Favorites' | translate}}</option>\r\n </select> -->\r\n </div>\r\n <div class=\"row\" style=\"margin-left: 0;\">\r\n <div class=\"outer_circle\">\r\n <button id='btn-icon' [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\"\r\n (click)=\"goTo()\"></button>\r\n </div>\r\n <button (click)=\"goTo()\" class=\"btn rounded-pill btn-3d\"\r\n [disabled]=\"!selectedLocation || !selectedModel3d || !canGo()\">{{'3D visit' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <h4 style=\"line-height: 29px;margin: 0;\" *ngIf=\"showLocation()\">\r\n {{ showLocation() }}\r\n </h4>\r\n </div>\r\n</nav>", styles: [":host{position:sticky;top:0;height:123px}.navbar{z-index:200;padding:.4rem 1rem}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0}.form-control{width:auto;min-width:80px;max-width:18%}.location{width:auto;max-width:35%}.floor,.zone{width:auto;max-width:30%}button{color:#fff;padding:5px 10px;font-size:1.1em}.btn-3d:active:hover:not([disabled]){color:var(--smarterplan-secondary)}.btn-3d[disabled]:hover{color:#fff}.navbar-toggler{margin-right:1em}.select-menu{max-width:inherit}#btn-icon{width:30px;height:30px;background:url(../../../../../assets/icons/goTo3d.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../../assets/icons/goTo3d-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../../assets/icons/goTo3d.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px}@media (max-width: 767px){.navbar{padding:.2rem .5rem}.form-control,.location,.floor,.zone{max-width:100%;margin-bottom:15px}input,select{margin-right:0;margin-bottom:15px}#btn-icon{width:20px;height:20px}}\n"] }]
|
|
377
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
378
|
+
type: Inject,
|
|
379
|
+
args: ['currentAwsKinesisAnalyticsService']
|
|
380
|
+
}] }, { type: i1.Router }, { type: i2.SpaceService }, { type: i3.BaseUserService }, { type: i4.ZoneService }, { type: i5.VisitService }, { type: i6.ViewerService }, { type: i7.NavigatorService }, { type: i8.ZoneChangeService }]; }, propDecorators: { navbarSelectMenu: [{
|
|
381
|
+
type: ViewChild,
|
|
382
|
+
args: ['navbarSelectMenu']
|
|
383
|
+
}] } });
|
|
384
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtYmFyL25hdmlnYXRpb24tYmFyL25hdmlnYXRpb24tYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9uYXZpZ2F0aW9uLWJhci9uYXZpZ2F0aW9uLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckUsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQWVyRCxNQUFNLE9BQU8sc0JBQXNCO0lBdUNqQyxZQUVFLDJCQUFnQyxFQUN4QixNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsV0FBNEIsRUFDNUIsV0FBd0IsRUFDeEIsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGlCQUFvQztRQVBwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXRDOUMscUJBQWdCLEdBQVUs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VUFBVSxHQUFHLEdBQUc7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxnQkFBZ0IsRUFDckI7WUFDQSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7U0FDbkM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O21IQWhjVSxzQkFBc0Isa0JBd0N2QixtQ0FBbUM7dUdBeENsQyxzQkFBc0IsZ0xDbEJuQyw2MUdBaURNOzJGRC9CTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9COzswQkE0QzNCLE1BQU07MkJBQUMsbUNBQW1DOzBRQXJDZCxnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTcGFjZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RlbHMvc3BhY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFZpc2l0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21vZGVscy92aXNpdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RlbHMvem9uZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25hdmlnYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3BhY2UsIFZpc2l0LCBab25lIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7Wm9uZUNoYW5nZVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy96b25lQ2hhbmdlLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW5hdmlnYXRpb24tYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi1iYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25hdmlnYXRpb24tYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBhd3NLaW5lc2lzQW5hbHl0aWNzOiBhbnk7IC8vQVdTXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ25hdmJhclNlbGVjdE1lbnUnKSBuYXZiYXJTZWxlY3RNZW51ITogYW55O1xyXG5cclxuICBsb2NhdGlvbnM6IFNwYWNlW107XHJcblxyXG4gIGN1cnJlbnRMb2NhdGlvbklEOiBzdHJpbmc7XHJcblxyXG4gIGN1cnJlbnRNb2RlbDNkOiBzdHJpbmc7XHJcblxyXG4gIHNlbGVjdGVkTG9jYXRpb246IFNwYWNlID0gbnVsbDtcclxuXHJcbiAgc2VsZWN0ZWRNb2RlbDNkOiBzdHJpbmc7XHJcblxyXG4gIHNlbGVjdGVkRmxvb3I6IFpvbmUgPSBudWxsO1xyXG5cclxuICBzZWxlY3RlZFpvbmU6IFpvbmUgPSBudWxsO1xyXG5cclxuICBzZWxlY3RlZENoaWxkWm9uZTogWm9uZSA9IG51bGw7XHJcblxyXG4gIHZpc2l0c1BlclNwYWNlOiBWaXNpdFtdID0gbnVsbDtcclxuXHJcbiAgZmxvb3JzUGVyU3BhY2U6IFpvbmVbXSA9IG51bGw7XHJcblxyXG4gIHpvbmVzUGVyU3BhY2U6IFpvbmVbXSA9IG51bGw7XHJcblxyXG4gIHpvbmVzUGVyRmxvb3I6IFpvbmVbXSA9IG51bGw7XHJcblxyXG4gIGNoaWxkcmVuWm9uZXM6IFpvbmVbXSA9IG51bGw7XHJcblxyXG4gIHN3ZWVwVG9Hbzogc3RyaW5nO1xyXG5cclxuICBmbG9vclRvR286IFpvbmU7XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgbmF2RXZlbnRzOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2N1cnJlbnRBd3NLaW5lc2lzQW5hbHl0aWNzU2VydmljZScpXHJcbiAgICBhd3NLaW5lc2lzQW5hbHl0aWNzSW5qZWN0ZWQ6IGFueSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHZpc2l0U2VydmljZTogVmlzaXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6b25lQ2hhbmdlU2VydmljZTogWm9uZUNoYW5nZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcyA9IGF3c0tpbmVzaXNBbmFseXRpY3NJbmplY3RlZDtcclxuICAgIHRoaXMuc3BhY2VTZXJ2aWNlLmxvY2F0aW9uVXBkYXRlZFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGxvY3MpID0+IHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY3M7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb25CeUlEKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWRcclxuICAgICAgICAgICk7IC8vIFVwZGF0ZSBPYmplY3QgKG9iamVjdCBhZGRyZXNzIHdpbGwgY2hhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnZpZXdlcklzT25cclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOiB7IHNwYWNlSUQ6IHN0cmluZzsgbW9kZWwzRDogc3RyaW5nOyBzd2VlcDogc3RyaW5nIHwgbnVsbCB9KSA9PiB7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbWVudSBuYXZpZ2F0aW9uIHJlY2VpdmVkIHVwZGF0ZScsIGRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb25JRCA9IGRhdGEuc3BhY2VJRDtcclxuICAgICAgICAgIHRoaXMuY3VycmVudE1vZGVsM2QgPSBkYXRhLm1vZGVsM0Q7XHJcbiAgICAgICAgICBpZiAoIWRhdGEuc3BhY2VJRCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbG9jYXRpb25JZCcpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRVcGRhdGVMb2NhdGlvbkV2ZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgKCF0aGlzLnNlbGVjdGVkTG9jYXRpb24gfHxcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWQgIT09IGRhdGEuc3BhY2VJRCkgJiZcclxuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSB0aGlzLmZpbmRMb2NhdGlvbkJ5SUQoZGF0YS5zcGFjZUlEKTtcclxuICAgICAgICAgICAgdGhpcy5zZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdlIGxpc3RlbiBmb3IgTG9jYXRpb24gY2hhbmdlIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5sb2NhdGlvbklEQ2hhbmdlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xlYXJEYXRhKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb25JRCA9IGlkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IHRoaXMuZmluZExvY2F0aW9uQnlJRChpZCk7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJMb2NhdGlvbklEID0gaWQ7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGVkTG9jYXRpb25DaGFuZ2VkKCkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLnpvbmVzRm9yVXNlckNoYW5nZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHpvbmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHpvbmVzKSB7XHJcbiAgICAgICAgICBhd2FpdCB3YWl0VW50aWwoKCkgPT4gdGhpcy5mbG9vcnNQZXJTcGFjZSAhPT0gbnVsbCk7XHJcbiAgICAgICAgICBjb25zdCBmbG9vclpvbmUgPSB6b25lcy5maW5kKFxyXG4gICAgICAgICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdGTE9PUidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZmxvb3Jab25lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IHRoaXMuZmxvb3JzUGVyU3BhY2UuZmluZChcclxuICAgICAgICAgICAgICAoZikgPT4gZi5pZCA9PT0gZmxvb3Jab25lLmlkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gZGlzcGF0Y2ggdmFsdWUgb2YgIHRoaXMuc2VsZWN0ZWRGbG9vciBpbiBhbGwgcG9pL3RpY2tldC9lcXVpcG1lbnQvbWVhc3VyZSBzZXJ2aWNlc1xyXG4gICAgICAgICAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLmZsb29ySGFzQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRGbG9vcik7XHJcbiAgICAgICAgICAgIHRoaXMub25GbG9vckNsaWNrKGZhbHNlKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgYXdhaXQgdGhpcy5pbml0TG9jYXRpb25zKCk7XHJcbiAgICB0aGlzLmhhbmRsZVN0YXJ0VXJsKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8vIENhcHR1cmUgdGhlIFwiaWRcIiBpbiBsb2NhbGlzYXRpb24vOmlkIHJvdXRlc1xyXG4gIGhhbmRsZVN0YXJ0VXJsKCkge1xyXG4gICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnbG9jYWxpc2F0aW9uLycpKSB7XHJcbiAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCcvJyk7IC8vIC9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uL2ZjMGFhZGI3LTNjODktNDM0OS1hZDFmLWJmZTliNDQ5MTZjMFxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcclxuICAgICAgY29uc3QgbG9jSUQgPSBwYXRoc1szXTtcclxuICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uSUQgIT09IGxvY0lEKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckRhdGEoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbklEID0gbG9jSUQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb25CeUlEKGxvY0lEKTtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhckxvY2F0aW9uSUQgPSBsb2NJRDtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0ZWRMb2NhdGlvbkNoYW5nZWQoKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRMb2NhdGlvbnMoKSB7XHJcbiAgICB0aGlzLmxvY2F0aW9ucyA9IHRoaXMuc3BhY2VTZXJ2aWNlLmxvY2F0aW9uc0ZvclVzZXI7XHJcbiAgICBpZiAodGhpcy5sb2NhdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25zID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0TG9jYXRpb25zRm9yQ3VycmVudFVzZXIoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmN1cnJlbnRMb2NhdGlvbklEICYmIHRoaXMubG9jYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb25CeUlEKHRoaXMuY3VycmVudExvY2F0aW9uSUQpO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIGEgbG9jYXRpb24gd2l0aCBhIGdpdmVuIElEXHJcbiAgICogQHBhcmFtIGlkIElEIGZvciB0aGUgbG9jYXRpb25cclxuICAgKiBAcmV0dXJucyBUaGUgbG9jYXRpb24gb3IgbnVsbCBpZiBubyBsb2NhdGlvbiB3ZXJlIGZvdW5kXHJcbiAgICovXHJcbiAgZmluZExvY2F0aW9uQnlJRChpZDogc3RyaW5nKTogU3BhY2Uge1xyXG4gICAgY29uc3Qgc3BhY2UgPSB0aGlzLmxvY2F0aW9ucy5maW5kKChsb2MpID0+IGxvYy5pZCA9PT0gaWQpO1xyXG4gICAgcmV0dXJuIHNwYWNlIHx8IG51bGw7IC8qKiBDb252ZXJ0IHRvIG51bGwgaWYgdW5kZWZpbmVkICovXHJcbiAgfVxyXG5cclxuICBjbGVhckRhdGEoY2xlYXJWaXNpdHM6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLmZsb29yc1BlclNwYWNlID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IG51bGw7XHJcbiAgICB0aGlzLnpvbmVzUGVyRmxvb3IgPSBudWxsO1xyXG4gICAgdGhpcy5jaGlsZHJlblpvbmVzID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbDNkID0gbnVsbDtcclxuICAgIHRoaXMuc3dlZXBUb0dvID0gbnVsbDtcclxuICAgIHRoaXMuZmxvb3JUb0dvID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRab25lID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGlsZFpvbmUgPSBudWxsO1xyXG4gICAgaWYgKGNsZWFyVmlzaXRzKSB7XHJcbiAgICAgIHRoaXMudmlzaXRzUGVyU3BhY2UgPSBudWxsO1xyXG4gICAgICB0aGlzLnpvbmVzUGVyU3BhY2UgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xvY2F0aW9uSWQnKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdmbG9vcklkJyk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnem9uZUlkJyk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2hpbGRab25lSWQnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gdGhlIHNlbGVjdGVkTG9jYXRpb24gY2hhbmdlc1xyXG4gICAqIFNlbmQgYSBldmVudCB0byBsb2NhdGlvbklEQ2hhbmdlIGZyb20gTmF2aWdhdG9yU2VydmljZVxyXG4gICAqIFRoZSBldmVudCB3aWxsIGJlIGNhdGNoIGJ5IHRoaXMgY29tcG9uZW50IGFuZCB0aGUgZmlsdGVyIGJhciB3aWxsIGJlIHVwZGF0ZVxyXG4gICAqL1xyXG4gIHNlbmRVcGRhdGVMb2NhdGlvbkV2ZW50KCkge1xyXG4gICAgY29uc3QgbG9jYXRpb25JRCA9IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA/IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCA6IG51bGw7XHJcbiAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubG9jYXRpb25JRENoYW5nZS5uZXh0KGxvY2F0aW9uSUQpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbikge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbG9jYXRpb25JZCcsIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbG9jYXRpb25JZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TZWxlY3RlZExvY2F0aW9uQ2hhbmdlZCgpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZExvY2F0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMudmlzaXRzUGVyU3BhY2UgPSBhd2FpdCB0aGlzLnZpc2l0U2VydmljZS5nZXRWaXNpdHNGb3JTcGFjZUZvclVzZXIoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uLmlkXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuem9uZXNQZXJTcGFjZSA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuZ2V0Wm9uZXNCeVNwYWNlRm9yVXNlcihcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKHRoaXMudmlzaXRzUGVyU3BhY2UubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsM2QgPSB0aGlzLnZpc2l0c1BlclNwYWNlWzBdLm1vZGVsM2Q7XHJcbiAgICAgICAgdGhpcy5mbG9vcnNQZXJTcGFjZSA9IHRoaXMuem9uZXNQZXJTcGFjZS5maWx0ZXIoXHJcbiAgICAgICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUuaW5jbHVkZXMoJ0ZMT09SJylcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIHNvcnQgZnJvbSBoaWdoZXN0IGZsb29yIHRvIGxvd2VzdFxyXG4gICAgICAgIHRoaXMuZmxvb3JzUGVyU3BhY2Uuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEubWV0YWRhdGEgJiYgYi5tZXRhZGF0YSkge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YUEgPSBKU09OLnBhcnNlKGEubWV0YWRhdGEpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YUIgPSBKU09OLnBhcnNlKGIubWV0YWRhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIG1ldGFkYXRhQi5tYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSAtXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGFBLm1hdHRlcnBvcnRGbG9vclNlcXVlbmNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBtdWx0aUZsb29yWm9uZXMgPSB0aGlzLnpvbmVzUGVyU3BhY2UuZmlsdGVyKFxyXG4gICAgICAgICAgKHpvbmUpID0+IHpvbmUuaXNNdWx0aXBsZUZsb29yWm9uZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gc29ydCBhbHBoYWJldGljYWxseVxyXG4gICAgICAgIG11bHRpRmxvb3Jab25lcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcclxuICAgICAgICAvLyBtZXJnZSBtdWx0aUZsb29yIGFuZCBGbG9vcnNcclxuICAgICAgICB0aGlzLmZsb29yc1BlclNwYWNlID0gWy4uLnRoaXMuZmxvb3JzUGVyU3BhY2UsIC4uLm11bHRpRmxvb3Jab25lc107XHJcbiAgICAgICAgaWYgKHRoaXMuZmxvb3JzUGVyU3BhY2UubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICBbdGhpcy5zZWxlY3RlZEZsb29yXSA9IHRoaXMuZmxvb3JzUGVyU3BhY2U7XHJcbiAgICAgICAgICB0aGlzLm9uRmxvb3JDbGljayhmYWxzZSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uQ2hvc2VuTG9jYXRpb24nLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkxvY2F0aW9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmNsZWFyRGF0YSgpO1xyXG4gICAgdGhpcy5zZW5kVXBkYXRlTG9jYXRpb25FdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25GbG9vckNsaWNrKGVtaXRFdmVudCA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Zsb29ySWQnLCB0aGlzLnNlbGVjdGVkRmxvb3IuaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2Zsb29ySWQnKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IgJiYgdGhpcy5zZWxlY3RlZEZsb29yLmlzTXVsdGlwbGVGbG9vclpvbmUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFpvbmUgPSB0aGlzLnNlbGVjdGVkRmxvb3I7XHJcbiAgICAgIHRoaXMub25ab25lQ2xpY2soKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25ab25lQ2xpY2soKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN3ZWVwVG9HbyA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hpbGRab25lID0gbnVsbDtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd6b25lSWQnKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjaGlsZFpvbmVJZCcpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGbG9vciA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubmF2QmFyWm9uZUlEQ2hhbmdlLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50TmF2QmFyWm9uZUlEID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGVtaXRFdmVudCkge1xyXG4gICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubmF2QmFyWm9uZUlEQ2hhbmdlLm5leHQodGhpcy5zZWxlY3RlZEZsb29yLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudE5hdkJhclpvbmVJRCA9IHRoaXMuc2VsZWN0ZWRGbG9vci5pZDtcclxuICAgIGF3YWl0IHdhaXRVbnRpbChcclxuICAgICAgKCkgPT4gdGhpcy56b25lc1BlclNwYWNlICE9PSBudWxsICYmIHRoaXMuem9uZXNQZXJTcGFjZSAhPT0gdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gICAgdGhpcy56b25lc1BlckZsb29yID0gdGhpcy56b25lc1BlclNwYWNlLmZpbHRlcihcclxuICAgICAgKHpvbmUpID0+XHJcbiAgICAgICAgLy8gem9uZS5pZCA9PT0gdGhpcy5zZWxlY3RlZEZsb29yLmlkIHx8XHJcbiAgICAgICAgem9uZS5wYXJlbnRJRCA9PT0gdGhpcy5zZWxlY3RlZEZsb29yLmlkXHJcbiAgICApO1xyXG4gICAgdGhpcy56b25lc1BlckZsb29yLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgQ29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih1bmRlZmluZWQsIHtcclxuICAgICAgICBudW1lcmljOiB0cnVlLFxyXG4gICAgICAgIHNlbnNpdGl2aXR5OiAnYWNjZW50JyxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgQ29sbGF0b3IuY29tcGFyZShhLmNvZGVfcmVmLCBiLmNvZGVfcmVmKSB8fFxyXG4gICAgICAgIENvbGxhdG9yLmNvbXBhcmUoYS5uYW1lLCBiLm5hbWUpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uWm9uZUNsaWNrKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENoaWxkWm9uZSA9IG51bGw7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2hpbGRab25lSWQnKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkWm9uZSkge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnem9uZUlkJywgdGhpcy5zZWxlY3RlZFpvbmUuaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3pvbmVJZCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRab25lID09PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IgPT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubmF2QmFyWm9uZUlEQ2hhbmdlLm5leHQobnVsbCk7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJab25lSUQgPSBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5uYXZCYXJab25lSURDaGFuZ2UubmV4dCh0aGlzLnNlbGVjdGVkRmxvb3IuaWQpO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50TmF2QmFyWm9uZUlEID0gdGhpcy5zZWxlY3RlZEZsb29yLmlkO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VuZEtpbmVzaXNBbmFseXRpY3NFdmVudEZvclpvbmUoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmU/LmlkLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRab25lPy5uYW1lXHJcbiAgICAgICkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoaWxkcmVuWm9uZXMgPSB0aGlzLnpvbmVzUGVyU3BhY2UuZmlsdGVyKFxyXG4gICAgICAoem9uZSkgPT4gem9uZS5wYXJlbnRJRCA9PT0gdGhpcy5zZWxlY3RlZFpvbmUuaWRcclxuICAgICk7XHJcbiAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UubmF2QmFyWm9uZUlEQ2hhbmdlLm5leHQodGhpcy5zZWxlY3RlZFpvbmUuaWQpO1xyXG4gICAgdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnROYXZCYXJab25lSUQgPSB0aGlzLnNlbGVjdGVkWm9uZS5pZDtcclxuICAgIHRoaXMuc2VuZEtpbmVzaXNBbmFseXRpY3NFdmVudEZvclpvbmUoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRab25lPy5pZCxcclxuICAgICAgdGhpcy5zZWxlY3RlZFpvbmU/Lm5hbWVcclxuICAgICkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlsZFpvbmVDbGljaygpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2hpbGRab25lKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjaGlsZFpvbmVJZCcsIHRoaXMuc2VsZWN0ZWRDaGlsZFpvbmU/LmlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjaGlsZFpvbmVJZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2VuZEtpbmVzaXNBbmFseXRpY3NFdmVudEZvclpvbmUoXHJcbiAgICB6b25lSWQ6IHN0cmluZyxcclxuICAgIHpvbmVOYW1lOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghIXRoaXMuYXdzS2luZXNpc0FuYWx5dGljcyAmJiAhIXRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5yZWNvcmQgJiYgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCgpKSB7XHJcbiAgICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5nZXRJbnN0YW5jZSgpLnJlY29yZChcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBldmVudFR5cGU6ICdab25lIENoYW5nZScsXHJcbiAgICAgICAgICAgIHpvbmVJZDogem9uZUlkLFxyXG4gICAgICAgICAgICB6b25lTmFtZTogem9uZU5hbWUsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uSWQ6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uTmFtZTogdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5uYW1lLFxyXG4gICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJTZXJ2aWNlPy5jdSxcclxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICBmbG9vcklkOiB0aGlzLnNlbGVjdGVkRmxvb3I/LmlkLFxyXG4gICAgICAgICAgICBjaGlsZFpvbmVJZDogdGhpcy5zZWxlY3RlZENoaWxkWm9uZT8uaWQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3RyZWFtTmFtZTogJ3NtYXJ0ZXJwbGFuS2luZXNpcy1hbmFseXRpY3MnLFxyXG4gICAgICAgICAgLy8gcGFydGl0aW9uS2V5OiBcIlwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ0FXU0tpbmVzaXMnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblZpc2l0Q2xpY2soZXZlbnQpIHtcclxuICAgIHRoaXMuY2xlYXJEYXRhKGZhbHNlKTtcclxuICAgIGNvbnN0IGluZGV4ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgdmlzaXQgPSB0aGlzLnZpc2l0c1BlclNwYWNlW2luZGV4XTtcclxuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbDNkID0gdmlzaXQubW9kZWwzZDtcclxuICAgIGNvbnN0IHBhcmVudFpvbmVGb3JWaXNpdCA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmdldERlZmF1bHRab25lRm9yVmlzaXQoXHJcbiAgICAgIHZpc2l0XHJcbiAgICApO1xyXG4gICAgdGhpcy5mbG9vcnNQZXJTcGFjZSA9IHRoaXMuem9uZXNQZXJTcGFjZS5maWx0ZXIoXHJcbiAgICAgICh6b25lKSA9PlxyXG4gICAgICAgIHpvbmUubGF5ZXIgJiZcclxuICAgICAgICB6b25lLmxheWVyLm5hbWUuaW5jbHVkZXMoJ0ZMT09SJykgJiZcclxuICAgICAgICB6b25lLnBhcmVudElEID09PSBwYXJlbnRab25lRm9yVmlzaXQuaWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnb1RvKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRab25lICYmICF0aGlzLnNlbGVjdGVkWm9uZS52aXJ0dWFsKSB7XHJcbiAgICAgIHRoaXMuc3dlZXBUb0dvID0gdGhpcy5zZWxlY3RlZFpvbmUuc3RhcnRTd2VlcElEXHJcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkWm9uZS5zdGFydFN3ZWVwSURcclxuICAgICAgICA6IHRoaXMuc2VsZWN0ZWRab25lLnN3ZWVwSURzWzBdO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGbG9vciAmJiAhdGhpcy5zZWxlY3RlZFpvbmUpIHtcclxuICAgICAgdGhpcy5mbG9vclRvR28gPSB0aGlzLnNlbGVjdGVkRmxvb3I7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1dpdGhpblNhbWVWaXNpdCgpKSB7XHJcbiAgICAgIHRoaXMuZ29Ub1N3ZWVwT3JGbG9vcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc3dlZXBUb0dvKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNldFN3ZWVwVG9Nb3ZlKHRoaXMuc3dlZXBUb0dvKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5mbG9vclRvR28gJiYgdGhpcy5mbG9vcnNQZXJTcGFjZS5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2UuZmxvb3JUb0dvID0gdGhpcy5mbG9vclRvR287XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yb3V0ZXJcclxuICAgICAgICAubmF2aWdhdGUoWyd2aXNpdCcsIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZF0sIHtcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGVsM0Q6IHRoaXMuc2VsZWN0ZWRNb2RlbDNkIH0sXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNXaXRoaW5TYW1lVmlzaXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbklEID09PSB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWQgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsM2QgPT09IHRoaXMuY3VycmVudE1vZGVsM2RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnb1RvU3dlZXBPckZsb29yKCkge1xyXG4gICAgaWYgKHRoaXMuc3dlZXBUb0dvKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5nb1RvU3dlZXBXaXRoUm90YXRpb24odGhpcy5zd2VlcFRvR28pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmxvb3JUb0dvKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdG9yU2VydmljZS5nb1RvRmxvb3IodGhpcy5mbG9vclRvR28pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gaGFzSGlzdG9yeSgpOiBib29sZWFuIHtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMubmF2aWdhdG9yU2VydmljZS5tb2RlbEhhc0hpc3RvcnkodGhpcy5zZWxlY3RlZE1vZGVsM2QpO1xyXG4gIC8vIH1cclxuXHJcbiAgY2FuR28oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB2aWV3ZXJJc1JlYWR5ID1cclxuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmlzTG9hZGVkICYmIHRoaXMudmlld2VyU2VydmljZS5zaG93aW5nVmlld2VyO1xyXG4gICAgY29uc3Qgbm9WaWV3ZXIgPSAhdGhpcy52aWV3ZXJTZXJ2aWNlLnNob3dpbmdWaWV3ZXI7XHJcbiAgICByZXR1cm4gdmlld2VySXNSZWFkeSB8fCBub1ZpZXdlcjtcclxuICB9XHJcblxyXG4gIHNob3dMb2NhdGlvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKFxyXG4gICAgICB3aW5kb3cuaW5uZXJXaWR0aCA8IDc1MCAmJlxyXG4gICAgICB0aGlzLm5hdmJhclNlbGVjdE1lbnUgJiZcclxuICAgICAgdGhpcy5uYXZiYXJTZWxlY3RNZW51Lm5hdGl2ZUVsZW1lbnQuY2xhc3NOYW1lLnNlYXJjaCgnc2hvdycpID09PSAtMSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb25cclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZExvY2F0aW9uLm5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG59XHJcbiIsIjxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBuYXZiYXItZGFyayBuYXZiYXItaW52ZXJzZSBzZWNvbmQtbmF2XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC0xMlwiPlxyXG4gICAgICAgIDxkaXYgI25hdmJhclNlbGVjdE1lbnUgY2xhc3M9XCJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2VcIiBpZD1cIm5hdi1pdGVtLWNvbnRhaW5lci1ibHVlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZmxleC1tZC1yb3cgXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZmlsbCBsb2NhdGlvbiBzZWxlY3QtbWVudVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRMb2NhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Mb2NhdGlvbkNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIiBzZWxlY3RlZD57eyAnTG9jYXRpb24nIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jIG9mIGxvY2F0aW9uczsgaW5kZXggYXMgaW5kZXhcIiBbbmdWYWx1ZV09XCJsb2NcIj4ge3sgbG9jLm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBmbGV4LWZpbGwgc2VsZWN0LW1lbnVcIiAoY2hhbmdlKT1cIm9uVmlzaXRDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZpc2l0c1BlclNwYWNlICYmIHZpc2l0c1BlclNwYWNlLmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVmYXVsdFwiIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj57eydWaXNpdCcgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZpc2l0IG9mIHZpc2l0c1BlclNwYWNlOyBpbmRleCBhcyBpbmRleFwiIHZhbHVlPVwie3tpbmRleH19XCI+e3sgdmlzaXQubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZmxleC1maWxsIGZsb29yIHNlbGVjdC1tZW51XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCJcclxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2xpY2soKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiIHNlbGVjdGVkPnt7J0Zsb29yJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZmxvb3Igb2YgZmxvb3JzUGVyU3BhY2VcIiBbbmdWYWx1ZV09XCJmbG9vclwiPnt7IGZsb29yLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZmlsbCBzZWxlY3QtbWVudSB6b25lXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFpvbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uWm9uZUNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIiBzZWxlY3RlZD57eydab25lJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB6b25lc1BlckZsb29yXCIgW25nVmFsdWVdPVwiem9uZVwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInpvbmUuY29kZV9yZWZcIj57e3pvbmUuY29kZV9yZWZ9fV88L3NwYW4+e3t6b25lLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZmlsbCBzZWxlY3QtbWVudVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDaGlsZFpvbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hpbGRyZW5ab25lcyAmJiBjaGlsZHJlblpvbmVzLmxlbmd0aD4wXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGlsZFpvbmVDbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCIgc2VsZWN0ZWQgZGlzYWJsZWQ+e3snWm9uZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHpvbmUgb2YgY2hpbGRyZW5ab25lc1wiIFtuZ1ZhbHVlXT1cInpvbmVcIj57eyB6b25lLm5hbWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZmxleC1maWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBpMThuPnt7J0Zhdm9yaXRlcycgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXJfY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0nYnRuLWljb24nIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRMb2NhdGlvbiB8fCAhc2VsZWN0ZWRNb2RlbDNkIHx8ICFjYW5HbygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG8oKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJnb1RvKClcIiBjbGFzcz1cImJ0biByb3VuZGVkLXBpbGwgYnRuLTNkXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkTG9jYXRpb24gfHwgIXNlbGVjdGVkTW9kZWwzZCB8fCAhY2FuR28oKVwiPnt7JzNEIHZpc2l0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8aDQgc3R5bGU9XCJsaW5lLWhlaWdodDogMjlweDttYXJnaW46IDA7XCIgKm5nSWY9XCJzaG93TG9jYXRpb24oKVwiPlxyXG4gICAgICAgICAgICB7eyBzaG93TG9jYXRpb24oKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uYXY+Il19
|