ca-components 1.0.76 → 1.0.78
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/esm2022/lib/components/ca-chart/ca-chart.component.mjs +200 -120
- package/esm2022/lib/components/ca-chart/enums/chart-annotation.enum.mjs +11 -0
- package/esm2022/lib/components/ca-chart/enums/chart-plugin-ids.enum.mjs +2 -1
- package/esm2022/lib/components/ca-chart/enums/index.mjs +2 -1
- package/esm2022/lib/components/ca-chart/models/chart-config.model.mjs +1 -1
- package/esm2022/lib/components/ca-chart/models/chart-legend-config.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/chart-legend-property.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/index.mjs +3 -1
- package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +2 -2
- package/esm2022/lib/components/ca-chart-manager/ca-chart-manager.component.mjs +4 -4
- package/esm2022/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/components/ca-input/ca-input.component.mjs +1 -1
- package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +21 -22
- package/esm2022/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.mjs +6 -0
- package/esm2022/lib/components/ca-map/ca-map.component.mjs +137 -210
- package/esm2022/lib/components/ca-map/enums/google-map.enum.mjs +2 -1
- package/esm2022/lib/components/ca-map/enums/map-marker-string.enum.mjs +2 -1
- package/esm2022/lib/components/ca-map/models/map.model.mjs +1 -1
- package/esm2022/lib/components/ca-map/utils/constants/index.mjs +2 -1
- package/esm2022/lib/components/ca-map/utils/constants/map-marker-icons.constants.mjs +119 -0
- package/esm2022/lib/components/ca-map/utils/constants/map-options.constants.mjs +1 -2
- package/esm2022/lib/components/ca-map/utils/helpers/map-marker-icon.helper.mjs +50 -12
- package/esm2022/lib/components/ca-map/utils/services/index.mjs +2 -0
- package/esm2022/lib/components/ca-map/utils/services/map-marker-icon.service.mjs +137 -0
- package/esm2022/lib/components/ca-map-dropdown/ca-map-dropdown.component.mjs +25 -11
- package/esm2022/lib/components/ca-progress-bar/ca-progress-bar.component.mjs +15 -15
- package/esm2022/lib/constants/map.constant.mjs +131 -131
- package/esm2022/lib/pipes/index.mjs +19 -0
- package/esm2022/lib/pipes/unit-position.pipe.mjs +24 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ca-components.mjs +993 -653
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/components/ca-chart/ca-chart.component.d.ts +9 -4
- package/lib/components/ca-chart/enums/chart-annotation.enum.d.ts +10 -0
- package/lib/components/ca-chart/enums/chart-plugin-ids.enum.d.ts +2 -1
- package/lib/components/ca-chart/enums/index.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-config.model.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-legend-config.model.d.ts +6 -0
- package/lib/components/ca-chart/models/chart-legend-property.model.d.ts +7 -0
- package/lib/components/ca-chart/models/index.d.ts +2 -0
- package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
- package/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.d.ts +4 -0
- package/lib/components/ca-map/ca-map.component.d.ts +22 -25
- package/lib/components/ca-map/enums/google-map.enum.d.ts +2 -1
- package/lib/components/ca-map/enums/map-marker-string.enum.d.ts +2 -1
- package/lib/components/ca-map/models/map.model.d.ts +8 -3
- package/lib/components/ca-map/utils/constants/index.d.ts +1 -0
- package/lib/components/ca-map/utils/constants/map-marker-icons.constants.d.ts +6 -0
- package/lib/components/ca-map/utils/helpers/map-marker-icon.helper.d.ts +2 -0
- package/lib/components/ca-map/utils/services/index.d.ts +1 -0
- package/lib/components/ca-map/utils/services/map-marker-icon.service.d.ts +23 -0
- package/lib/components/ca-map-dropdown/ca-map-dropdown.component.d.ts +5 -3
- package/lib/components/ca-progress-bar/ca-progress-bar.component.d.ts +3 -1
- package/lib/pipes/index.d.ts +18 -0
- package/lib/pipes/unit-position.pipe.d.ts +7 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
// Helpers
|
|
4
|
+
import { MapMarkerIconHelper } from '../helpers';
|
|
5
|
+
// Constants
|
|
6
|
+
import { MapMarkerIconsConstants } from '../constants';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class MapMarkerIconService {
|
|
9
|
+
constructor(rendererFactory) {
|
|
10
|
+
this.clusterMarkerIds = new BehaviorSubject([]);
|
|
11
|
+
this.clusterMarkerIds$ = this.clusterMarkerIds.asObservable();
|
|
12
|
+
this.routingMarkerIds = new BehaviorSubject([]);
|
|
13
|
+
this.routingMarkerIds$ = this.routingMarkerIds.asObservable();
|
|
14
|
+
this.markerElements = new BehaviorSubject([]);
|
|
15
|
+
this.clusterElements = new BehaviorSubject([]);
|
|
16
|
+
this.routingElements = new BehaviorSubject([]);
|
|
17
|
+
this.renderer = rendererFactory.createRenderer(null, null);
|
|
18
|
+
}
|
|
19
|
+
getMarkerIcon(markerId, labelName, isClosed, isFavorite, isAlwaysSelected) {
|
|
20
|
+
const markerElements = this.markerElements.getValue();
|
|
21
|
+
const previousMarkerIcon = markerElements.find((icon) => icon.id === 'marker-' + markerId);
|
|
22
|
+
if (previousMarkerIcon)
|
|
23
|
+
return previousMarkerIcon;
|
|
24
|
+
else {
|
|
25
|
+
const markerElement = this.renderer.createElement('div');
|
|
26
|
+
this.renderer.setAttribute(markerElement, 'id', 'marker-' + markerId);
|
|
27
|
+
this.renderer.addClass(markerElement, 'marker-icon');
|
|
28
|
+
const markerSvg = isClosed
|
|
29
|
+
? MapMarkerIconsConstants.closedMarker
|
|
30
|
+
: isFavorite
|
|
31
|
+
? MapMarkerIconsConstants.favoriteMarker
|
|
32
|
+
: MapMarkerIconsConstants.defaultMarker;
|
|
33
|
+
this.renderer.setProperty(markerElement, 'innerHTML', markerSvg);
|
|
34
|
+
if (labelName) {
|
|
35
|
+
const markerLabelElement = this.renderer.createElement('div');
|
|
36
|
+
this.renderer.addClass(markerLabelElement, 'marker-label');
|
|
37
|
+
this.renderer.setProperty(markerLabelElement, 'innerHTML', labelName.toUpperCase());
|
|
38
|
+
this.renderer.appendChild(markerElement, markerLabelElement);
|
|
39
|
+
}
|
|
40
|
+
if (isAlwaysSelected)
|
|
41
|
+
this.renderer.addClass(markerElement, 'selected-permanently');
|
|
42
|
+
markerElements.push(markerElement);
|
|
43
|
+
this.markerElements.next(markerElements);
|
|
44
|
+
return markerElement;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
getClusterMarkerIcon(markerData) {
|
|
48
|
+
const clusterElements = this.clusterElements.getValue();
|
|
49
|
+
const clusterId = this.createClusterId(markerData);
|
|
50
|
+
const previousClusterIcon = clusterElements.find((icon) => icon.id === 'cluster-' + clusterId);
|
|
51
|
+
if (previousClusterIcon)
|
|
52
|
+
return previousClusterIcon;
|
|
53
|
+
else {
|
|
54
|
+
const markerElement = this.renderer.createElement('div');
|
|
55
|
+
this.renderer.setAttribute(markerElement, 'id', 'cluster-' + clusterId);
|
|
56
|
+
this.renderer.addClass(markerElement, 'cluster-icon');
|
|
57
|
+
const markerSvg = MapMarkerIconHelper.getClusterMarker(markerData.data.count, false);
|
|
58
|
+
this.renderer.setProperty(markerElement, 'innerHTML', markerSvg);
|
|
59
|
+
clusterElements.push(markerElement);
|
|
60
|
+
this.clusterElements.next(clusterElements);
|
|
61
|
+
return markerElement;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
getRoutingMarkerIcon(markerData, stopNumber, stopType, isStopChecked, isLightMode, labelName) {
|
|
65
|
+
const routingElements = this.routingElements.getValue();
|
|
66
|
+
const routingId = this.createRoutingId(markerData);
|
|
67
|
+
const previousClusterIcon = routingElements.find((icon) => icon.id === 'routingMarker-' + routingId);
|
|
68
|
+
if (previousClusterIcon)
|
|
69
|
+
return previousClusterIcon;
|
|
70
|
+
else {
|
|
71
|
+
const markerElement = this.renderer.createElement('div');
|
|
72
|
+
this.renderer.setAttribute(markerElement, 'id', 'routingMarker-' + routingId);
|
|
73
|
+
this.renderer.addClass(markerElement, 'routing-icon');
|
|
74
|
+
const markerSvg = MapMarkerIconHelper.getRoutingMarkerIcon(stopNumber, stopType, isStopChecked, isLightMode);
|
|
75
|
+
this.renderer.setProperty(markerElement, 'innerHTML', markerSvg);
|
|
76
|
+
if (labelName) {
|
|
77
|
+
const markerLabelElement = this.renderer.createElement('div');
|
|
78
|
+
this.renderer.addClass(markerLabelElement, 'marker-label');
|
|
79
|
+
this.renderer.setProperty(markerLabelElement, 'innerHTML', labelName.toUpperCase());
|
|
80
|
+
this.renderer.appendChild(markerElement, markerLabelElement);
|
|
81
|
+
}
|
|
82
|
+
routingElements.push(markerElement);
|
|
83
|
+
this.routingElements.next(routingElements);
|
|
84
|
+
return markerElement;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
createClusterId(clusterData) {
|
|
88
|
+
const clusterMarkers = this.clusterMarkerIds.getValue();
|
|
89
|
+
const clusterId = clusterMarkers.find((item) => clusterData.position.lat === item.position.lat &&
|
|
90
|
+
clusterData.position.lng === item.position.lng)?.id;
|
|
91
|
+
if (clusterId)
|
|
92
|
+
return clusterId;
|
|
93
|
+
else {
|
|
94
|
+
const newId = clusterMarkers.length + 1;
|
|
95
|
+
const newData = {
|
|
96
|
+
...clusterData,
|
|
97
|
+
id: newId,
|
|
98
|
+
};
|
|
99
|
+
clusterMarkers.push(newData);
|
|
100
|
+
this.clusterMarkerIds.next(clusterMarkers);
|
|
101
|
+
return newId;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
createRoutingId(markerData) {
|
|
105
|
+
const routingMarkers = this.routingMarkerIds.getValue();
|
|
106
|
+
const routingId = routingMarkers.find((item) => markerData.position.lat === item.position.lat &&
|
|
107
|
+
markerData.position.lng === item.position.lng)?.id;
|
|
108
|
+
if (routingId)
|
|
109
|
+
return routingId;
|
|
110
|
+
else {
|
|
111
|
+
const newId = routingMarkers.length + 1;
|
|
112
|
+
const newData = {
|
|
113
|
+
...markerData,
|
|
114
|
+
id: newId,
|
|
115
|
+
};
|
|
116
|
+
routingMarkers.push(newData);
|
|
117
|
+
this.routingMarkerIds.next(routingMarkers);
|
|
118
|
+
return newId;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
resetMarkersData() {
|
|
122
|
+
this.clusterMarkerIds.next([]);
|
|
123
|
+
this.routingMarkerIds.next([]);
|
|
124
|
+
this.markerElements.next([]);
|
|
125
|
+
this.clusterElements.next([]);
|
|
126
|
+
this.routingElements.next([]);
|
|
127
|
+
}
|
|
128
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapMarkerIconService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
129
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapMarkerIconService, providedIn: 'root' }); }
|
|
130
|
+
}
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapMarkerIconService, decorators: [{
|
|
132
|
+
type: Injectable,
|
|
133
|
+
args: [{
|
|
134
|
+
providedIn: 'root',
|
|
135
|
+
}]
|
|
136
|
+
}], ctorParameters: () => [{ type: i0.RendererFactory2 }] });
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLW1hcmtlci1pY29uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jYS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9jYS1tYXAvdXRpbHMvc2VydmljZXMvbWFwLW1hcmtlci1pY29uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUVuRCxVQUFVO0FBQ1YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELFlBQVk7QUFDWixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBUXZELE1BQU0sT0FBTyxvQkFBb0I7SUFZL0IsWUFBWSxlQUFpQztRQVZyQyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMvQixxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFnQixFQUFFLENBQUMsQ0FBQztRQUN4RCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFnQixFQUFFLENBQUMsQ0FBQztRQUN6RCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFnQixFQUFFLENBQUMsQ0FBQztRQUcvRCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxhQUFhLENBQ2xCLFFB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QUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7K0dBMU1VLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vLyBIZWxwZXJzXG5pbXBvcnQgeyBNYXBNYXJrZXJJY29uSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHsgTWFwTWFya2VySWNvbnNDb25zdGFudHMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG4vLyBNb2RlbHNcbmltcG9ydCB7IElNYXBNYXJrZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21hcC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNYXBNYXJrZXJJY29uU2VydmljZSB7XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHJpdmF0ZSBjbHVzdGVyTWFya2VySWRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJTWFwTWFya2Vyc1tdPihbXSk7XG4gIHB1YmxpYyBjbHVzdGVyTWFya2VySWRzJDogT2JzZXJ2YWJsZTxJTWFwTWFya2Vyc1tdPiA9XG4gICAgdGhpcy5jbHVzdGVyTWFya2VySWRzLmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIHJvdXRpbmdNYXJrZXJJZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElNYXBNYXJrZXJzW10+KFtdKTtcbiAgcHVibGljIHJvdXRpbmdNYXJrZXJJZHMkOiBPYnNlcnZhYmxlPElNYXBNYXJrZXJzW10+ID1cbiAgICB0aGlzLnJvdXRpbmdNYXJrZXJJZHMuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgbWFya2VyRWxlbWVudHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhUTUxFbGVtZW50W10+KFtdKTtcbiAgcHJpdmF0ZSBjbHVzdGVyRWxlbWVudHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhUTUxFbGVtZW50W10+KFtdKTtcbiAgcHJpdmF0ZSByb3V0aW5nRWxlbWVudHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhUTUxFbGVtZW50W10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcihyZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTIpIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGdldE1hcmtlckljb24oXG4gICAgbWFya2VySWQ6IG51bWJlcixcbiAgICBsYWJlbE5hbWU/OiBzdHJpbmcsXG4gICAgaXNDbG9zZWQ/OiBib29sZWFuLFxuICAgIGlzRmF2b3JpdGU/OiBib29sZWFuLFxuICAgIGlzQWx3YXlzU2VsZWN0ZWQ/OiBib29sZWFuXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBtYXJrZXJFbGVtZW50cyA9IHRoaXMubWFya2VyRWxlbWVudHMuZ2V0VmFsdWUoKTtcblxuICAgIGNvbnN0IHByZXZpb3VzTWFya2VySWNvbiA9IG1hcmtlckVsZW1lbnRzLmZpbmQoXG4gICAgICAoaWNvbikgPT4gaWNvbi5pZCA9PT0gJ21hcmtlci0nICsgbWFya2VySWRcbiAgICApO1xuXG4gICAgaWYgKHByZXZpb3VzTWFya2VySWNvbikgcmV0dXJuIHByZXZpb3VzTWFya2VySWNvbjtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG1hcmtlckVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobWFya2VyRWxlbWVudCwgJ2lkJywgJ21hcmtlci0nICsgbWFya2VySWQpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhtYXJrZXJFbGVtZW50LCAnbWFya2VyLWljb24nKTtcblxuICAgICAgY29uc3QgbWFya2VyU3ZnID0gaXNDbG9zZWRcbiAgICAgICAgPyBNYXBNYXJrZXJJY29uc0NvbnN0YW50cy5jbG9zZWRNYXJrZXJcbiAgICAgICAgOiBpc0Zhdm9yaXRlXG4gICAgICAgID8gTWFwTWFya2VySWNvbnNDb25zdGFudHMuZmF2b3JpdGVNYXJrZXJcbiAgICAgICAgOiBNYXBNYXJrZXJJY29uc0NvbnN0YW50cy5kZWZhdWx0TWFya2VyO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KG1hcmtlckVsZW1lbnQsICdpbm5lckhUTUwnLCBtYXJrZXJTdmcpO1xuXG4gICAgICBpZiAobGFiZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlckxhYmVsRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobWFya2VyTGFiZWxFbGVtZW50LCAnbWFya2VyLWxhYmVsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgICAgbWFya2VyTGFiZWxFbGVtZW50LFxuICAgICAgICAgICdpbm5lckhUTUwnLFxuICAgICAgICAgIGxhYmVsTmFtZS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobWFya2VyRWxlbWVudCwgbWFya2VyTGFiZWxFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQWx3YXlzU2VsZWN0ZWQpXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobWFya2VyRWxlbWVudCwgJ3NlbGVjdGVkLXBlcm1hbmVudGx5Jyk7XG5cbiAgICAgIG1hcmtlckVsZW1lbnRzLnB1c2gobWFya2VyRWxlbWVudCk7XG5cbiAgICAgIHRoaXMubWFya2VyRWxlbWVudHMubmV4dChtYXJrZXJFbGVtZW50cyk7XG5cbiAgICAgIHJldHVybiBtYXJrZXJFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDbHVzdGVyTWFya2VySWNvbihtYXJrZXJEYXRhOiBJTWFwTWFya2Vycyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBjbHVzdGVyRWxlbWVudHMgPSB0aGlzLmNsdXN0ZXJFbGVtZW50cy5nZXRWYWx1ZSgpO1xuXG4gICAgY29uc3QgY2x1c3RlcklkID0gdGhpcy5jcmVhdGVDbHVzdGVySWQobWFya2VyRGF0YSk7XG5cbiAgICBjb25zdCBwcmV2aW91c0NsdXN0ZXJJY29uID0gY2x1c3RlckVsZW1lbnRzLmZpbmQoXG4gICAgICAoaWNvbikgPT4gaWNvbi5pZCA9PT0gJ2NsdXN0ZXItJyArIGNsdXN0ZXJJZFxuICAgICk7XG5cbiAgICBpZiAocHJldmlvdXNDbHVzdGVySWNvbikgcmV0dXJuIHByZXZpb3VzQ2x1c3Rlckljb247XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBtYXJrZXJFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1hcmtlckVsZW1lbnQsICdpZCcsICdjbHVzdGVyLScgKyBjbHVzdGVySWQpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhtYXJrZXJFbGVtZW50LCAnY2x1c3Rlci1pY29uJyk7XG5cbiAgICAgIGNvbnN0IG1hcmtlclN2ZyA9IE1hcE1hcmtlckljb25IZWxwZXIuZ2V0Q2x1c3Rlck1hcmtlcihcbiAgICAgICAgbWFya2VyRGF0YS5kYXRhLmNvdW50LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkobWFya2VyRWxlbWVudCwgJ2lubmVySFRNTCcsIG1hcmtlclN2Zyk7XG4gICAgICBjbHVzdGVyRWxlbWVudHMucHVzaChtYXJrZXJFbGVtZW50KTtcblxuICAgICAgdGhpcy5jbHVzdGVyRWxlbWVudHMubmV4dChjbHVzdGVyRWxlbWVudHMpO1xuXG4gICAgICByZXR1cm4gbWFya2VyRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um91dGluZ01hcmtlckljb24oXG4gICAgbWFya2VyRGF0YTogSU1hcE1hcmtlcnMsXG4gICAgc3RvcE51bWJlcjogbnVtYmVyLFxuICAgIHN0b3BUeXBlOiBzdHJpbmcsXG4gICAgaXNTdG9wQ2hlY2tlZD86IGJvb2xlYW4sXG4gICAgaXNMaWdodE1vZGU/OiBib29sZWFuLFxuICAgIGxhYmVsTmFtZT86IHN0cmluZ1xuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgcm91dGluZ0VsZW1lbnRzID0gdGhpcy5yb3V0aW5nRWxlbWVudHMuZ2V0VmFsdWUoKTtcblxuICAgIGNvbnN0IHJvdXRpbmdJZCA9IHRoaXMuY3JlYXRlUm91dGluZ0lkKG1hcmtlckRhdGEpO1xuXG4gICAgY29uc3QgcHJldmlvdXNDbHVzdGVySWNvbiA9IHJvdXRpbmdFbGVtZW50cy5maW5kKFxuICAgICAgKGljb24pID0+IGljb24uaWQgPT09ICdyb3V0aW5nTWFya2VyLScgKyByb3V0aW5nSWRcbiAgICApO1xuXG4gICAgaWYgKHByZXZpb3VzQ2x1c3Rlckljb24pIHJldHVybiBwcmV2aW91c0NsdXN0ZXJJY29uO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgbWFya2VyRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgbWFya2VyRWxlbWVudCxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ3JvdXRpbmdNYXJrZXItJyArIHJvdXRpbmdJZFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobWFya2VyRWxlbWVudCwgJ3JvdXRpbmctaWNvbicpO1xuXG4gICAgICBjb25zdCBtYXJrZXJTdmcgPSBNYXBNYXJrZXJJY29uSGVscGVyLmdldFJvdXRpbmdNYXJrZXJJY29uKFxuICAgICAgICBzdG9wTnVtYmVyLFxuICAgICAgICBzdG9wVHlwZSxcbiAgICAgICAgaXNTdG9wQ2hlY2tlZCxcbiAgICAgICAgaXNMaWdodE1vZGVcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KG1hcmtlckVsZW1lbnQsICdpbm5lckhUTUwnLCBtYXJrZXJTdmcpO1xuXG4gICAgICBpZiAobGFiZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlckxhYmVsRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobWFya2VyTGFiZWxFbGVtZW50LCAnbWFya2VyLWxhYmVsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgICAgbWFya2VyTGFiZWxFbGVtZW50LFxuICAgICAgICAgICdpbm5lckhUTUwnLFxuICAgICAgICAgIGxhYmVsTmFtZS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobWFya2VyRWxlbWVudCwgbWFya2VyTGFiZWxFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcm91dGluZ0VsZW1lbnRzLnB1c2gobWFya2VyRWxlbWVudCk7XG5cbiAgICAgIHRoaXMucm91dGluZ0VsZW1lbnRzLm5leHQocm91dGluZ0VsZW1lbnRzKTtcblxuICAgICAgcmV0dXJuIG1hcmtlckVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNsdXN0ZXJJZChjbHVzdGVyRGF0YTogSU1hcE1hcmtlcnMpOiBudW1iZXIge1xuICAgIGNvbnN0IGNsdXN0ZXJNYXJrZXJzID0gdGhpcy5jbHVzdGVyTWFya2VySWRzLmdldFZhbHVlKCk7XG5cbiAgICBjb25zdCBjbHVzdGVySWQgPSBjbHVzdGVyTWFya2Vycy5maW5kKFxuICAgICAgKGl0ZW0pID0+XG4gICAgICAgIGNsdXN0ZXJEYXRhLnBvc2l0aW9uLmxhdCA9PT0gaXRlbS5wb3NpdGlvbi5sYXQgJiZcbiAgICAgICAgY2x1c3RlckRhdGEucG9zaXRpb24ubG5nID09PSBpdGVtLnBvc2l0aW9uLmxuZ1xuICAgICk/LmlkO1xuXG4gICAgaWYgKGNsdXN0ZXJJZCkgcmV0dXJuIGNsdXN0ZXJJZDtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld0lkID0gY2x1c3Rlck1hcmtlcnMubGVuZ3RoICsgMTtcblxuICAgICAgY29uc3QgbmV3RGF0YSA9IHtcbiAgICAgICAgLi4uY2x1c3RlckRhdGEsXG4gICAgICAgIGlkOiBuZXdJZCxcbiAgICAgIH07XG5cbiAgICAgIGNsdXN0ZXJNYXJrZXJzLnB1c2gobmV3RGF0YSk7XG4gICAgICB0aGlzLmNsdXN0ZXJNYXJrZXJJZHMubmV4dChjbHVzdGVyTWFya2Vycyk7XG5cbiAgICAgIHJldHVybiBuZXdJZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUm91dGluZ0lkKG1hcmtlckRhdGE6IElNYXBNYXJrZXJzKTogbnVtYmVyIHtcbiAgICBjb25zdCByb3V0aW5nTWFya2VycyA9IHRoaXMucm91dGluZ01hcmtlcklkcy5nZXRWYWx1ZSgpO1xuXG4gICAgY29uc3Qgcm91dGluZ0lkID0gcm91dGluZ01hcmtlcnMuZmluZChcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICBtYXJrZXJEYXRhLnBvc2l0aW9uLmxhdCA9PT0gaXRlbS5wb3NpdGlvbi5sYXQgJiZcbiAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgKT8uaWQ7XG5cbiAgICBpZiAocm91dGluZ0lkKSByZXR1cm4gcm91dGluZ0lkO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgbmV3SWQgPSByb3V0aW5nTWFya2Vycy5sZW5ndGggKyAxO1xuXG4gICAgICBjb25zdCBuZXdEYXRhID0ge1xuICAgICAgICAuLi5tYXJrZXJEYXRhLFxuICAgICAgICBpZDogbmV3SWQsXG4gICAgICB9O1xuXG4gICAgICByb3V0aW5nTWFya2Vycy5wdXNoKG5ld0RhdGEpO1xuICAgICAgdGhpcy5yb3V0aW5nTWFya2VySWRzLm5leHQocm91dGluZ01hcmtlcnMpO1xuXG4gICAgICByZXR1cm4gbmV3SWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0TWFya2Vyc0RhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5jbHVzdGVyTWFya2VySWRzLm5leHQoW10pO1xuICAgIHRoaXMucm91dGluZ01hcmtlcklkcy5uZXh0KFtdKTtcbiAgICB0aGlzLm1hcmtlckVsZW1lbnRzLm5leHQoW10pO1xuICAgIHRoaXMuY2x1c3RlckVsZW1lbnRzLm5leHQoW10pO1xuICAgIHRoaXMucm91dGluZ0VsZW1lbnRzLm5leHQoW10pO1xuICB9XG59XG4iXX0=
|