@igo2/context 18.0.1-next.2 → 18.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/esm2022/igo2-context.mjs +5 -0
  2. package/esm2022/lib/context-import-export/context-import-export/context-import-export.component.mjs +156 -0
  3. package/esm2022/lib/context-import-export/context-import-export.module.mjs +24 -0
  4. package/esm2022/lib/context-import-export/index.mjs +3 -0
  5. package/esm2022/lib/context-import-export/shared/context-export.errors.mjs +15 -0
  6. package/esm2022/lib/context-import-export/shared/context-export.interface.mjs +2 -0
  7. package/esm2022/lib/context-import-export/shared/context-export.service.mjs +38 -0
  8. package/esm2022/lib/context-import-export/shared/context-export.utils.mjs +15 -0
  9. package/esm2022/lib/context-import-export/shared/context-import.errors.mjs +33 -0
  10. package/esm2022/lib/context-import-export/shared/context-import.service.mjs +82 -0
  11. package/esm2022/lib/context-import-export/shared/context-import.utils.mjs +148 -0
  12. package/esm2022/lib/context-import-export/shared/index.mjs +8 -0
  13. package/esm2022/lib/context-manager/context-edit/context-edit-binding.directive.mjs +56 -0
  14. package/esm2022/lib/context-manager/context-edit/context-edit.component.mjs +35 -0
  15. package/esm2022/lib/context-manager/context-edit/index.mjs +3 -0
  16. package/esm2022/lib/context-manager/context-form/context-form.component.mjs +117 -0
  17. package/esm2022/lib/context-manager/context-form/index.mjs +2 -0
  18. package/esm2022/lib/context-manager/context-item/context-item.component.mjs +96 -0
  19. package/esm2022/lib/context-manager/context-item/index.mjs +2 -0
  20. package/esm2022/lib/context-manager/context-list/context-list-binding.directive.mjs +259 -0
  21. package/esm2022/lib/context-manager/context-list/context-list.component.mjs +424 -0
  22. package/esm2022/lib/context-manager/context-list/context-list.enum.mjs +7 -0
  23. package/esm2022/lib/context-manager/context-list/index.mjs +3 -0
  24. package/esm2022/lib/context-manager/context-manager.directive.mjs +19 -0
  25. package/esm2022/lib/context-manager/context-manager.module.mjs +77 -0
  26. package/esm2022/lib/context-manager/context-permissions/context-permissions-binding.directive.mjs +109 -0
  27. package/esm2022/lib/context-manager/context-permissions/context-permissions.component.mjs +170 -0
  28. package/esm2022/lib/context-manager/context-permissions/index.mjs +3 -0
  29. package/esm2022/lib/context-manager/index.mjs +8 -0
  30. package/esm2022/lib/context-manager/shared/context.enum.mjs +13 -0
  31. package/esm2022/lib/context-manager/shared/context.interface.mjs +2 -0
  32. package/esm2022/lib/context-manager/shared/context.service.mjs +616 -0
  33. package/esm2022/lib/context-manager/shared/index.mjs +6 -0
  34. package/esm2022/lib/context-manager/shared/layer-context.directive.mjs +176 -0
  35. package/esm2022/lib/context-manager/shared/map-context.directive.mjs +68 -0
  36. package/esm2022/lib/context-map-button/bookmark-button/bookmark-button.component.mjs +69 -0
  37. package/esm2022/lib/context-map-button/bookmark-button/bookmark-dialog.component.mjs +37 -0
  38. package/esm2022/lib/context-map-button/bookmark-button/index.mjs +3 -0
  39. package/esm2022/lib/context-map-button/context-map-button.directive.mjs +10 -0
  40. package/esm2022/lib/context-map-button/context-map-button.module.mjs +48 -0
  41. package/esm2022/lib/context-map-button/index.mjs +5 -0
  42. package/esm2022/lib/context-map-button/poi-button/index.mjs +4 -0
  43. package/esm2022/lib/context-map-button/poi-button/poi-button.component.mjs +160 -0
  44. package/esm2022/lib/context-map-button/poi-button/poi-dialog.component.mjs +37 -0
  45. package/esm2022/lib/context-map-button/poi-button/shared/index.mjs +3 -0
  46. package/esm2022/lib/context-map-button/poi-button/shared/poi.interface.mjs +2 -0
  47. package/esm2022/lib/context-map-button/poi-button/shared/poi.service.mjs +38 -0
  48. package/esm2022/lib/context-map-button/user-button/index.mjs +3 -0
  49. package/esm2022/lib/context-map-button/user-button/user-button.animation.mjs +17 -0
  50. package/esm2022/lib/context-map-button/user-button/user-button.component.mjs +82 -0
  51. package/esm2022/lib/context-map-button/user-button/user-dialog.component.mjs +43 -0
  52. package/esm2022/lib/context.module.mjs +42 -0
  53. package/esm2022/lib/environment/environment.interface.mjs +2 -0
  54. package/esm2022/lib/environment/index.mjs +2 -0
  55. package/esm2022/lib/share-map/index.mjs +6 -0
  56. package/esm2022/lib/share-map/share-map/share-map-api.component.mjs +111 -0
  57. package/esm2022/lib/share-map/share-map/share-map-url.component.mjs +78 -0
  58. package/esm2022/lib/share-map/share-map/share-map.component.mjs +35 -0
  59. package/esm2022/lib/share-map/share-map.module.mjs +31 -0
  60. package/esm2022/lib/share-map/shared/index.mjs +2 -0
  61. package/esm2022/lib/share-map/shared/share-map.service.mjs +223 -0
  62. package/esm2022/lib/sidenav/index.mjs +2 -0
  63. package/esm2022/lib/sidenav/sidenav.component.mjs +122 -0
  64. package/esm2022/lib/sidenav/sidenav.module.mjs +24 -0
  65. package/esm2022/public_api.mjs +16 -0
  66. package/fesm2022/igo2-context.mjs +118 -118
  67. package/fesm2022/igo2-context.mjs.map +1 -1
  68. package/package.json +14 -12
@@ -0,0 +1,223 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import { RouteService } from '@igo2/core/route';
3
+ import { isLayerItem } from '@igo2/geo';
4
+ import { ContextService } from '../../context-manager/shared/context.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../context-manager/shared/context.service";
7
+ import * as i2 from "@igo2/core/route";
8
+ export class ShareMapService {
9
+ contextService;
10
+ route;
11
+ language = '';
12
+ constructor(contextService, route) {
13
+ this.contextService = contextService;
14
+ this.route = route;
15
+ this.route.queryParams.subscribe((params) => {
16
+ if (params['lang']) {
17
+ this.language = params['lang'];
18
+ }
19
+ });
20
+ }
21
+ getUrlWithApi(formValues) {
22
+ return this.language
23
+ ? `${location.origin + location.pathname}?context=${formValues.uri}&lang=${this.language}`
24
+ : `${location.origin + location.pathname}?context=${formValues.uri}`;
25
+ }
26
+ createContextShared(map, formValues) {
27
+ const context = this.contextService.getContextFromMap(map);
28
+ context.scope = 'public';
29
+ context.title = formValues.title;
30
+ context.uri = formValues.uri;
31
+ return this.contextService.create(context);
32
+ }
33
+ updateContextShared(map, formValues, id) {
34
+ const context = this.contextService.getContextFromMap(map);
35
+ return this.contextService.update(id, {
36
+ title: formValues.title,
37
+ map: context.map
38
+ });
39
+ }
40
+ getUrlWithoutApi(map, publicShareOption) {
41
+ if (!this.route ||
42
+ !this.route.options.visibleOnLayersKey ||
43
+ !this.route.options.visibleOffLayersKey ||
44
+ !map.viewController.getZoom()) {
45
+ return;
46
+ }
47
+ const llc = publicShareOption.layerlistControls.querystring;
48
+ let visibleKey = this.route.options.visibleOnLayersKey;
49
+ let invisibleKey = this.route.options.visibleOffLayersKey;
50
+ const layers = map.layerController.all.filter((layer) => isLayerItem(layer));
51
+ const visibleLayers = layers.filter((lay) => lay.visible && !lay.isIgoInternalLayer);
52
+ const invisibleLayers = layers.filter((lay) => !lay.visible && !lay.isIgoInternalLayer);
53
+ if (visibleLayers.length === 0) {
54
+ visibleKey = '';
55
+ }
56
+ if (invisibleLayers.length === 0) {
57
+ invisibleKey = '';
58
+ }
59
+ let layersUrl = '';
60
+ let layersToLoop = [];
61
+ if (visibleLayers.length > invisibleLayers.length) {
62
+ layersUrl = `${visibleKey}=*&${invisibleKey}=`;
63
+ layersToLoop = invisibleLayers;
64
+ }
65
+ else {
66
+ layersUrl = `${invisibleKey}=*&${visibleKey}=`;
67
+ layersToLoop = visibleLayers;
68
+ }
69
+ for (const layer of layersToLoop) {
70
+ if (layer.id) {
71
+ layersUrl += layer.id + ',';
72
+ }
73
+ }
74
+ const contextLayersID = [];
75
+ const contextLayers = this.contextService.context$.value.layers;
76
+ for (const contextLayer of contextLayers) {
77
+ if (typeof contextLayer.id !== 'undefined' ||
78
+ typeof contextLayer.source !== 'undefined') {
79
+ contextLayersID.push(contextLayer.id || contextLayer.source.id);
80
+ }
81
+ }
82
+ const addedLayersQueryParamsWms = this.makeLayersByService(layers, contextLayersID, 'wms');
83
+ const addedLayersQueryParamsWmts = this.makeLayersByService(layers, contextLayersID, 'wmts');
84
+ const addedLayersQueryParamsArcgisRest = this.makeLayersByService(layers, contextLayersID, 'arcgisrest');
85
+ const addedLayersQueryParamsImageArcgisRest = this.makeLayersByService(layers, contextLayersID, 'imagearcgisrest');
86
+ const addedLayersQueryParamsTileArcgisRest = this.makeLayersByService(layers, contextLayersID, 'tilearcgisrest');
87
+ layersUrl = layersUrl.substr(0, layersUrl.length - 1);
88
+ const zoomKey = this.route.options.zoomKey;
89
+ const centerKey = this.route.options.centerKey;
90
+ const contextKey = this.route.options.contextKey;
91
+ const zoom = `${zoomKey}=${map.viewController.getZoom()}`;
92
+ const arrayCenter = map.viewController.getCenter('EPSG:4326') || [];
93
+ const long = arrayCenter[0].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
94
+ const lat = arrayCenter[1].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
95
+ const center = `${centerKey}=${long},${lat}`.replace(/.00000/g, '');
96
+ let context = '';
97
+ if (this.contextService.context$.value) {
98
+ context = `${contextKey}=${this.contextService.context$.value.uri}`;
99
+ }
100
+ let url = this.language
101
+ ? `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}&lang=${this.language}`
102
+ : `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}`;
103
+ for (let i = 0; i < 5; i++) {
104
+ url = url.replace(/&&/g, '&');
105
+ url = url.endsWith('&') ? url.slice(0, -1) : url;
106
+ }
107
+ url = url.endsWith('&') ? url.slice(0, -1) : url;
108
+ url = url.replace('?&wm', '&wm');
109
+ url = url.replace('?&', '?');
110
+ return url;
111
+ }
112
+ makeLayersByService(layers, contextLayersID, typeService) {
113
+ const addedLayersByService = [];
114
+ for (const layer of layers.filter((l) => l.dataSource.options?.type === typeService)) {
115
+ if (contextLayersID.indexOf(layer.id) === -1) {
116
+ let linkUrl = encodeURIComponent(layer.dataSource.options.url);
117
+ let addedLayer = '';
118
+ let layerVersion;
119
+ switch (layer.dataSource.options.type.toLowerCase()) {
120
+ case 'wms': {
121
+ const datasourceOptions = layer.dataSource
122
+ .options;
123
+ addedLayer = encodeURIComponent(datasourceOptions.params.LAYERS);
124
+ layerVersion =
125
+ datasourceOptions.params.VERSION === '1.3.0'
126
+ ? layerVersion
127
+ : datasourceOptions.params.VERSION;
128
+ break;
129
+ }
130
+ case 'wmts':
131
+ case 'arcgisrest':
132
+ case 'imagearcgisrest':
133
+ case 'tilearcgisrest':
134
+ addedLayer = encodeURIComponent(layer.dataSource.options.layer);
135
+ break;
136
+ }
137
+ const addedLayerPosition = `${addedLayer}:igoz${layer.zIndex}`;
138
+ let version = '';
139
+ if (layerVersion) {
140
+ const operator = layer.dataSource.options.url.indexOf('?') === -1
141
+ ? '?'
142
+ : '&';
143
+ version = encodeURIComponent(`${operator}VERSION=${layerVersion}`);
144
+ }
145
+ linkUrl = `${linkUrl}${version}`;
146
+ if (!addedLayersByService.find((definedUrl) => definedUrl.url === linkUrl)) {
147
+ addedLayersByService.push({
148
+ url: linkUrl,
149
+ layers: [addedLayerPosition]
150
+ });
151
+ }
152
+ else {
153
+ addedLayersByService.forEach((service) => {
154
+ if (service.url === linkUrl) {
155
+ service.layers.push(addedLayerPosition);
156
+ }
157
+ });
158
+ }
159
+ }
160
+ }
161
+ let addedLayersQueryParams = '';
162
+ if (addedLayersByService.length >= 1) {
163
+ let linkUrlKey;
164
+ let layersKey;
165
+ /*
166
+ const linkUrlKey = (typeService === 'wms') ? this.route.options.wmsUrlKey :
167
+ (typeService === 'wmts') ? this.route.options.wmtsUrlKey : '' ;
168
+ const layersKey = (typeService === 'wms') ? this.route.options.wmsLayersKey :
169
+ (typeService === 'wmts') ? this.route.options.wmtsLayersKey : '' ;
170
+ */
171
+ switch (typeService.toLowerCase()) {
172
+ case 'wms':
173
+ linkUrlKey = this.route.options.wmsUrlKey;
174
+ layersKey = this.route.options.wmsLayersKey;
175
+ break;
176
+ case 'wmts':
177
+ linkUrlKey = this.route.options.wmtsUrlKey;
178
+ layersKey = this.route.options.wmtsLayersKey;
179
+ break;
180
+ case 'arcgisrest':
181
+ linkUrlKey = this.route.options.arcgisUrlKey;
182
+ layersKey = this.route.options.arcgisLayersKey;
183
+ break;
184
+ case 'imagearcgisrest':
185
+ linkUrlKey = this.route.options.iarcgisUrlKey;
186
+ layersKey = this.route.options.iarcgisLayersKey;
187
+ break;
188
+ case 'tilearcgisrest':
189
+ linkUrlKey = this.route.options.tarcgisUrlKey;
190
+ layersKey = this.route.options.tarcgisLayersKey;
191
+ break;
192
+ default:
193
+ linkUrlKey = '';
194
+ layersKey = '';
195
+ }
196
+ let linkUrlQueryParams = '';
197
+ let layersQueryParams = '';
198
+ addedLayersByService.forEach((service) => {
199
+ linkUrlQueryParams += `${service.url},`;
200
+ layersQueryParams += `(${service.layers.join(',')}),`;
201
+ });
202
+ linkUrlQueryParams = linkUrlQueryParams.endsWith(',')
203
+ ? linkUrlQueryParams.slice(0, -1)
204
+ : linkUrlQueryParams;
205
+ layersQueryParams = layersQueryParams.endsWith(',')
206
+ ? layersQueryParams.slice(0, -1)
207
+ : layersQueryParams;
208
+ addedLayersQueryParams = `${linkUrlKey}=${linkUrlQueryParams}&${layersKey}=${layersQueryParams}`;
209
+ }
210
+ return addedLayersQueryParams;
211
+ }
212
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, deps: [{ token: i1.ContextService }, { token: i2.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
213
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, providedIn: 'root' });
214
+ }
215
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, decorators: [{
216
+ type: Injectable,
217
+ args: [{
218
+ providedIn: 'root'
219
+ }]
220
+ }], ctorParameters: () => [{ type: i1.ContextService }, { type: i2.RouteService, decorators: [{
221
+ type: Optional
222
+ }] }] });
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUtbWFwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvc2hhcmUtbWFwL3NoYXJlZC9zaGFyZS1tYXAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUF3QixXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7O0FBSzlFLE1BQU0sT0FBTyxlQUFlO0lBSWhCO0lBQ1k7SUFKZCxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBRXRCLFlBQ1UsY0FBOEIsRUFDbEIsS0FBbUI7UUFEL0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFFdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFVO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVE7WUFDbEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxZQUNwQyxVQUFVLENBQUMsR0FDYixTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFB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aUJBQ25COzswQkFNSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUm91dGVTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9yb3V0ZSc7XG5pbXBvcnQgeyBXTVNEYXRhU291cmNlT3B0aW9ucywgaXNMYXllckl0ZW0gfSBmcm9tICdAaWdvMi9nZW8nO1xuaW1wb3J0IHR5cGUgeyBJZ29NYXAsIExheWVyIH0gZnJvbSAnQGlnbzIvZ2VvJztcblxuaW1wb3J0IHsgRGV0YWlsZWRDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC1tYW5hZ2VyL3NoYXJlZC9jb250ZXh0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvbnRleHQtbWFuYWdlci9zaGFyZWQvY29udGV4dC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2hhcmVNYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsYW5ndWFnZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGU6IFJvdXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBpZiAocGFyYW1zWydsYW5nJ10pIHtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHBhcmFtc1snbGFuZyddO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VXJsV2l0aEFwaShmb3JtVmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VcbiAgICAgID8gYCR7bG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWV9P2NvbnRleHQ9JHtcbiAgICAgICAgICBmb3JtVmFsdWVzLnVyaVxuICAgICAgICB9Jmxhbmc9JHt0aGlzLmxhbmd1YWdlfWBcbiAgICAgIDogYCR7bG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWV9P2NvbnRleHQ9JHtmb3JtVmFsdWVzLnVyaX1gO1xuICB9XG5cbiAgY3JlYXRlQ29udGV4dFNoYXJlZChtYXA6IElnb01hcCwgZm9ybVZhbHVlcykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENvbnRleHRGcm9tTWFwKG1hcCk7XG4gICAgY29udGV4dC5zY29wZSA9ICdwdWJsaWMnO1xuICAgIGNvbnRleHQudGl0bGUgPSBmb3JtVmFsdWVzLnRpdGxlO1xuICAgIGNvbnRleHQudXJpID0gZm9ybVZhbHVlcy51cmk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpO1xuICB9XG5cbiAgdXBkYXRlQ29udGV4dFNoYXJlZChtYXA6IElnb01hcCwgZm9ybVZhbHVlcywgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENvbnRleHRGcm9tTWFwKG1hcCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UudXBkYXRlKGlkLCB7XG4gICAgICB0aXRsZTogZm9ybVZhbHVlcy50aXRsZSxcbiAgICAgIG1hcDogY29udGV4dC5tYXBcbiAgICB9IGFzIERldGFpbGVkQ29udGV4dCk7XG4gIH1cblxuICBnZXRVcmxXaXRob3V0QXBpKG1hcDogSWdvTWFwLCBwdWJsaWNTaGFyZU9wdGlvbikge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnJvdXRlIHx8XG4gICAgICAhdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPbkxheWVyc0tleSB8fFxuICAgICAgIXRoaXMucm91dGUub3B0aW9ucy52aXNpYmxlT2ZmTGF5ZXJzS2V5IHx8XG4gICAgICAhbWFwLnZpZXdDb250cm9sbGVyLmdldFpvb20oKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsbGMgPSBwdWJsaWNTaGFyZU9wdGlvbi5sYXllcmxpc3RDb250cm9scy5xdWVyeXN0cmluZztcblxuICAgIGxldCB2aXNpYmxlS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPbkxheWVyc0tleTtcbiAgICBsZXQgaW52aXNpYmxlS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPZmZMYXllcnNLZXk7XG4gICAgY29uc3QgbGF5ZXJzID0gbWFwLmxheWVyQ29udHJvbGxlci5hbGwuZmlsdGVyKChsYXllcikgPT5cbiAgICAgIGlzTGF5ZXJJdGVtKGxheWVyKVxuICAgICkgYXMgTGF5ZXJbXTtcblxuICAgIGNvbnN0IHZpc2libGVMYXllcnMgPSBsYXllcnMuZmlsdGVyKFxuICAgICAgKGxheSkgPT4gbGF5LnZpc2libGUgJiYgIWxheS5pc0lnb0ludGVybmFsTGF5ZXJcbiAgICApO1xuICAgIGNvbnN0IGludmlzaWJsZUxheWVycyA9IGxheWVycy5maWx0ZXIoXG4gICAgICAobGF5KSA9PiAhbGF5LnZpc2libGUgJiYgIWxheS5pc0lnb0ludGVybmFsTGF5ZXJcbiAgICApO1xuXG4gICAgaWYgKHZpc2libGVMYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB2aXNpYmxlS2V5ID0gJyc7XG4gICAgfVxuICAgIGlmIChpbnZpc2libGVMYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbnZpc2libGVLZXkgPSAnJztcbiAgICB9XG5cbiAgICBsZXQgbGF5ZXJzVXJsID0gJyc7XG4gICAgbGV0IGxheWVyc1RvTG9vcCA9IFtdO1xuICAgIGlmICh2aXNpYmxlTGF5ZXJzLmxlbmd0aCA+IGludmlzaWJsZUxheWVycy5sZW5ndGgpIHtcbiAgICAgIGxheWVyc1VybCA9IGAke3Zpc2libGVLZXl9PSomJHtpbnZpc2libGVLZXl9PWA7XG4gICAgICBsYXllcnNUb0xvb3AgPSBpbnZpc2libGVMYXllcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc1VybCA9IGAke2ludmlzaWJsZUtleX09KiYke3Zpc2libGVLZXl9PWA7XG4gICAgICBsYXllcnNUb0xvb3AgPSB2aXNpYmxlTGF5ZXJzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzVG9Mb29wKSB7XG4gICAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgbGF5ZXJzVXJsICs9IGxheWVyLmlkICsgJywnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZXh0TGF5ZXJzSUQgPSBbXTtcbiAgICBjb25zdCBjb250ZXh0TGF5ZXJzID0gdGhpcy5jb250ZXh0U2VydmljZS5jb250ZXh0JC52YWx1ZS5sYXllcnM7XG4gICAgZm9yIChjb25zdCBjb250ZXh0TGF5ZXIgb2YgY29udGV4dExheWVycykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgY29udGV4dExheWVyLmlkICE9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgKGNvbnRleHRMYXllciBhcyBhbnkpLnNvdXJjZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICkge1xuICAgICAgICBjb250ZXh0TGF5ZXJzSUQucHVzaChcbiAgICAgICAgICBjb250ZXh0TGF5ZXIuaWQgfHwgKGNvbnRleHRMYXllciBhcyBhbnkpLnNvdXJjZS5pZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXMgPSB0aGlzLm1ha2VMYXllcnNCeVNlcnZpY2UoXG4gICAgICBsYXllcnMsXG4gICAgICBjb250ZXh0TGF5ZXJzSUQsXG4gICAgICAnd21zJ1xuICAgICk7XG4gICAgY29uc3QgYWRkZWRMYXllcnNRdWVyeVBhcmFtc1dtdHMgPSB0aGlzLm1ha2VMYXllcnNCeVNlcnZpY2UoXG4gICAgICBsYXllcnMsXG4gICAgICBjb250ZXh0TGF5ZXJzSUQsXG4gICAgICAnd210cydcbiAgICApO1xuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNBcmNnaXNSZXN0ID0gdGhpcy5tYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgICAgbGF5ZXJzLFxuICAgICAgY29udGV4dExheWVyc0lELFxuICAgICAgJ2FyY2dpc3Jlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGRlZExheWVyc1F1ZXJ5UGFyYW1zSW1hZ2VBcmNnaXNSZXN0ID0gdGhpcy5tYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgICAgbGF5ZXJzLFxuICAgICAgY29udGV4dExheWVyc0lELFxuICAgICAgJ2ltYWdlYXJjZ2lzcmVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNUaWxlQXJjZ2lzUmVzdCA9IHRoaXMubWFrZUxheWVyc0J5U2VydmljZShcbiAgICAgIGxheWVycyxcbiAgICAgIGNvbnRleHRMYXllcnNJRCxcbiAgICAgICd0aWxlYXJjZ2lzcmVzdCdcbiAgICApO1xuXG4gICAgbGF5ZXJzVXJsID0gbGF5ZXJzVXJsLnN1YnN0cigwLCBsYXllcnNVcmwubGVuZ3RoIC0gMSk7XG5cbiAgICBjb25zdCB6b29tS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnpvb21LZXk7XG4gICAgY29uc3QgY2VudGVyS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLmNlbnRlcktleTtcbiAgICBjb25zdCBjb250ZXh0S2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLmNvbnRleHRLZXk7XG5cbiAgICBjb25zdCB6b29tID0gYCR7em9vbUtleX09JHttYXAudmlld0NvbnRyb2xsZXIuZ2V0Wm9vbSgpfWA7XG4gICAgY29uc3QgYXJyYXlDZW50ZXIgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKCdFUFNHOjQzMjYnKSB8fCBbXTtcbiAgICBjb25zdCBsb25nID0gYXJyYXlDZW50ZXJbMF0udG9GaXhlZCg1KS5yZXBsYWNlKC9cXC4oW14wXSspMCskLywgJy4kMScpO1xuICAgIGNvbnN0IGxhdCA9IGFycmF5Q2VudGVyWzFdLnRvRml4ZWQoNSkucmVwbGFjZSgvXFwuKFteMF0rKTArJC8sICcuJDEnKTtcbiAgICBjb25zdCBjZW50ZXIgPSBgJHtjZW50ZXJLZXl9PSR7bG9uZ30sJHtsYXR9YC5yZXBsYWNlKC8uMDAwMDAvZywgJycpO1xuICAgIGxldCBjb250ZXh0ID0gJyc7XG4gICAgaWYgKHRoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dCQudmFsdWUpIHtcbiAgICAgIGNvbnRleHQgPSBgJHtjb250ZXh0S2V5fT0ke3RoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dCQudmFsdWUudXJpfWA7XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IHRoaXMubGFuZ3VhZ2VcbiAgICAgID8gYCR7bG9jYXRpb24ub3JpZ2lufSR7bG9jYXRpb24ucGF0aG5hbWV9PyR7Y29udGV4dH0mJHt6b29tfSYke2NlbnRlcn0mJHtsYXllcnNVcmx9JiR7bGxjfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXN9JiR7bGxjfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXRzfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNBcmNnaXNSZXN0fSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNJbWFnZUFyY2dpc1Jlc3R9JiR7YWRkZWRMYXllcnNRdWVyeVBhcmFtc1RpbGVBcmNnaXNSZXN0fSZsYW5nPSR7dGhpcy5sYW5ndWFnZX1gXG4gICAgICA6IGAke2xvY2F0aW9uLm9yaWdpbn0ke2xvY2F0aW9uLnBhdGhuYW1lfT8ke2NvbnRleHR9JiR7em9vbX0mJHtjZW50ZXJ9JiR7bGF5ZXJzVXJsfSYke2xsY30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zV21zfSYke2xsY30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zV210c30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zQXJjZ2lzUmVzdH0mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zSW1hZ2VBcmNnaXNSZXN0fSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNUaWxlQXJjZ2lzUmVzdH1gO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgvJiYvZywgJyYnKTtcbiAgICAgIHVybCA9IHVybC5lbmRzV2l0aCgnJicpID8gdXJsLnNsaWNlKDAsIC0xKSA6IHVybDtcbiAgICB9XG4gICAgdXJsID0gdXJsLmVuZHNXaXRoKCcmJykgPyB1cmwuc2xpY2UoMCwgLTEpIDogdXJsO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKCc/JndtJywgJyZ3bScpO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKCc/JicsICc/Jyk7XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgIGxheWVyczogTGF5ZXJbXSxcbiAgICBjb250ZXh0TGF5ZXJzSUQ6IGFueVtdLFxuICAgIHR5cGVTZXJ2aWNlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZGRlZExheWVyc0J5U2VydmljZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsKSA9PiBsLmRhdGFTb3VyY2Uub3B0aW9ucz8udHlwZSA9PT0gdHlwZVNlcnZpY2VcbiAgICApKSB7XG4gICAgICBpZiAoY29udGV4dExheWVyc0lELmluZGV4T2YobGF5ZXIuaWQpID09PSAtMSkge1xuICAgICAgICBsZXQgbGlua1VybCA9IGVuY29kZVVSSUNvbXBvbmVudCgobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zIGFzIGFueSkudXJsKTtcbiAgICAgICAgbGV0IGFkZGVkTGF5ZXIgPSAnJztcbiAgICAgICAgbGV0IGxheWVyVmVyc2lvbjogc3RyaW5nO1xuICAgICAgICBzd2l0Y2ggKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy50eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd3bXMnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgLm9wdGlvbnMgYXMgV01TRGF0YVNvdXJjZU9wdGlvbnM7XG4gICAgICAgICAgICBhZGRlZExheWVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGRhdGFzb3VyY2VPcHRpb25zLnBhcmFtcy5MQVlFUlMpO1xuICAgICAgICAgICAgbGF5ZXJWZXJzaW9uID1cbiAgICAgICAgICAgICAgZGF0YXNvdXJjZU9wdGlvbnMucGFyYW1zLlZFUlNJT04gPT09ICcxLjMuMCdcbiAgICAgICAgICAgICAgICA/IGxheWVyVmVyc2lvblxuICAgICAgICAgICAgICAgIDogZGF0YXNvdXJjZU9wdGlvbnMucGFyYW1zLlZFUlNJT047XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd210cyc6XG4gICAgICAgICAgY2FzZSAnYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgY2FzZSAnaW1hZ2VhcmNnaXNyZXN0JzpcbiAgICAgICAgICBjYXNlICd0aWxlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgICBhZGRlZExheWVyID0gZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgICAgICAobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zIGFzIGFueSkubGF5ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRlZExheWVyUG9zaXRpb24gPSBgJHthZGRlZExheWVyfTppZ296JHtsYXllci56SW5kZXh9YDtcblxuICAgICAgICBsZXQgdmVyc2lvbiA9ICcnO1xuICAgICAgICBpZiAobGF5ZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3IgPVxuICAgICAgICAgICAgKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucyBhcyBhbnkpLnVybC5pbmRleE9mKCc/JykgPT09IC0xXG4gICAgICAgICAgICAgID8gJz8nXG4gICAgICAgICAgICAgIDogJyYnO1xuICAgICAgICAgIHZlcnNpb24gPSBlbmNvZGVVUklDb21wb25lbnQoYCR7b3BlcmF0b3J9VkVSU0lPTj0ke2xheWVyVmVyc2lvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5rVXJsID0gYCR7bGlua1VybH0ke3ZlcnNpb259YDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWFkZGVkTGF5ZXJzQnlTZXJ2aWNlLmZpbmQoKGRlZmluZWRVcmwpID0+IGRlZmluZWRVcmwudXJsID09PSBsaW5rVXJsKVxuICAgICAgICApIHtcbiAgICAgICAgICBhZGRlZExheWVyc0J5U2VydmljZS5wdXNoKHtcbiAgICAgICAgICAgIHVybDogbGlua1VybCxcbiAgICAgICAgICAgIGxheWVyczogW2FkZGVkTGF5ZXJQb3NpdGlvbl1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlZExheWVyc0J5U2VydmljZS5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmljZS51cmwgPT09IGxpbmtVcmwpIHtcbiAgICAgICAgICAgICAgc2VydmljZS5sYXllcnMucHVzaChhZGRlZExheWVyUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXMgPSAnJztcbiAgICBpZiAoYWRkZWRMYXllcnNCeVNlcnZpY2UubGVuZ3RoID49IDEpIHtcbiAgICAgIGxldCBsaW5rVXJsS2V5O1xuICAgICAgbGV0IGxheWVyc0tleTtcbiAgICAgIC8qXG4gICAgICBjb25zdCBsaW5rVXJsS2V5ID0gKHR5cGVTZXJ2aWNlID09PSAnd21zJykgPyB0aGlzLnJvdXRlLm9wdGlvbnMud21zVXJsS2V5IDpcbiAgICAgICAgKHR5cGVTZXJ2aWNlID09PSAnd210cycpID8gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNVcmxLZXkgOiAnJyA7XG4gICAgICBjb25zdCBsYXllcnNLZXkgPSAodHlwZVNlcnZpY2UgPT09ICd3bXMnKSA/IHRoaXMucm91dGUub3B0aW9ucy53bXNMYXllcnNLZXkgOlxuICAgICAgICAodHlwZVNlcnZpY2UgPT09ICd3bXRzJykgPyB0aGlzLnJvdXRlLm9wdGlvbnMud210c0xheWVyc0tleSA6ICcnIDtcbiovXG4gICAgICBzd2l0Y2ggKHR5cGVTZXJ2aWNlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnd21zJzpcbiAgICAgICAgICBsaW5rVXJsS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtc1VybEtleTtcbiAgICAgICAgICBsYXllcnNLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMud21zTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3bXRzJzpcbiAgICAgICAgICBsaW5rVXJsS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNVcmxLZXk7XG4gICAgICAgICAgbGF5ZXJzS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNMYXllcnNLZXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FyY2dpc3Jlc3QnOlxuICAgICAgICAgIGxpbmtVcmxLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMuYXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy5hcmNnaXNMYXllcnNLZXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ltYWdlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgbGlua1VybEtleSA9IHRoaXMucm91dGUub3B0aW9ucy5pYXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy5pYXJjZ2lzTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0aWxlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgbGlua1VybEtleSA9IHRoaXMucm91dGUub3B0aW9ucy50YXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy50YXJjZ2lzTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxpbmtVcmxLZXkgPSAnJztcbiAgICAgICAgICBsYXllcnNLZXkgPSAnJztcbiAgICAgIH1cblxuICAgICAgbGV0IGxpbmtVcmxRdWVyeVBhcmFtcyA9ICcnO1xuICAgICAgbGV0IGxheWVyc1F1ZXJ5UGFyYW1zID0gJyc7XG4gICAgICBhZGRlZExheWVyc0J5U2VydmljZS5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGxpbmtVcmxRdWVyeVBhcmFtcyArPSBgJHtzZXJ2aWNlLnVybH0sYDtcbiAgICAgICAgbGF5ZXJzUXVlcnlQYXJhbXMgKz0gYCgke3NlcnZpY2UubGF5ZXJzLmpvaW4oJywnKX0pLGA7XG4gICAgICB9KTtcbiAgICAgIGxpbmtVcmxRdWVyeVBhcmFtcyA9IGxpbmtVcmxRdWVyeVBhcmFtcy5lbmRzV2l0aCgnLCcpXG4gICAgICAgID8gbGlua1VybFF1ZXJ5UGFyYW1zLnNsaWNlKDAsIC0xKVxuICAgICAgICA6IGxpbmtVcmxRdWVyeVBhcmFtcztcbiAgICAgIGxheWVyc1F1ZXJ5UGFyYW1zID0gbGF5ZXJzUXVlcnlQYXJhbXMuZW5kc1dpdGgoJywnKVxuICAgICAgICA/IGxheWVyc1F1ZXJ5UGFyYW1zLnNsaWNlKDAsIC0xKVxuICAgICAgICA6IGxheWVyc1F1ZXJ5UGFyYW1zO1xuICAgICAgYWRkZWRMYXllcnNRdWVyeVBhcmFtcyA9IGAke2xpbmtVcmxLZXl9PSR7bGlua1VybFF1ZXJ5UGFyYW1zfSYke2xheWVyc0tleX09JHtsYXllcnNRdWVyeVBhcmFtc31gO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRlZExheWVyc1F1ZXJ5UGFyYW1zO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './sidenav.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvc2lkZW5hdi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zaWRlbmF2LmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,122 @@
1
+ import { NgIf } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { MatIconModule } from '@angular/material/icon';
5
+ import { MatSidenavModule } from '@angular/material/sidenav';
6
+ import { MatTooltipModule } from '@angular/material/tooltip';
7
+ import { Title } from '@angular/platform-browser';
8
+ import { getEntityTitle } from '@igo2/common/entity';
9
+ import { FlexibleComponent } from '@igo2/common/flexible';
10
+ import { PanelComponent } from '@igo2/common/panel';
11
+ import { IgoLanguageModule } from '@igo2/core/language';
12
+ import { FeatureDetailsComponent, FeatureMotion, moveToOlFeatures } from '@igo2/geo';
13
+ import olFormatGeoJSON from 'ol/format/GeoJSON';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/platform-browser";
16
+ import * as i2 from "@angular/material/sidenav";
17
+ import * as i3 from "@angular/material/button";
18
+ import * as i4 from "@angular/material/tooltip";
19
+ import * as i5 from "@angular/material/icon";
20
+ import * as i6 from "@ngx-translate/core";
21
+ export class SidenavComponent {
22
+ titleService;
23
+ format = new olFormatGeoJSON();
24
+ get map() {
25
+ return this._map;
26
+ }
27
+ set map(value) {
28
+ this._map = value;
29
+ }
30
+ _map;
31
+ get opened() {
32
+ return this._opened;
33
+ }
34
+ set opened(value) {
35
+ this._opened = value;
36
+ }
37
+ _opened;
38
+ get feature() {
39
+ return this._feature;
40
+ }
41
+ set feature(value) {
42
+ this._feature = value;
43
+ }
44
+ _feature;
45
+ get tool() {
46
+ return this._tool;
47
+ }
48
+ set tool(value) {
49
+ this._tool = value;
50
+ }
51
+ _tool;
52
+ get media() {
53
+ return this._media;
54
+ }
55
+ set media(value) {
56
+ this._media = value;
57
+ }
58
+ _media;
59
+ get title() {
60
+ return this._title;
61
+ }
62
+ set title(value) {
63
+ if (value) {
64
+ this._title = value;
65
+ }
66
+ }
67
+ _title;
68
+ topPanelState = 'initial';
69
+ get featureTitle() {
70
+ return this.feature ? getEntityTitle(this.feature) : undefined;
71
+ }
72
+ constructor(titleService) {
73
+ this.titleService = titleService;
74
+ this._title = this.titleService.getTitle();
75
+ }
76
+ zoomToFeatureExtent() {
77
+ if (this.feature.geometry) {
78
+ const olFeature = this.format.readFeature(this.feature, {
79
+ dataProjection: this.feature.projection,
80
+ featureProjection: this.map.viewProjection
81
+ });
82
+ moveToOlFeatures(this.map.viewController, [olFeature], FeatureMotion.Zoom);
83
+ }
84
+ }
85
+ toggleTopPanel() {
86
+ if (this.topPanelState === 'initial') {
87
+ this.topPanelState = 'expanded';
88
+ }
89
+ else {
90
+ this.topPanelState = 'initial';
91
+ }
92
+ }
93
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SidenavComponent, deps: [{ token: i1.Title }], target: i0.ɵɵFactoryTarget.Component });
94
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SidenavComponent, isStandalone: true, selector: "igo-sidenav", inputs: { map: "map", opened: "opened", feature: "feature", tool: "tool", media: "media", title: "title" }, ngImport: i0, template: "<mat-sidenav #sidenav igoSidenavShim mode=\"side\" [opened]=\"opened\">\n <div class=\"igo-sidenav-content\">\n <igo-flexible\n #topPanel\n initial=\"50%\"\n initialMobile=\"100%\"\n expanded=\"calc(100% - 58px)\"\n [state]=\"topPanelState\"\n >\n <div class=\"igo-content\">\n <igo-panel [title]=\"tool ? (tool.title | translate) : title\">\n <button\n mat-icon-button\n panelLeftButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.goBack' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.mainMenu' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n </igo-panel>\n </div>\n\n <div igoFlexibleFill class=\"igo-content\">\n <igo-panel [title]=\"featureTitle\" *ngIf=\"feature && media !== 'mobile'\">\n <button\n mat-icon-button\n panelLeftButton\n class=\"igo-icon-button\"\n (click)=\"toggleTopPanel()\"\n >\n <mat-icon>{{\n ['collapsed', 'initial'].indexOf(topPanel.state) >= 0\n ? 'arrow_downward'\n : 'arrow_upward'\n }}</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n class=\"igo-icon-button\"\n (click)=\"zoomToFeatureExtent()\"\n *ngIf=\"feature.geometry\"\n >\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <igo-feature-details\n [feature]=\"feature\"\n *ngIf=\"['collapsed', 'initial'].indexOf(topPanel.state) >= 0\"\n >\n </igo-feature-details>\n </igo-panel>\n </div>\n </igo-flexible>\n </div>\n</mat-sidenav>\n", styles: [":host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}:host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{border-top-width:1px;border-top-style:solid;border-top-color:#0003}mat-sidenav{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd}:host{background-color:#fff}:host ::ng-deep mat-sidenav{z-index:3!important}mat-sidenav{width:400px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){mat-sidenav{width:calc(100% - 45px)}}.igo-sidenav-content{margin-top:50px;height:calc(100% - 50px)}igo-feature-details ::ng-deep table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i2.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: FlexibleComponent, selector: "igo-flexible", inputs: ["initial", "collapsed", "expanded", "initialMobile", "collapsedMobile", "expandedMobile", "direction", "state"] }, { kind: "component", type: PanelComponent, selector: "igo-panel", inputs: ["title", "withHeader", "cursorPointer"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: FeatureDetailsComponent, selector: "igo-feature-details", inputs: ["source", "map", "toolbox", "feature"], outputs: ["routeEvent", "selectFeature", "htmlDisplayEvent"] }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SidenavComponent, decorators: [{
97
+ type: Component,
98
+ args: [{ selector: 'igo-sidenav', standalone: true, imports: [
99
+ MatSidenavModule,
100
+ FlexibleComponent,
101
+ PanelComponent,
102
+ NgIf,
103
+ MatButtonModule,
104
+ MatTooltipModule,
105
+ MatIconModule,
106
+ FeatureDetailsComponent,
107
+ IgoLanguageModule
108
+ ], template: "<mat-sidenav #sidenav igoSidenavShim mode=\"side\" [opened]=\"opened\">\n <div class=\"igo-sidenav-content\">\n <igo-flexible\n #topPanel\n initial=\"50%\"\n initialMobile=\"100%\"\n expanded=\"calc(100% - 58px)\"\n [state]=\"topPanelState\"\n >\n <div class=\"igo-content\">\n <igo-panel [title]=\"tool ? (tool.title | translate) : title\">\n <button\n mat-icon-button\n panelLeftButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.goBack' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.context.sidenav.mainMenu' | translate\"\n *ngIf=\"tool\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n </igo-panel>\n </div>\n\n <div igoFlexibleFill class=\"igo-content\">\n <igo-panel [title]=\"featureTitle\" *ngIf=\"feature && media !== 'mobile'\">\n <button\n mat-icon-button\n panelLeftButton\n class=\"igo-icon-button\"\n (click)=\"toggleTopPanel()\"\n >\n <mat-icon>{{\n ['collapsed', 'initial'].indexOf(topPanel.state) >= 0\n ? 'arrow_downward'\n : 'arrow_upward'\n }}</mat-icon>\n </button>\n\n <button\n mat-icon-button\n panelRightButton\n class=\"igo-icon-button\"\n (click)=\"zoomToFeatureExtent()\"\n *ngIf=\"feature.geometry\"\n >\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <igo-feature-details\n [feature]=\"feature\"\n *ngIf=\"['collapsed', 'initial'].indexOf(topPanel.state) >= 0\"\n >\n </igo-feature-details>\n </igo-panel>\n </div>\n </igo-flexible>\n </div>\n</mat-sidenav>\n", styles: [":host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}:host ::ng-deep .igo-flexible-fill .igo-container,.igo-sidenav-content .igo-flexible-fill .igo-container{border-top-width:1px;border-top-style:solid;border-top-color:#0003}mat-sidenav{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd}:host{background-color:#fff}:host ::ng-deep mat-sidenav{z-index:3!important}mat-sidenav{width:400px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){mat-sidenav{width:calc(100% - 45px)}}.igo-sidenav-content{margin-top:50px;height:calc(100% - 50px)}igo-feature-details ::ng-deep table{width:100%}\n"] }]
109
+ }], ctorParameters: () => [{ type: i1.Title }], propDecorators: { map: [{
110
+ type: Input
111
+ }], opened: [{
112
+ type: Input
113
+ }], feature: [{
114
+ type: Input
115
+ }], tool: [{
116
+ type: Input
117
+ }], media: [{
118
+ type: Input
119
+ }], title: [{
120
+ type: Input
121
+ }] } });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZW5hdi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvc2lkZW5hdi9zaWRlbmF2LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbnRleHQvc3JjL2xpYi9zaWRlbmF2L3NpZGVuYXYuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQWlCLE1BQU0sdUJBQXVCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLGdCQUFnQixFQUNqQixNQUFNLFdBQVcsQ0FBQztBQUduQixPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7QUFtQmhELE1BQU0sT0FBTyxnQkFBZ0I7SUErRFI7SUE5RFgsTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7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Q2hCLGFBQWEsb0xBQ2IsdUJBQXVCLDhLQUN2QixpQkFBaUI7OzRGQUdSLGdCQUFnQjtrQkFqQjVCLFNBQVM7K0JBQ0UsYUFBYSxjQUdYLElBQUksV0FDUDt3QkFDUCxnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxJQUFJO3dCQUNKLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLHVCQUF1Qjt3QkFDdkIsaUJBQWlCO3FCQUNsQjswRUFLRyxHQUFHO3NCQUROLEtBQUs7Z0JBU0YsTUFBTTtzQkFEVCxLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSztnQkFVRixJQUFJO3NCQURQLEtBQUs7Z0JBVUYsS0FBSztzQkFEUixLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFNpZGVuYXZNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IGdldEVudGl0eVRpdGxlIH0gZnJvbSAnQGlnbzIvY29tbW9uL2VudGl0eSc7XG5pbXBvcnQgeyBGbGV4aWJsZUNvbXBvbmVudCwgRmxleGlibGVTdGF0ZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9mbGV4aWJsZSc7XG5pbXBvcnQgeyBQYW5lbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9wYW5lbCc7XG5pbXBvcnQgeyBUb29sIH0gZnJvbSAnQGlnbzIvY29tbW9uL3Rvb2wnO1xuaW1wb3J0IHsgSWdvTGFuZ3VhZ2VNb2R1bGUgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB0eXBlIHsgTWVkaWEgfSBmcm9tICdAaWdvMi9jb3JlL21lZGlhJztcbmltcG9ydCB7XG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVEZXRhaWxzQ29tcG9uZW50LFxuICBGZWF0dXJlTW90aW9uLFxuICBtb3ZlVG9PbEZlYXR1cmVzXG59IGZyb20gJ0BpZ28yL2dlbyc7XG5pbXBvcnQgdHlwZSB7IElnb01hcCB9IGZyb20gJ0BpZ28yL2dlbyc7XG5cbmltcG9ydCBvbEZvcm1hdEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tc2lkZW5hdicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlbmF2LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2lkZW5hdi5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0U2lkZW5hdk1vZHVsZSxcbiAgICBGbGV4aWJsZUNvbXBvbmVudCxcbiAgICBQYW5lbENvbXBvbmVudCxcbiAgICBOZ0lmLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgRmVhdHVyZURldGFpbHNDb21wb25lbnQsXG4gICAgSWdvTGFuZ3VhZ2VNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlbmF2Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBmb3JtYXQgPSBuZXcgb2xGb3JtYXRHZW9KU09OKCk7XG4gIEBJbnB1dCgpXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwO1xuICB9XG4gIHNldCBtYXAodmFsdWU6IElnb01hcCkge1xuICAgIHRoaXMuX21hcCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX21hcDogSWdvTWFwO1xuICBASW5wdXQoKVxuICBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcGVuZWQ7XG4gIH1cbiAgc2V0IG9wZW5lZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX29wZW5lZCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX29wZW5lZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBnZXQgZmVhdHVyZSgpOiBGZWF0dXJlIHtcbiAgICByZXR1cm4gdGhpcy5fZmVhdHVyZTtcbiAgfVxuICBzZXQgZmVhdHVyZSh2YWx1ZTogRmVhdHVyZSkge1xuICAgIHRoaXMuX2ZlYXR1cmUgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9mZWF0dXJlOiBGZWF0dXJlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0b29sKCk6IFRvb2wge1xuICAgIHJldHVybiB0aGlzLl90b29sO1xuICB9XG4gIHNldCB0b29sKHZhbHVlOiBUb29sKSB7XG4gICAgdGhpcy5fdG9vbCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX3Rvb2w6IFRvb2w7XG5cbiAgQElucHV0KClcbiAgZ2V0IG1lZGlhKCk6IE1lZGlhIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWE7XG4gIH1cbiAgc2V0IG1lZGlhKHZhbHVlOiBNZWRpYSkge1xuICAgIHRoaXMuX21lZGlhID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfbWVkaWE6IE1lZGlhO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZztcblxuICBwdWJsaWMgdG9wUGFuZWxTdGF0ZTogRmxleGlibGVTdGF0ZSA9ICdpbml0aWFsJztcblxuICBnZXQgZmVhdHVyZVRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZSA/IGdldEVudGl0eVRpdGxlKHRoaXMuZmVhdHVyZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGl0bGVTZXJ2aWNlOiBUaXRsZSkge1xuICAgIHRoaXMuX3RpdGxlID0gdGhpcy50aXRsZVNlcnZpY2UuZ2V0VGl0bGUoKTtcbiAgfVxuXG4gIHpvb21Ub0ZlYXR1cmVFeHRlbnQoKSB7XG4gICAgaWYgKHRoaXMuZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgY29uc3Qgb2xGZWF0dXJlID0gdGhpcy5mb3JtYXQucmVhZEZlYXR1cmUodGhpcy5mZWF0dXJlLCB7XG4gICAgICAgIGRhdGFQcm9qZWN0aW9uOiB0aGlzLmZlYXR1cmUucHJvamVjdGlvbixcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnZpZXdQcm9qZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIG1vdmVUb09sRmVhdHVyZXMoXG4gICAgICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLFxuICAgICAgICBbb2xGZWF0dXJlXSxcbiAgICAgICAgRmVhdHVyZU1vdGlvbi5ab29tXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVRvcFBhbmVsKCkge1xuICAgIGlmICh0aGlzLnRvcFBhbmVsU3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgdGhpcy50b3BQYW5lbFN0YXRlID0gJ2V4cGFuZGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b3BQYW5lbFN0YXRlID0gJ2luaXRpYWwnO1xuICAgIH1cbiAgfVxufVxuIiwiPG1hdC1zaWRlbmF2ICNzaWRlbmF2IGlnb1NpZGVuYXZTaGltIG1vZGU9XCJzaWRlXCIgW29wZW5lZF09XCJvcGVuZWRcIj5cbiAgPGRpdiBjbGFzcz1cImlnby1zaWRlbmF2LWNvbnRlbnRcIj5cbiAgICA8aWdvLWZsZXhpYmxlXG4gICAgICAjdG9wUGFuZWxcbiAgICAgIGluaXRpYWw9XCI1MCVcIlxuICAgICAgaW5pdGlhbE1vYmlsZT1cIjEwMCVcIlxuICAgICAgZXhwYW5kZWQ9XCJjYWxjKDEwMCUgLSA1OHB4KVwiXG4gICAgICBbc3RhdGVdPVwidG9wUGFuZWxTdGF0ZVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImlnby1jb250ZW50XCI+XG4gICAgICAgIDxpZ28tcGFuZWwgW3RpdGxlXT1cInRvb2wgPyAodG9vbC50aXRsZSB8IHRyYW5zbGF0ZSkgOiB0aXRsZVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgcGFuZWxMZWZ0QnV0dG9uXG4gICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmNvbnRleHQuc2lkZW5hdi5nb0JhY2snIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICpuZ0lmPVwidG9vbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBwYW5lbFJpZ2h0QnV0dG9uXG4gICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmNvbnRleHQuc2lkZW5hdi5tYWluTWVudScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKm5nSWY9XCJ0b29sXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+bWVudTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvaWdvLXBhbmVsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWdvRmxleGlibGVGaWxsIGNsYXNzPVwiaWdvLWNvbnRlbnRcIj5cbiAgICAgICAgPGlnby1wYW5lbCBbdGl0bGVdPVwiZmVhdHVyZVRpdGxlXCIgKm5nSWY9XCJmZWF0dXJlICYmIG1lZGlhICE9PSAnbW9iaWxlJ1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgcGFuZWxMZWZ0QnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImlnby1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVG9wUGFuZWwoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7XG4gICAgICAgICAgICAgIFsnY29sbGFwc2VkJywgJ2luaXRpYWwnXS5pbmRleE9mKHRvcFBhbmVsLnN0YXRlKSA+PSAwXG4gICAgICAgICAgICAgICAgPyAnYXJyb3dfZG93bndhcmQnXG4gICAgICAgICAgICAgICAgOiAnYXJyb3dfdXB3YXJkJ1xuICAgICAgICAgICAgfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBwYW5lbFJpZ2h0QnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImlnby1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiem9vbVRvRmVhdHVyZUV4dGVudCgpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiZmVhdHVyZS5nZW9tZXRyeVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnpvb21faW48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGlnby1mZWF0dXJlLWRldGFpbHNcbiAgICAgICAgICAgIFtmZWF0dXJlXT1cImZlYXR1cmVcIlxuICAgICAgICAgICAgKm5nSWY9XCJbJ2NvbGxhcHNlZCcsICdpbml0aWFsJ10uaW5kZXhPZih0b3BQYW5lbC5zdGF0ZSkgPj0gMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvaWdvLWZlYXR1cmUtZGV0YWlscz5cbiAgICAgICAgPC9pZ28tcGFuZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2lnby1mbGV4aWJsZT5cbiAgPC9kaXY+XG48L21hdC1zaWRlbmF2PlxuIl19
@@ -0,0 +1,24 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { SidenavComponent } from './sidenav.component';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * @deprecated import the SidenavComponent directly
6
+ */
7
+ export class IgoSidenavModule {
8
+ static forRoot() {
9
+ return {
10
+ ngModule: IgoSidenavModule
11
+ };
12
+ }
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoSidenavModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
14
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoSidenavModule, imports: [SidenavComponent], exports: [SidenavComponent] });
15
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoSidenavModule, imports: [SidenavComponent] });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoSidenavModule, decorators: [{
18
+ type: NgModule,
19
+ args: [{
20
+ imports: [SidenavComponent],
21
+ exports: [SidenavComponent]
22
+ }]
23
+ }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZW5hdi5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvc2lkZW5hdi9zaWRlbmF2Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFdkQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTztZQUNMLFFBQVEsRUFBRSxnQkFBZ0I7U0FDM0IsQ0FBQztJQUNKLENBQUM7d0dBTFUsZ0JBQWdCO3lHQUFoQixnQkFBZ0IsWUFIakIsZ0JBQWdCLGFBQ2hCLGdCQUFnQjt5R0FFZixnQkFBZ0IsWUFIakIsZ0JBQWdCOzs0RkFHZixnQkFBZ0I7a0JBSjVCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNpZGVuYXZDb21wb25lbnQgfSBmcm9tICcuL3NpZGVuYXYuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbXBvcnQgdGhlIFNpZGVuYXZDb21wb25lbnQgZGlyZWN0bHlcbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1NpZGVuYXZDb21wb25lbnRdLFxuICBleHBvcnRzOiBbU2lkZW5hdkNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgSWdvU2lkZW5hdk1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8SWdvU2lkZW5hdk1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogSWdvU2lkZW5hdk1vZHVsZVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ /*
2
+ * Public API Surface of context
3
+ */
4
+ export * from './lib/context.module';
5
+ export * from './lib/context-import-export/context-import-export.module';
6
+ export * from './lib/context-manager/context-manager.module';
7
+ export * from './lib/context-map-button/context-map-button.module';
8
+ export * from './lib/share-map/share-map.module';
9
+ export * from './lib/sidenav/sidenav.module';
10
+ export * from './lib/context-import-export';
11
+ export * from './lib/context-manager';
12
+ export * from './lib/context-map-button';
13
+ export * from './lib/environment';
14
+ export * from './lib/share-map';
15
+ export * from './lib/sidenav';
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL2NvbnRleHQvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGNvbnRleHRcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250ZXh0Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250ZXh0LWltcG9ydC1leHBvcnQvY29udGV4dC1pbXBvcnQtZXhwb3J0Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250ZXh0LW1hbmFnZXIvY29udGV4dC1tYW5hZ2VyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250ZXh0LW1hcC1idXR0b24vY29udGV4dC1tYXAtYnV0dG9uLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaGFyZS1tYXAvc2hhcmUtbWFwLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWRlbmF2L3NpZGVuYXYubW9kdWxlJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udGV4dC1pbXBvcnQtZXhwb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRleHQtbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250ZXh0LW1hcC1idXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2hhcmUtbWFwJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpZGVuYXYnO1xuIl19