@igo2/integration 1.15.3 → 1.15.5

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 (214) hide show
  1. package/esm2020/igo2-integration.mjs +4 -4
  2. package/esm2020/lib/about/about-tool/about-tool.component.mjs +185 -185
  3. package/esm2020/lib/about/about-tool/index.mjs +2 -2
  4. package/esm2020/lib/about/about.module.mjs +55 -55
  5. package/esm2020/lib/about/index.mjs +2 -2
  6. package/esm2020/lib/analytics/analytics-listener.service.mjs +127 -127
  7. package/esm2020/lib/analytics/analytics.module.mjs +16 -16
  8. package/esm2020/lib/analytics/index.mjs +2 -2
  9. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +113 -113
  10. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +29 -29
  11. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +89 -89
  12. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +29 -29
  13. package/esm2020/lib/catalog/catalog.module.mjs +24 -24
  14. package/esm2020/lib/catalog/catalog.state.mjs +54 -54
  15. package/esm2020/lib/catalog/index.mjs +6 -6
  16. package/esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs +34 -34
  17. package/esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs +44 -44
  18. package/esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +25 -25
  19. package/esm2020/lib/context/context-share-tool/context-share-tool.component.mjs +34 -34
  20. package/esm2020/lib/context/context.module.mjs +39 -39
  21. package/esm2020/lib/context/context.state.mjs +88 -88
  22. package/esm2020/lib/context/index.mjs +6 -6
  23. package/esm2020/lib/directions/directions-tool/directions-tool.component.mjs +84 -84
  24. package/esm2020/lib/directions/directions-tool/index.mjs +2 -2
  25. package/esm2020/lib/directions/directions.module.mjs +26 -26
  26. package/esm2020/lib/directions/directions.state.mjs +64 -64
  27. package/esm2020/lib/directions/index.mjs +3 -3
  28. package/esm2020/lib/draw/draw.module.mjs +21 -21
  29. package/esm2020/lib/draw/draw.state.mjs +39 -39
  30. package/esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs +72 -72
  31. package/esm2020/lib/draw/index.mjs +3 -3
  32. package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +10 -10
  33. package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +44 -44
  34. package/esm2020/lib/filter/active-ogc-filter-tool/index.mjs +2 -2
  35. package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +10 -10
  36. package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +44 -44
  37. package/esm2020/lib/filter/active-time-filter-tool/index.mjs +2 -2
  38. package/esm2020/lib/filter/filter.module.mjs +51 -51
  39. package/esm2020/lib/filter/index.mjs +6 -6
  40. package/esm2020/lib/filter/ogc-filter-tool/index.mjs +2 -2
  41. package/esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +25 -25
  42. package/esm2020/lib/filter/spatial-filter-tool/index.mjs +2 -2
  43. package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +535 -535
  44. package/esm2020/lib/filter/time-filter-tool/index.mjs +2 -2
  45. package/esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs +25 -25
  46. package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +141 -141
  47. package/esm2020/lib/import-export/import-export-tool/index.mjs +2 -2
  48. package/esm2020/lib/import-export/import-export.module.mjs +51 -51
  49. package/esm2020/lib/import-export/import-export.state.mjs +41 -41
  50. package/esm2020/lib/import-export/index.mjs +3 -3
  51. package/esm2020/lib/integration.module.mjs +72 -72
  52. package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +472 -472
  53. package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +89 -89
  54. package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +218 -218
  55. package/esm2020/lib/map/advanced-map-tool/index.mjs +2 -2
  56. package/esm2020/lib/map/index.mjs +9 -9
  57. package/esm2020/lib/map/layer-list-tool.state.mjs +42 -42
  58. package/esm2020/lib/map/map-details-tool/index.mjs +2 -2
  59. package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +256 -256
  60. package/esm2020/lib/map/map-legend/index.mjs +2 -2
  61. package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +275 -275
  62. package/esm2020/lib/map/map-proximity-tool/index.mjs +2 -2
  63. package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +203 -203
  64. package/esm2020/lib/map/map-proximity.state.mjs +167 -167
  65. package/esm2020/lib/map/map-tool/index.mjs +2 -2
  66. package/esm2020/lib/map/map-tool/map-tool.component.mjs +130 -130
  67. package/esm2020/lib/map/map-tools/index.mjs +2 -2
  68. package/esm2020/lib/map/map-tools/map-tools.component.mjs +495 -495
  69. package/esm2020/lib/map/map.module.mjs +144 -144
  70. package/esm2020/lib/map/map.state.mjs +47 -47
  71. package/esm2020/lib/measure/index.mjs +4 -4
  72. package/esm2020/lib/measure/measure.module.mjs +20 -20
  73. package/esm2020/lib/measure/measure.state.mjs +35 -35
  74. package/esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs +45 -45
  75. package/esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs +25 -25
  76. package/esm2020/lib/print/index.mjs +2 -2
  77. package/esm2020/lib/print/print-tool/index.mjs +2 -2
  78. package/esm2020/lib/print/print-tool/print-tool.component.mjs +33 -33
  79. package/esm2020/lib/print/print.module.mjs +26 -26
  80. package/esm2020/lib/search/index.mjs +7 -7
  81. package/esm2020/lib/search/query.state.mjs +42 -34
  82. package/esm2020/lib/search/search-bar/search-bar-binding.directive.mjs +61 -61
  83. package/esm2020/lib/search/search-bar/search-bar.module.mjs +22 -22
  84. package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +593 -593
  85. package/esm2020/lib/search/search-results-tool/search-results-tool.module.mjs +65 -65
  86. package/esm2020/lib/search/search.module.mjs +24 -24
  87. package/esm2020/lib/search/search.state.mjs +132 -132
  88. package/esm2020/lib/storage/index.mjs +2 -2
  89. package/esm2020/lib/storage/storage.module.mjs +16 -16
  90. package/esm2020/lib/storage/storage.state.mjs +23 -23
  91. package/esm2020/lib/tool/index.mjs +2 -2
  92. package/esm2020/lib/tool/tool.module.mjs +16 -16
  93. package/esm2020/lib/tool/tool.state.mjs +52 -52
  94. package/esm2020/lib/workspace/index.mjs +4 -4
  95. package/esm2020/lib/workspace/shared/edition-actions.service.mjs +156 -156
  96. package/esm2020/lib/workspace/shared/feature-actions.service.mjs +144 -144
  97. package/esm2020/lib/workspace/shared/index.mjs +3 -3
  98. package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +158 -158
  99. package/esm2020/lib/workspace/shared/workspace.utils.mjs +7 -7
  100. package/esm2020/lib/workspace/workspace-button/index.mjs +2 -2
  101. package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +69 -69
  102. package/esm2020/lib/workspace/workspace.module.mjs +37 -37
  103. package/esm2020/lib/workspace/workspace.state.mjs +188 -188
  104. package/esm2020/public_api.mjs +35 -35
  105. package/fesm2015/igo2-integration.mjs +6558 -6553
  106. package/fesm2015/igo2-integration.mjs.map +1 -1
  107. package/fesm2020/igo2-integration.mjs +6114 -6109
  108. package/fesm2020/igo2-integration.mjs.map +1 -1
  109. package/index.d.ts +5 -5
  110. package/lib/about/about-tool/about-tool.component.d.ts +34 -34
  111. package/lib/about/about-tool/index.d.ts +1 -1
  112. package/lib/about/about.module.d.ts +16 -16
  113. package/lib/about/index.d.ts +1 -1
  114. package/lib/analytics/analytics-listener.service.d.ts +33 -33
  115. package/lib/analytics/analytics.module.d.ts +6 -6
  116. package/lib/analytics/index.d.ts +1 -1
  117. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +57 -57
  118. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.d.ts +12 -12
  119. package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +50 -50
  120. package/lib/catalog/catalog-library-tool/catalog-library-tool.module.d.ts +12 -12
  121. package/lib/catalog/catalog.module.d.ts +8 -8
  122. package/lib/catalog/catalog.state.d.ts +37 -37
  123. package/lib/catalog/index.d.ts +5 -5
  124. package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +9 -9
  125. package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +15 -15
  126. package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +5 -5
  127. package/lib/context/context-share-tool/context-share-tool.component.d.ts +13 -13
  128. package/lib/context/context.module.d.ts +11 -11
  129. package/lib/context/context.state.d.ts +37 -37
  130. package/lib/context/index.d.ts +5 -5
  131. package/lib/directions/directions-tool/directions-tool.component.d.ts +54 -54
  132. package/lib/directions/directions-tool/index.d.ts +1 -1
  133. package/lib/directions/directions.module.d.ts +10 -10
  134. package/lib/directions/directions.state.d.ts +28 -28
  135. package/lib/directions/index.d.ts +2 -2
  136. package/lib/draw/draw.module.d.ts +8 -8
  137. package/lib/draw/draw.state.d.ts +16 -16
  138. package/lib/draw/drawing-tool/drawing-tool.component.d.ts +31 -31
  139. package/lib/draw/index.d.ts +2 -2
  140. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.d.ts +2 -2
  141. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +12 -12
  142. package/lib/filter/active-ogc-filter-tool/index.d.ts +1 -1
  143. package/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.d.ts +2 -2
  144. package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +12 -12
  145. package/lib/filter/active-time-filter-tool/index.d.ts +1 -1
  146. package/lib/filter/filter.module.d.ts +15 -15
  147. package/lib/filter/index.d.ts +5 -5
  148. package/lib/filter/ogc-filter-tool/index.d.ts +1 -1
  149. package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +6 -6
  150. package/lib/filter/spatial-filter-tool/index.d.ts +1 -1
  151. package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +82 -82
  152. package/lib/filter/time-filter-tool/index.d.ts +1 -1
  153. package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +6 -6
  154. package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +33 -33
  155. package/lib/import-export/import-export-tool/index.d.ts +1 -1
  156. package/lib/import-export/import-export.module.d.ts +15 -15
  157. package/lib/import-export/import-export.state.d.ts +24 -24
  158. package/lib/import-export/index.d.ts +2 -2
  159. package/lib/integration.module.d.ts +20 -20
  160. package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +97 -97
  161. package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +12 -12
  162. package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +65 -65
  163. package/lib/map/advanced-map-tool/index.d.ts +1 -1
  164. package/lib/map/index.d.ts +8 -8
  165. package/lib/map/layer-list-tool.state.d.ts +19 -19
  166. package/lib/map/map-details-tool/index.d.ts +1 -1
  167. package/lib/map/map-details-tool/map-details-tool.component.d.ts +38 -38
  168. package/lib/map/map-legend/index.d.ts +1 -1
  169. package/lib/map/map-legend/map-legend-tool.component.d.ts +40 -40
  170. package/lib/map/map-proximity-tool/index.d.ts +1 -1
  171. package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +36 -36
  172. package/lib/map/map-proximity.state.d.ts +31 -31
  173. package/lib/map/map-tool/index.d.ts +1 -1
  174. package/lib/map/map-tool/map-tool.component.d.ts +27 -27
  175. package/lib/map/map-tools/index.d.ts +1 -1
  176. package/lib/map/map-tools/map-tools.component.d.ts +66 -66
  177. package/lib/map/map.module.d.ts +38 -38
  178. package/lib/map/map.state.d.ts +24 -24
  179. package/lib/measure/index.d.ts +3 -3
  180. package/lib/measure/measure.module.d.ts +7 -7
  181. package/lib/measure/measure.state.d.ts +16 -16
  182. package/lib/measure/measurer-tool/measurer-tool.component.d.ts +24 -24
  183. package/lib/measure/measurer-tool/measurer-tool.module.d.ts +11 -11
  184. package/lib/print/index.d.ts +1 -1
  185. package/lib/print/print-tool/index.d.ts +1 -1
  186. package/lib/print/print-tool/print-tool.component.d.ts +10 -10
  187. package/lib/print/print.module.d.ts +10 -10
  188. package/lib/search/index.d.ts +6 -6
  189. package/lib/search/query.state.d.ts +24 -20
  190. package/lib/search/search-bar/search-bar-binding.directive.d.ts +20 -20
  191. package/lib/search/search-bar/search-bar.module.d.ts +11 -11
  192. package/lib/search/search-results-tool/search-results-tool.component.d.ts +100 -100
  193. package/lib/search/search-results-tool/search-results-tool.module.d.ts +18 -18
  194. package/lib/search/search.module.d.ts +8 -8
  195. package/lib/search/search.state.d.ts +60 -60
  196. package/lib/storage/index.d.ts +1 -1
  197. package/lib/storage/storage.module.d.ts +6 -6
  198. package/lib/storage/storage.state.d.ts +12 -12
  199. package/lib/tool/index.d.ts +1 -1
  200. package/lib/tool/tool.module.d.ts +6 -6
  201. package/lib/tool/tool.state.d.ts +22 -22
  202. package/lib/workspace/index.d.ts +3 -3
  203. package/lib/workspace/shared/edition-actions.service.d.ts +26 -26
  204. package/lib/workspace/shared/feature-actions.service.d.ts +25 -25
  205. package/lib/workspace/shared/index.d.ts +2 -2
  206. package/lib/workspace/shared/wfs-actions.service.d.ts +27 -27
  207. package/lib/workspace/shared/workspace.utils.d.ts +2 -2
  208. package/lib/workspace/workspace-button/index.d.ts +1 -1
  209. package/lib/workspace/workspace-button/workspace-button.component.d.ts +21 -21
  210. package/lib/workspace/workspace.module.d.ts +12 -12
  211. package/lib/workspace/workspace.state.d.ts +63 -63
  212. package/ngcc.config.js +3 -3
  213. package/package.json +3 -3
  214. package/public_api.d.ts +31 -31
@@ -1,535 +1,535 @@
1
- import { __decorate } from "tslib";
2
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
3
- import { forkJoin, Subject } from 'rxjs';
4
- import { tap, take, takeUntil } from 'rxjs/operators';
5
- import { moveToOlFeatures, FeatureMotion, featureToOl, SpatialFilterType, SpatialFilterItemType, createOverlayMarkerStyle, MeasureLengthUnit } from '@igo2/geo';
6
- import { EntityStore, ToolComponent } from '@igo2/common';
7
- import olFormatGeoJSON from 'ol/format/GeoJSON';
8
- import { BehaviorSubject } from 'rxjs';
9
- import { ImportExportMode } from './../../import-export/import-export.state';
10
- import * as olstyle from 'ol/style';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/material/icon";
13
- import * as i2 from "@igo2/geo";
14
- import * as i3 from "../../map/map.state";
15
- import * as i4 from "@igo2/core";
16
- import * as i5 from "./../../import-export/import-export.state";
17
- import * as i6 from "../../tool/tool.state";
18
- import * as i7 from "../../workspace/workspace.state";
19
- import * as i8 from "@angular/common";
20
- function SpatialFilterToolComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementContainerStart(0);
22
- i0.ɵɵelement(1, "igo-feature-details", 3);
23
- i0.ɵɵelementContainerEnd();
24
- } if (rf & 2) {
25
- const feature_r1 = ctx.ngIf;
26
- i0.ɵɵadvance(1);
27
- i0.ɵɵproperty("feature", feature_r1);
28
- } }
29
- /**
30
- * Tool to apply spatial filter
31
- */
32
- let SpatialFilterToolComponent = class SpatialFilterToolComponent {
33
- constructor(matIconRegistry, spatialFilterService, dataSourceService, layerService, mapState, messageService, languageService, importExportState, toolState, workspaceState, cdRef) {
34
- this.matIconRegistry = matIconRegistry;
35
- this.spatialFilterService = spatialFilterService;
36
- this.dataSourceService = dataSourceService;
37
- this.layerService = layerService;
38
- this.mapState = mapState;
39
- this.messageService = messageService;
40
- this.languageService = languageService;
41
- this.importExportState = importExportState;
42
- this.toolState = toolState;
43
- this.workspaceState = workspaceState;
44
- this.cdRef = cdRef;
45
- this.itemType = SpatialFilterItemType.Address;
46
- this.layers = [];
47
- this.activeLayers = [];
48
- this.buffer = 0;
49
- this.iterator = 1;
50
- this.selectedFeature$ = new BehaviorSubject(undefined);
51
- this.format = new olFormatGeoJSON();
52
- this.store = new EntityStore([]); // Store to print results at the end
53
- this.spatialListStore = new EntityStore([]);
54
- this.loading = false;
55
- this.thematicLength = 0;
56
- this.measureUnit = MeasureLengthUnit.Meters;
57
- this.unsubscribe$ = new Subject();
58
- }
59
- get map() {
60
- return this.mapState.map;
61
- }
62
- ngOnInit() {
63
- for (const layer of this.map.layers) {
64
- if (layer.title && layer.title.includes(this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'))) {
65
- this.layers.push(layer);
66
- }
67
- }
68
- }
69
- ngOnDestroy() {
70
- this.unsubscribe$.next();
71
- this.unsubscribe$.complete();
72
- }
73
- getOutputType(event) {
74
- this.type = event;
75
- this.queryType = undefined;
76
- }
77
- getOutputQueryType(event) {
78
- this.queryType = event;
79
- if (this.queryType) {
80
- this.loadFilterList();
81
- }
82
- }
83
- activateExportTool() {
84
- const ids = [];
85
- const re = new RegExp('^Zone \\d+');
86
- for (const layer of this.layers) {
87
- if (!layer.title.match(re)) {
88
- ids.push(layer.id);
89
- }
90
- }
91
- this.importExportState.setMode(ImportExportMode.export);
92
- this.importExportState.setsExportOptions({ layers: ids });
93
- this.toolState.toolbox.activateTool('importExport');
94
- }
95
- activateWorkspace(record) {
96
- let layerToOpenWks;
97
- this.workspaceState.store.entities$.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
98
- if (!record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
99
- if (this.itemType === SpatialFilterItemType.Thematics) {
100
- for (const thematic of this.thematics) {
101
- if (!thematic.zeroResults) {
102
- layerToOpenWks = this.activeLayers.find(layer => layer.title.includes(thematic.name + ' ' + this.iterator.toString()));
103
- break;
104
- }
105
- }
106
- }
107
- else {
108
- const title = 'Adresses ' + this.iterator.toString();
109
- this.activeLayers.forEach((layer) => {
110
- if (layer.title.includes(title)) {
111
- layerToOpenWks = layer;
112
- }
113
- });
114
- }
115
- if (layerToOpenWks) {
116
- this.workspaceState.workspacePanelExpanded = true;
117
- this.workspaceState.setActiveWorkspaceById(layerToOpenWks.id);
118
- }
119
- }
120
- else if (record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
121
- this.selectWorkspaceEntity(record);
122
- this.moveendKey = this.map.ol.on('moveend', () => {
123
- this.selectWorkspaceEntity(record);
124
- });
125
- }
126
- });
127
- }
128
- selectWorkspaceEntity(record) {
129
- this.workspaceState.store.all().forEach(workspace => {
130
- workspace.entityStore.state.updateAll({ selected: false });
131
- if (workspace.title.includes(record.added[0].meta.title)) {
132
- this.workspaceState.setActiveWorkspaceById(workspace.id);
133
- workspace.entityStore.state.updateMany(record.added, { selected: true });
134
- }
135
- });
136
- }
137
- loadFilterList() {
138
- this.spatialFilterService
139
- .loadFilterList(this.queryType)
140
- .pipe(takeUntil(this.unsubscribe$))
141
- .subscribe((features) => {
142
- features.sort((a, b) => {
143
- if (a.properties.nom < b.properties.nom) {
144
- return -1;
145
- }
146
- if (a.properties.nom > b.properties.nom) {
147
- return 1;
148
- }
149
- return 0;
150
- });
151
- this.spatialListStore.clear();
152
- this.spatialListStore.load(features);
153
- });
154
- }
155
- getOutputToggleSearch() {
156
- this.loadThematics();
157
- }
158
- getOutputClearSearch() {
159
- this.zone = undefined;
160
- this.queryType = undefined;
161
- }
162
- clearMap() {
163
- this.map.removeLayers(this.layers);
164
- this.layers = [];
165
- this.activeLayers = [];
166
- this.thematicLength = 0;
167
- this.iterator = 1;
168
- if (this.type === SpatialFilterType.Predefined) {
169
- this.zone = undefined;
170
- this.queryType = undefined;
171
- }
172
- }
173
- loadThematics() {
174
- this.loading = true;
175
- let zeroResults = true;
176
- let thematics;
177
- if (this.buffer === 0 || this.type === SpatialFilterType.Point) {
178
- this.tryAddFeaturesToMap([this.zone]);
179
- }
180
- if (this.itemType !== SpatialFilterItemType.Thematics) {
181
- const theme = {
182
- name: ''
183
- };
184
- thematics = [theme];
185
- }
186
- else {
187
- thematics = this.thematics;
188
- }
189
- if (this.measureUnit === MeasureLengthUnit.Kilometers && this.type !== SpatialFilterType.Point) {
190
- this.buffer = this.buffer * 1000;
191
- }
192
- if (this.type === SpatialFilterType.Polygon) {
193
- this.buffer = 0; // to avoid buffer enter a second time in terrAPI
194
- }
195
- const observables$ = [];
196
- thematics.forEach(thematic => {
197
- observables$.push(this.spatialFilterService
198
- .loadFilterItem(this.zone, this.itemType, this.queryType, thematic, this.buffer)
199
- .pipe(tap((features) => {
200
- this.store.insertMany(features);
201
- const featuresPoint = [];
202
- const featuresLinePoly = [];
203
- let idPoint;
204
- let idLinePoly;
205
- features.forEach(feature => {
206
- if (feature.geometry.type === 'Point') {
207
- feature.properties.longitude = feature.geometry.coordinates[0];
208
- feature.properties.latitude = feature.geometry.coordinates[1];
209
- featuresPoint.push(feature);
210
- idPoint = feature.meta.id;
211
- }
212
- else {
213
- featuresLinePoly.push(feature);
214
- idLinePoly = feature.meta.id;
215
- }
216
- });
217
- this.tryAddPointToMap(featuresPoint, idPoint);
218
- this.tryAddLayerToMap(featuresLinePoly, idLinePoly);
219
- if (features.length) {
220
- zeroResults = false;
221
- this.thematicLength += 1;
222
- thematic.zeroResults = false;
223
- this.cdRef.detectChanges();
224
- }
225
- else {
226
- thematic.zeroResults = true;
227
- }
228
- if (features.length >= 10000) {
229
- this.messageService.alert('igo.geo.spatialFilter.maxSizeAlert', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
230
- }
231
- })));
232
- });
233
- forkJoin(observables$).pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
234
- this.loading = false;
235
- if (zeroResults) {
236
- this.messageService.alert('igo.geo.spatialFilter.zeroResults', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
237
- }
238
- });
239
- }
240
- onZoneChange(feature, buffer) {
241
- this.zone = feature;
242
- if (feature) {
243
- buffer ? this.tryAddFeaturesToMap([feature], true) : this.tryAddFeaturesToMap([feature]);
244
- this.zoomToFeatureExtent(feature);
245
- }
246
- }
247
- /**
248
- * Try to add zone feature to the map overlay
249
- */
250
- tryAddFeaturesToMap(features, buffer) {
251
- let i = 1;
252
- for (const feature of features) {
253
- if (this.type === SpatialFilterType.Predefined) {
254
- for (const layer of this.layers) {
255
- if (layer.options._internal &&
256
- layer.options._internal.code === feature.properties.code &&
257
- !buffer) {
258
- if (!layer.title?.startsWith('Zone')) {
259
- const index = this.layers.indexOf(layer);
260
- this.layers.splice(index, 1);
261
- }
262
- return;
263
- }
264
- if (layer.title?.startsWith('Zone')) {
265
- this.activeLayers = [];
266
- const index = this.layers.indexOf(layer);
267
- this.layers.splice(index, 1);
268
- this.map.removeLayer(layer);
269
- }
270
- }
271
- }
272
- else {
273
- if (buffer) {
274
- for (const layer of this.activeLayers) {
275
- if (this.activeLayers.length === 1 && layer.title?.startsWith('Zone')) {
276
- const index = this.layers.indexOf(layer);
277
- this.layers.splice(index, 1);
278
- this.map.removeLayer(layer);
279
- }
280
- }
281
- }
282
- this.activeLayers = [];
283
- }
284
- for (const layer of this.layers) {
285
- if (layer.title?.startsWith('Zone')) {
286
- i++;
287
- }
288
- }
289
- this.defaultStyle = (_feature, resolution) => {
290
- const coordinates = features[0].coordinates;
291
- return new olstyle.Style({
292
- image: new olstyle.Circle({
293
- radius: coordinates
294
- ? this.buffer /
295
- Math.cos((Math.PI / 180) * coordinates[1]) /
296
- resolution
297
- : undefined,
298
- fill: new olstyle.Fill({
299
- color: 'rgba(200, 200, 20, 0.2)'
300
- }),
301
- stroke: new olstyle.Stroke({
302
- width: 1,
303
- color: 'orange'
304
- })
305
- }),
306
- stroke: new olstyle.Stroke({
307
- width: 1,
308
- color: 'orange'
309
- }),
310
- fill: new olstyle.Fill({
311
- color: 'rgba(200, 200, 20, 0.2)'
312
- })
313
- });
314
- };
315
- this.dataSourceService
316
- .createAsyncDataSource({
317
- type: 'vector',
318
- queryable: true
319
- })
320
- .pipe(take(1))
321
- .subscribe((dataSource) => {
322
- const olLayer = this.layerService.createLayer({
323
- isIgoInternalLayer: true,
324
- title: ('Zone ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
325
- workspace: { enabled: true },
326
- _internal: {
327
- code: this.type === SpatialFilterType.Predefined
328
- ? feature.properties.code
329
- : undefined
330
- },
331
- source: dataSource,
332
- visible: true
333
- });
334
- const featuresOl = features.map(f => {
335
- return featureToOl(f, this.map.projection);
336
- });
337
- if (this.type !== SpatialFilterType.Predefined) {
338
- const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
339
- featuresOl[0].set('nom', 'Zone', true);
340
- featuresOl[0].set('type', type, true);
341
- }
342
- const ol = dataSource.ol;
343
- ol.addFeatures(featuresOl);
344
- olLayer.ol.setStyle(this.defaultStyle);
345
- this.map.addLayer(olLayer);
346
- this.layers.push(olLayer);
347
- this.activeLayers.push(olLayer);
348
- this.cdRef.detectChanges();
349
- });
350
- }
351
- }
352
- /**
353
- * Try to add point features to the map
354
- * Necessary to create clusters
355
- */
356
- tryAddPointToMap(features, id) {
357
- let i = 1;
358
- if (features.length) {
359
- if (this.map === undefined) {
360
- return;
361
- }
362
- for (const layer of this.layers) {
363
- if (layer.title?.startsWith(features[0].meta.title)) {
364
- i++;
365
- }
366
- }
367
- this.dataSourceService
368
- .createAsyncDataSource({
369
- type: 'cluster',
370
- id,
371
- queryable: true,
372
- distance: 120,
373
- meta: {
374
- title: 'Cluster'
375
- }
376
- })
377
- .pipe(take(1))
378
- .subscribe((dataSource) => {
379
- const icon = features[0].meta.icon;
380
- let style;
381
- if (!icon) {
382
- style = createOverlayMarkerStyle();
383
- }
384
- else {
385
- style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
386
- }
387
- const olLayer = this.layerService.createLayer({
388
- isIgoInternalLayer: true,
389
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
390
- source: dataSource,
391
- visible: true,
392
- style
393
- });
394
- const featuresOl = features.map(feature => {
395
- return featureToOl(feature, this.map.projection);
396
- });
397
- const ol = dataSource.ol;
398
- ol.getSource().addFeatures(featuresOl);
399
- if (this.layers.find(layer => layer.id === olLayer.id)) {
400
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
401
- i = i - 1;
402
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
403
- olLayer.options.title = olLayer.title;
404
- }
405
- this.iterator = i;
406
- this.map.addLayer(olLayer);
407
- this.layers.push(olLayer);
408
- this.pushLayer(olLayer);
409
- this.cdRef.detectChanges();
410
- });
411
- }
412
- }
413
- createSvgIcon(icon) {
414
- let style;
415
- this.matIconRegistry.getNamedSvgIcon(icon).subscribe(svgObj => {
416
- const xmlSerializer = new XMLSerializer();
417
- svgObj.setAttribute('width', '30');
418
- svgObj.setAttribute('height', '30');
419
- svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
420
- svgObj.setAttribute('stroke', 'white');
421
- const svg = xmlSerializer.serializeToString(svgObj);
422
- style = new olstyle.Style({
423
- image: new olstyle.Icon({
424
- src: 'data:image/svg+xml;utf8,' + svg
425
- })
426
- });
427
- });
428
- return style;
429
- }
430
- /**
431
- * Try to add line or polygon features to the map
432
- */
433
- tryAddLayerToMap(features, id) {
434
- let i = 1;
435
- if (features.length) {
436
- if (this.map === undefined) {
437
- return;
438
- }
439
- for (const layer of this.layers) {
440
- if (layer.title?.startsWith(features[0].meta.title)) {
441
- i++;
442
- }
443
- }
444
- this.dataSourceService
445
- .createAsyncDataSource({
446
- type: 'vector',
447
- id,
448
- queryable: true
449
- })
450
- .pipe(take(1))
451
- .subscribe((dataSource) => {
452
- const olLayer = this.layerService.createLayer({
453
- isIgoInternalLayer: true,
454
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
455
- source: dataSource,
456
- visible: true
457
- });
458
- const featuresOl = features.map(feature => {
459
- return featureToOl(feature, this.map.projection);
460
- });
461
- const ol = dataSource.ol;
462
- ol.addFeatures(featuresOl);
463
- if (this.layers.find(layer => layer.id === olLayer.id)) {
464
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
465
- i = i - 1;
466
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
467
- olLayer.options.title = olLayer.title;
468
- }
469
- this.map.addLayer(olLayer);
470
- this.layers.push(olLayer);
471
- this.pushLayer(olLayer);
472
- this.cdRef.detectChanges();
473
- });
474
- }
475
- }
476
- zoomToFeatureExtent(feature) {
477
- if (feature) {
478
- const olFeature = this.format.readFeature(feature, {
479
- dataProjection: feature.projection,
480
- featureProjection: this.map.projection
481
- });
482
- moveToOlFeatures(this.map, [olFeature], FeatureMotion.Zoom);
483
- }
484
- }
485
- pushLayer(layer) {
486
- for (const lay of this.activeLayers) {
487
- if (lay.id === layer.id) {
488
- return;
489
- }
490
- }
491
- this.activeLayers.push(layer);
492
- }
493
- };
494
- SpatialFilterToolComponent.ɵfac = function SpatialFilterToolComponent_Factory(t) { return new (t || SpatialFilterToolComponent)(i0.ɵɵdirectiveInject(i1.MatIconRegistry), i0.ɵɵdirectiveInject(i2.SpatialFilterService), i0.ɵɵdirectiveInject(i2.DataSourceService), i0.ɵɵdirectiveInject(i2.LayerService), i0.ɵɵdirectiveInject(i3.MapState), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ImportExportState), i0.ɵɵdirectiveInject(i6.ToolState), i0.ɵɵdirectiveInject(i7.WorkspaceState), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
495
- SpatialFilterToolComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpatialFilterToolComponent, selectors: [["igo-spatial-filter-tool"]], inputs: { type: "type", itemType: "itemType", freehandDrawIsActive: "freehandDrawIsActive" }, decls: 6, vars: 16, consts: [[3, "store", "selectedQueryType", "zone", "layers", "eventType", "eventQueryType", "zoneChange", "zoneWithBufferChange", "bufferChange", "measureUnitChange"], [3, "type", "queryType", "map", "zone", "loading", "store", "layers", "allLayers", "thematicLength", "radiusEvent", "bufferEvent", "measureUnitChange", "freehandControl", "drawZoneEvent", "zoneWithBufferChange", "itemTypeChange", "thematicChange", "toggleSearch", "clearButtonEvent", "clearSearchEvent", "export", "openWorkspace", "entityChange"], [4, "ngIf"], [3, "feature"]], template: function SpatialFilterToolComponent_Template(rf, ctx) { if (rf & 1) {
496
- i0.ɵɵelementStart(0, "igo-panel")(1, "igo-spatial-filter-type", 0);
497
- i0.ɵɵlistener("eventType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventType_1_listener($event) { return ctx.getOutputType($event); })("eventQueryType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventQueryType_1_listener($event) { return ctx.getOutputQueryType($event); })("zoneChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneChange_1_listener($event) { return ctx.onZoneChange($event); })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneWithBufferChange_1_listener($event) { return ctx.onZoneChange($event, true); })("bufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_bufferChange_1_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_measureUnitChange_1_listener($event) { return ctx.measureUnit = $event; });
498
- i0.ɵɵelementEnd();
499
- i0.ɵɵelementStart(2, "igo-spatial-filter-item", 1);
500
- i0.ɵɵlistener("radiusEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_radiusEvent_2_listener($event) { return ctx.buffer = $event; })("bufferEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_bufferEvent_2_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_measureUnitChange_2_listener($event) { return ctx.measureUnit = $event; })("freehandControl", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_freehandControl_2_listener($event) { return ctx.freehandDrawIsActive = $event; })("drawZoneEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_drawZoneEvent_2_listener($event) { return ctx.zone = $event; })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_zoneWithBufferChange_2_listener($event) { return ctx.onZoneChange($event, true); })("itemTypeChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_itemTypeChange_2_listener($event) { return ctx.itemType = $event; })("thematicChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_thematicChange_2_listener($event) { return ctx.thematics = $event; })("toggleSearch", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_toggleSearch_2_listener() { return ctx.getOutputToggleSearch(); })("clearButtonEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearButtonEvent_2_listener() { return ctx.clearMap(); })("clearSearchEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearSearchEvent_2_listener() { return ctx.getOutputClearSearch(); })("export", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_export_2_listener() { return ctx.activateExportTool(); })("openWorkspace", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_openWorkspace_2_listener() { return ctx.activateWorkspace(); })("entityChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_entityChange_2_listener($event) { return ctx.activateWorkspace($event); });
501
- i0.ɵɵelementEnd()();
502
- i0.ɵɵelementStart(3, "igo-panel");
503
- i0.ɵɵtemplate(4, SpatialFilterToolComponent_ng_container_4_Template, 2, 1, "ng-container", 2);
504
- i0.ɵɵpipe(5, "async");
505
- i0.ɵɵelementEnd();
506
- } if (rf & 2) {
507
- i0.ɵɵadvance(1);
508
- i0.ɵɵproperty("store", ctx.spatialListStore)("selectedQueryType", ctx.queryType)("zone", ctx.zone)("layers", ctx.activeLayers);
509
- i0.ɵɵadvance(1);
510
- i0.ɵɵproperty("type", ctx.type)("queryType", ctx.queryType)("map", ctx.map)("zone", ctx.zone)("loading", ctx.loading)("store", ctx.store)("layers", ctx.activeLayers)("allLayers", ctx.layers)("thematicLength", ctx.thematicLength);
511
- i0.ɵɵadvance(2);
512
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(5, 14, ctx.selectedFeature$));
513
- } }, dependencies: [i2.SpatialFilterTypeComponent, i2.SpatialFilterItemComponent, i8.NgIf, i8.AsyncPipe], changeDetection: 0 });
514
- SpatialFilterToolComponent = __decorate([
515
- ToolComponent({
516
- name: 'spatialFilter',
517
- title: 'igo.integration.tools.spatialFilter',
518
- icon: 'selection-marker'
519
- })
520
- /**
521
- * Spatial Filter Type
522
- */
523
- ], SpatialFilterToolComponent);
524
- export { SpatialFilterToolComponent };
525
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpatialFilterToolComponent, [{
526
- type: Component,
527
- args: [{ selector: 'igo-spatial-filter-tool', changeDetection: ChangeDetectionStrategy.OnPush, template: "<igo-panel>\r\n <igo-spatial-filter-type\r\n [store]=\"spatialListStore\"\r\n [selectedQueryType]=\"queryType\"\r\n [zone]=\"zone\"\r\n [layers]=\"activeLayers\"\r\n (eventType)=\"getOutputType($event)\"\r\n (eventQueryType)=\"getOutputQueryType($event)\"\r\n (zoneChange)=\"onZoneChange($event)\"\r\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\r\n (bufferChange)=\"buffer = $event\"\r\n (measureUnitChange)=\"measureUnit = $event\">\r\n </igo-spatial-filter-type>\r\n\r\n <igo-spatial-filter-item\r\n [type]=\"type\"\r\n [queryType]=\"queryType\"\r\n [map]=\"map\"\r\n [zone]=\"zone\"\r\n [loading]=\"loading\"\r\n [store]=\"store\"\r\n [layers]=\"activeLayers\"\r\n [allLayers]=\"layers\"\r\n [thematicLength]=\"thematicLength\"\r\n (radiusEvent)=\"buffer = $event\"\r\n (bufferEvent)=\"buffer = $event\"\r\n (measureUnitChange)=\"measureUnit = $event\"\r\n (freehandControl)=\"freehandDrawIsActive = $event\"\r\n (drawZoneEvent)=\"zone = $event\"\r\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\r\n (itemTypeChange)=\"itemType = $event\"\r\n (thematicChange)=\"thematics = $event\"\r\n (toggleSearch)=\"getOutputToggleSearch()\"\r\n (clearButtonEvent)=\"clearMap()\"\r\n (clearSearchEvent)=\"getOutputClearSearch()\"\r\n (export)=\"activateExportTool()\"\r\n (openWorkspace)=\"activateWorkspace()\"\r\n (entityChange)=\"activateWorkspace($event)\">\r\n </igo-spatial-filter-item>\r\n</igo-panel>\r\n\r\n<igo-panel>\r\n <ng-container *ngIf=\"selectedFeature$ | async as feature\">\r\n <igo-feature-details [feature]=\"feature\"></igo-feature-details>\r\n </ng-container>\r\n</igo-panel>" }]
528
- }], function () { return [{ type: i1.MatIconRegistry }, { type: i2.SpatialFilterService }, { type: i2.DataSourceService }, { type: i2.LayerService }, { type: i3.MapState }, { type: i4.MessageService }, { type: i4.LanguageService }, { type: i5.ImportExportState }, { type: i6.ToolState }, { type: i7.WorkspaceState }, { type: i0.ChangeDetectorRef }]; }, { type: [{
529
- type: Input
530
- }], itemType: [{
531
- type: Input
532
- }], freehandDrawIsActive: [{
533
- type: Input
534
- }] }); })();
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFjLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsV0FBVyxFQUlYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFLckIsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUNsQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoRyxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7SUNPbEMsNkJBQTBEO0lBQ3hELHlDQUErRDtJQUNqRSwwQkFBZTs7O0lBRFEsZUFBbUI7SUFBbkIsb0NBQW1C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dEM7U0EzaEJZLDBCQUEwQjt1RkFBMUIsMEJBQTBCO2NBTnRDLFNBQVM7MkJBQ0UseUJBQXlCLG1CQUdsQix1QkFBdUIsQ0FBQyxNQUFNO3VXQU90QyxJQUFJO2tCQUFaLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csb0JBQW9CO2tCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIElnb01hcCxcclxuICBEYXRhU291cmNlU2VydmljZSxcclxuICBMYXllclNlcnZpY2UsXHJcbiAgRmVhdHVyZSxcclxuICBtb3ZlVG9PbEZlYXR1cmVzLFxyXG4gIEZlYXR1cmVNb3Rpb24sXHJcbiAgQ2x1c3RlckRhdGFTb3VyY2UsXHJcbiAgZmVhdHVyZVRvT2wsXHJcbiAgRGF0YVNvdXJjZSxcclxuICBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyxcclxuICBTcGF0aWFsRmlsdGVyU2VydmljZSxcclxuICBTcGF0aWFsRmlsdGVyVHlwZSxcclxuICBTcGF0aWFsRmlsdGVySXRlbVR5cGUsXHJcbiAgU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZSxcclxuICBTcGF0aWFsRmlsdGVyVGhlbWF0aWMsXHJcbiAgTGF5ZXIsXHJcbiAgVmVjdG9yTGF5ZXIsXHJcbiAgY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlLFxyXG4gIEV4cG9ydE9wdGlvbnMsXHJcbiAgTWVhc3VyZUxlbmd0aFVuaXRcclxufSBmcm9tICdAaWdvMi9nZW8nO1xyXG5pbXBvcnQgeyBFbnRpdHlTdG9yZSwgVG9vbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XHJcbmltcG9ydCBvbEZvcm1hdEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xyXG5pbXBvcnQgb2xTb3VyY2VWZWN0b3IgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCBvbFNvdXJjZUNsdXN0ZXIgZnJvbSAnb2wvc291cmNlL0NsdXN0ZXInO1xyXG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWFwU3RhdGUgfSBmcm9tICcuLi8uLi9tYXAvbWFwLnN0YXRlJztcclxuaW1wb3J0IHsgSW1wb3J0RXhwb3J0TW9kZSwgSW1wb3J0RXhwb3J0U3RhdGUgfSBmcm9tICcuLy4uLy4uL2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5zdGF0ZSc7XHJcbmltcG9ydCAqIGFzIG9sc3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XHJcbmltcG9ydCB7IFRvb2xTdGF0ZSB9IGZyb20gJy4uLy4uL3Rvb2wvdG9vbC5zdGF0ZSc7XHJcbmltcG9ydCB7IFdvcmtzcGFjZVN0YXRlIH0gZnJvbSAnLi4vLi4vd29ya3NwYWNlL3dvcmtzcGFjZS5zdGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XHJcblxyXG4vKipcclxuICogVG9vbCB0byBhcHBseSBzcGF0aWFsIGZpbHRlclxyXG4gKi9cclxuQFRvb2xDb21wb25lbnQoe1xyXG4gIG5hbWU6ICdzcGF0aWFsRmlsdGVyJyxcclxuICB0aXRsZTogJ2lnby5pbnRlZ3JhdGlvbi50b29scy5zcGF0aWFsRmlsdGVyJyxcclxuICBpY29uOiAnc2VsZWN0aW9uLW1hcmtlcidcclxufSlcclxuLyoqXHJcbiAqIFNwYXRpYWwgRmlsdGVyIFR5cGVcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWdvLXNwYXRpYWwtZmlsdGVyLXRvb2wnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwYXRpYWxGaWx0ZXJUb29sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcclxuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xyXG4gIEBJbnB1dCgpIGl0ZW1UeXBlOiBTcGF0aWFsRmlsdGVySXRlbVR5cGUgPSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcztcclxuICBASW5wdXQoKSBmcmVlaGFuZERyYXdJc0FjdGl2ZTogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIGxheWVyczogTGF5ZXJbXSA9IFtdO1xyXG4gIHB1YmxpYyBhY3RpdmVMYXllcnM6IExheWVyW10gPSBbXTtcclxuXHJcbiAgcHVibGljIHF1ZXJ5VHlwZTogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZTtcclxuICBwdWJsaWMgdGhlbWF0aWNzOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXTtcclxuICBwdWJsaWMgem9uZTogRmVhdHVyZTtcclxuICBwdWJsaWMgem9uZVdpdGhCdWZmZXI6IEZlYXR1cmU7XHJcbiAgcHVibGljIGJ1ZmZlciA9IDA7XHJcblxyXG4gIHB1YmxpYyBpdGVyYXRvciA9IDE7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmUkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxyXG4gICAgdW5kZWZpbmVkXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXQgPSBuZXcgb2xGb3JtYXRHZW9KU09OKCk7XHJcblxyXG4gIHB1YmxpYyBzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pOyAvLyBTdG9yZSB0byBwcmludCByZXN1bHRzIGF0IHRoZSBlbmRcclxuXHJcbiAgcHVibGljIHNwYXRpYWxMaXN0U3RvcmU6IEVudGl0eVN0b3JlPEZlYXR1cmU+ID0gbmV3IEVudGl0eVN0b3JlPEZlYXR1cmU+KFtdKTtcclxuXHJcbiAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHRoZW1hdGljTGVuZ3RoID0gMDtcclxuXHJcbiAgcHVibGljIG1lYXN1cmVVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycztcclxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgbW92ZWVuZEtleTogRXZlbnRzS2V5O1xyXG5cclxuICBwdWJsaWMgZGVmYXVsdFN0eWxlOiBvbHN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbHN0eWxlLlN0eWxlKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1hdEljb25SZWdpc3RyeTogTWF0SWNvblJlZ2lzdHJ5LFxyXG4gICAgcHJpdmF0ZSBzcGF0aWFsRmlsdGVyU2VydmljZTogU3BhdGlhbEZpbHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGFTb3VyY2VTZXJ2aWNlOiBEYXRhU291cmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1hcFN0YXRlOiBNYXBTdGF0ZSxcclxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgaW1wb3J0RXhwb3J0U3RhdGU6IEltcG9ydEV4cG9ydFN0YXRlLFxyXG4gICAgcHJpdmF0ZSB0b29sU3RhdGU6IFRvb2xTdGF0ZSxcclxuICAgIHByaXZhdGUgd29ya3NwYWNlU3RhdGU6IFdvcmtzcGFjZVN0YXRlLFxyXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLm1hcC5sYXllcnMpIHtcclxuICAgICAgaWYgKGxheWVyLnRpdGxlICYmIGxheWVyLnRpdGxlLmluY2x1ZGVzKHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcicpKSkge1xyXG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRPdXRwdXRUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyVHlwZSkge1xyXG4gICAgdGhpcy50eXBlID0gZXZlbnQ7XHJcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldE91dHB1dFF1ZXJ5VHlwZShldmVudDogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZSkge1xyXG4gICAgdGhpcy5xdWVyeVR5cGUgPSBldmVudDtcclxuICAgIGlmICh0aGlzLnF1ZXJ5VHlwZSkge1xyXG4gICAgICB0aGlzLmxvYWRGaWx0ZXJMaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZUV4cG9ydFRvb2woKSB7XHJcbiAgICBjb25zdCBpZHMgPSBbXTtcclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXlpvbmUgXFxcXGQrJyk7XHJcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgIGlmICghbGF5ZXIudGl0bGUubWF0Y2gocmUpKSB7XHJcbiAgICAgICAgaWRzLnB1c2gobGF5ZXIuaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmltcG9ydEV4cG9ydFN0YXRlLnNldE1vZGUoSW1wb3J0RXhwb3J0TW9kZS5leHBvcnQpO1xyXG4gICAgdGhpcy5pbXBvcnRFeHBvcnRTdGF0ZS5zZXRzRXhwb3J0T3B0aW9ucyh7IGxheWVyczogaWRzIH0gYXMgRXhwb3J0T3B0aW9ucyk7XHJcbiAgICB0aGlzLnRvb2xTdGF0ZS50b29sYm94LmFjdGl2YXRlVG9vbCgnaW1wb3J0RXhwb3J0Jyk7XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZVdvcmtzcGFjZShyZWNvcmQ/KSB7XHJcbiAgICBsZXQgbGF5ZXJUb09wZW5Xa3M7XHJcbiAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmVudGl0aWVzJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICghcmVjb3JkICYmIHRoaXMuYWN0aXZlTGF5ZXJzLmxlbmd0aCAmJiB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmFsbCgpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtVHlwZSA9PT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMudGhlbWF0aWNzKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGVtYXRpYy56ZXJvUmVzdWx0cykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXJUb09wZW5Xa3MgPSB0aGlzLmFjdGl2ZUxheWVycy5maW5kKGxheWVyID0+IGxheWVyLnRpdGxlLmluY2x1ZGVzKHRoZW1hdGljLm5hbWUgKyAnICcgKyB0aGlzLml0ZXJhdG9yLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9ICdBZHJlc3NlcyAnICsgdGhpcy5pdGVyYXRvci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChsYXllci50aXRsZS5pbmNsdWRlcyh0aXRsZSkpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyVG9PcGVuV2tzID0gbGF5ZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsYXllclRvT3Blbldrcykge1xyXG4gICAgICAgICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS53b3Jrc3BhY2VQYW5lbEV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc2V0QWN0aXZlV29ya3NwYWNlQnlJZChsYXllclRvT3Blbldrcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlY29yZCAmJiB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiYgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RXb3Jrc3BhY2VFbnRpdHkocmVjb3JkKTtcclxuICAgICAgICB0aGlzLm1vdmVlbmRLZXkgPSB0aGlzLm1hcC5vbC5vbignbW92ZWVuZCcsICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RXb3Jrc3BhY2VFbnRpdHkocmVjb3JkKSB7XHJcbiAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmFsbCgpLmZvckVhY2god29ya3NwYWNlID0+IHtcclxuICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7c2VsZWN0ZWQ6IGZhbHNlfSk7XHJcbiAgICAgIGlmICh3b3Jrc3BhY2UudGl0bGUuaW5jbHVkZXMocmVjb3JkLmFkZGVkWzBdLm1ldGEudGl0bGUpKSB7XHJcbiAgICAgICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zZXRBY3RpdmVXb3Jrc3BhY2VCeUlkKHdvcmtzcGFjZS5pZCk7XHJcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZU1hbnkocmVjb3JkLmFkZGVkLCB7c2VsZWN0ZWQ6IHRydWV9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRGaWx0ZXJMaXN0KCkge1xyXG4gICAgdGhpcy5zcGF0aWFsRmlsdGVyU2VydmljZVxyXG4gICAgICAubG9hZEZpbHRlckxpc3QodGhpcy5xdWVyeVR5cGUpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IHtcclxuICAgICAgICBmZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5wcm9wZXJ0aWVzLm5vbSA8IGIucHJvcGVydGllcy5ub20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGEucHJvcGVydGllcy5ub20gPiBiLnByb3BlcnRpZXMubm9tKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zcGF0aWFsTGlzdFN0b3JlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zcGF0aWFsTGlzdFN0b3JlLmxvYWQoZmVhdHVyZXMpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldE91dHB1dFRvZ2dsZVNlYXJjaCgpIHtcclxuICAgIHRoaXMubG9hZFRoZW1hdGljcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3V0cHV0Q2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnpvbmUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNsZWFyTWFwKCkge1xyXG4gICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXJzKHRoaXMubGF5ZXJzKTtcclxuICAgIHRoaXMubGF5ZXJzID0gW107XHJcbiAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xyXG4gICAgdGhpcy50aGVtYXRpY0xlbmd0aCA9IDA7XHJcbiAgICB0aGlzLml0ZXJhdG9yID0gMTtcclxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcclxuICAgICAgdGhpcy56b25lID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFRoZW1hdGljcygpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBsZXQgemVyb1Jlc3VsdHMgPSB0cnVlO1xyXG4gICAgbGV0IHRoZW1hdGljcztcclxuICAgIGlmICh0aGlzLmJ1ZmZlciA9PT0gMCB8fCB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XHJcbiAgICAgIHRoaXMudHJ5QWRkRmVhdHVyZXNUb01hcChbdGhpcy56b25lXSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pdGVtVHlwZSAhPT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcykge1xyXG4gICAgICBjb25zdCB0aGVtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xyXG4gICAgICAgIG5hbWU6ICcnXHJcbiAgICAgIH07XHJcbiAgICAgIHRoZW1hdGljcyA9IFt0aGVtZV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGVtYXRpY3MgPSB0aGlzLnRoZW1hdGljcztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmIHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcclxuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciAqIDEwMDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2x5Z29uKSB7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gMDsgLy8gdG8gYXZvaWQgYnVmZmVyIGVudGVyIGEgc2Vjb25kIHRpbWUgaW4gdGVyckFQSVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9ic2VydmFibGVzJDogT2JzZXJ2YWJsZTxGZWF0dXJlW10+W10gPSBbXTtcclxuICAgIHRoZW1hdGljcy5mb3JFYWNoKHRoZW1hdGljID0+IHtcclxuICAgICAgb2JzZXJ2YWJsZXMkLnB1c2goXHJcbiAgICAgICAgdGhpcy5zcGF0aWFsRmlsdGVyU2VydmljZVxyXG4gICAgICAgICAgLmxvYWRGaWx0ZXJJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLnpvbmUsXHJcbiAgICAgICAgICAgIHRoaXMuaXRlbVR5cGUsXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlLFxyXG4gICAgICAgICAgICB0aGVtYXRpYyxcclxuICAgICAgICAgICAgdGhpcy5idWZmZXJcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3JlLmluc2VydE1hbnkoZmVhdHVyZXMpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzUG9pbnQ6IEZlYXR1cmVbXSA9IFtdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzTGluZVBvbHk6IEZlYXR1cmVbXSA9IFtdO1xyXG4gICAgICAgICAgICAgIGxldCBpZFBvaW50O1xyXG4gICAgICAgICAgICAgIGxldCBpZExpbmVQb2x5O1xyXG4gICAgICAgICAgICAgIGZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5sb25naXR1ZGUgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMubGF0aXR1ZGUgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdO1xyXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlc1BvaW50LnB1c2goZmVhdHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlkUG9pbnQgPSBmZWF0dXJlLm1ldGEuaWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlc0xpbmVQb2x5LnB1c2goZmVhdHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlkTGluZVBvbHkgPSBmZWF0dXJlLm1ldGEuaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudHJ5QWRkUG9pbnRUb01hcChmZWF0dXJlc1BvaW50LCBpZFBvaW50KTtcclxuICAgICAgICAgICAgICB0aGlzLnRyeUFkZExheWVyVG9NYXAoZmVhdHVyZXNMaW5lUG9seSwgaWRMaW5lUG9seSk7XHJcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgemVyb1Jlc3VsdHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGhlbWF0aWNMZW5ndGggKz0gMTtcclxuICAgICAgICAgICAgICAgIHRoZW1hdGljLnplcm9SZXN1bHRzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhlbWF0aWMuemVyb1Jlc3VsdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA+PSAxMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcclxuICAgICAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5tYXhTaXplQWxlcnQnLFxyXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnLFxyXG4gICAgICAgICAgICAgICAgICB7IHRpbWVPdXQ6IDEwMDAwIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMkKS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAoemVyb1Jlc3VsdHMpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxyXG4gICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci56ZXJvUmVzdWx0cycsXHJcbiAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnLFxyXG4gICAgICAgICAgeyB0aW1lT3V0OiAxMDAwMCB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblpvbmVDaGFuZ2UoZmVhdHVyZTogRmVhdHVyZSwgYnVmZmVyPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy56b25lID0gZmVhdHVyZTtcclxuICAgIGlmIChmZWF0dXJlKSB7XHJcbiAgICAgIGJ1ZmZlciA/IHRoaXMudHJ5QWRkRmVhdHVyZXNUb01hcChbZmVhdHVyZV0sIHRydWUpIDogdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFtmZWF0dXJlXSk7XHJcbiAgICAgIHRoaXMuem9vbVRvRmVhdHVyZUV4dGVudChmZWF0dXJlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyeSB0byBhZGQgem9uZSBmZWF0dXJlIHRvIHRoZSBtYXAgb3ZlcmxheVxyXG4gICAqL1xyXG4gIHB1YmxpYyB0cnlBZGRGZWF0dXJlc1RvTWFwKGZlYXR1cmVzOiBGZWF0dXJlW10sIGJ1ZmZlcj86IGJvb2xlYW4pIHtcclxuICAgIGxldCBpID0gMTtcclxuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBsYXllci5vcHRpb25zLl9pbnRlcm5hbCAmJlxyXG4gICAgICAgICAgICBsYXllci5vcHRpb25zLl9pbnRlcm5hbC5jb2RlID09PSBmZWF0dXJlLnByb3BlcnRpZXMuY29kZSAmJlxyXG4gICAgICAgICAgICAhYnVmZmVyXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKCFsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcclxuICAgICAgICAgICAgICB0aGlzLmxheWVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XHJcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKGxheWVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGJ1ZmZlcikge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmFjdGl2ZUxheWVycykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoID09PSAxICYmIGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcclxuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmluZGV4T2YobGF5ZXIpO1xyXG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGVmYXVsdFN0eWxlID0gKF9mZWF0dXJlLCByZXNvbHV0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSAoZmVhdHVyZXNbMF0gYXMgYW55KS5jb29yZGluYXRlcztcclxuICAgICAgICByZXR1cm4gbmV3IG9sc3R5bGUuU3R5bGUoe1xyXG4gICAgICAgICAgaW1hZ2U6IG5ldyBvbHN0eWxlLkNpcmNsZSh7XHJcbiAgICAgICAgICAgIHJhZGl1czogY29vcmRpbmF0ZXNcclxuICAgICAgICAgICAgICA/IHRoaXMuYnVmZmVyIC9cclxuICAgICAgICAgICAgICAgIE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIGNvb3JkaW5hdGVzWzFdKSAvXHJcbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXHJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGZpbGw6IG5ldyBvbHN0eWxlLkZpbGwoe1xyXG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgyMDAsIDIwMCwgMjAsIDAuMiknXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgY29sb3I6ICdvcmFuZ2UnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHN0cm9rZTogbmV3IG9sc3R5bGUuU3Ryb2tlKHtcclxuICAgICAgICAgICAgd2lkdGg6IDEsXHJcbiAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJ1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaWxsOiBuZXcgb2xzdHlsZS5GaWxsKHtcclxuICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDIwMCwgMjAwLCAyMCwgMC4yKSdcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlcnZpY2VcclxuICAgICAgICAuY3JlYXRlQXN5bmNEYXRhU291cmNlKHtcclxuICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxyXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlXHJcbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucylcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllcih7XHJcbiAgICAgICAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6ICgnWm9uZSAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xyXG4gICAgICAgICAgICApKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIHdvcmtzcGFjZTogeyBlbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIF9pbnRlcm5hbDoge1xyXG4gICAgICAgICAgICAgIGNvZGU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgPyBmZWF0dXJlLnByb3BlcnRpZXMuY29kZVxyXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgICAgIH0pIGFzIFZlY3RvckxheWVyO1xyXG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGYsIHRoaXMubWFwLnByb2plY3Rpb24pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAodGhpcy50eXBlICE9PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50ID8gJ0NlcmNsZScgOiAnUG9seWdvbmUnO1xyXG4gICAgICAgICAgICBmZWF0dXJlc09sWzBdLnNldCgnbm9tJywgJ1pvbmUnLCB0cnVlKTtcclxuICAgICAgICAgICAgZmVhdHVyZXNPbFswXS5zZXQoJ3R5cGUnLCB0eXBlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IG9sID0gZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZVZlY3RvcjxPbEdlb21ldHJ5PiB8IG9sU291cmNlQ2x1c3RlcjtcclxuICAgICAgICAgIG9sLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xyXG4gICAgICAgICAgb2xMYXllci5vbC5zZXRTdHlsZSh0aGlzLmRlZmF1bHRTdHlsZSk7XHJcbiAgICAgICAgICB0aGlzLm1hcC5hZGRMYXllcihvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycy5wdXNoKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcnkgdG8gYWRkIHBvaW50IGZlYXR1cmVzIHRvIHRoZSBtYXBcclxuICAgKiBOZWNlc3NhcnkgdG8gY3JlYXRlIGNsdXN0ZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cnlBZGRQb2ludFRvTWFwKGZlYXR1cmVzOiBGZWF0dXJlW10sIGlkKSB7XHJcbiAgICBsZXQgaSA9IDE7XHJcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLm1hcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSkpIHtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYXRhU291cmNlU2VydmljZVxyXG4gICAgICAgIC5jcmVhdGVBc3luY0RhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgdHlwZTogJ2NsdXN0ZXInLFxyXG4gICAgICAgICAgaWQsXHJcbiAgICAgICAgICBxdWVyeWFibGU6IHRydWUsXHJcbiAgICAgICAgICBkaXN0YW5jZTogMTIwLFxyXG4gICAgICAgICAgbWV0YToge1xyXG4gICAgICAgICAgICB0aXRsZTogJ0NsdXN0ZXInXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucylcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2U6IENsdXN0ZXJEYXRhU291cmNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpY29uID0gZmVhdHVyZXNbMF0ubWV0YS5pY29uO1xyXG4gICAgICAgICAgbGV0IHN0eWxlOiBvbHN0eWxlLlN0eWxlO1xyXG4gICAgICAgICAgaWYgKCFpY29uKSB7XHJcbiAgICAgICAgICAgIHN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdHlsZSA9IHRoaXMuY3JlYXRlU3ZnSWNvbihpY29uKSB8fCBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBvbExheWVyID0gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXIoe1xyXG4gICAgICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcclxuICAgICAgICAgICAgKSkgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgICAgIHN0eWxlXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKGZlYXR1cmUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZVRvT2woZmVhdHVyZSwgdGhpcy5tYXAucHJvamVjdGlvbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IG9sID0gZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZUNsdXN0ZXI7XHJcbiAgICAgICAgICBvbC5nZXRTb3VyY2UoKS5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcclxuICAgICAgICAgIGlmICh0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihcclxuICAgICAgICAgICAgICB0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpID0gaSAtIDE7XHJcbiAgICAgICAgICAgIG9sTGF5ZXIudGl0bGUgPSAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcclxuICAgICAgICAgICAgKSkgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBvbExheWVyLm9wdGlvbnMudGl0bGUgPSBvbExheWVyLnRpdGxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGk7XHJcbiAgICAgICAgICB0aGlzLm1hcC5hZGRMYXllcihvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLnB1c2hMYXllcihvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdmdJY29uKGljb24pOiBvbHN0eWxlLlN0eWxlIHtcclxuICAgIGxldCBzdHlsZTogb2xzdHlsZS5TdHlsZTtcclxuICAgIHRoaXMubWF0SWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihpY29uKS5zdWJzY3JpYmUoc3ZnT2JqID0+IHtcclxuICAgICAgY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XHJcbiAgICAgIHN2Z09iai5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzMwJyk7XHJcbiAgICAgIHN2Z09iai5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICczMCcpO1xyXG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdmaWxsJywgJ3JnYmEoMCwgMTI4LCAyNTUpJyk7XHJcbiAgICAgIHN2Z09iai5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICd3aGl0ZScpO1xyXG4gICAgICBjb25zdCBzdmcgPSB4bWxTZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Z09iaik7XHJcbiAgICAgIHN0eWxlID0gbmV3IG9sc3R5bGUuU3R5bGUoe1xyXG4gICAgICAgIGltYWdlOiBuZXcgb2xzdHlsZS5JY29uKHtcclxuICAgICAgICAgIHNyYzogJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCcgKyBzdmdcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN0eWxlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUcnkgdG8gYWRkIGxpbmUgb3IgcG9seWdvbiBmZWF0dXJlcyB0byB0aGUgbWFwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cnlBZGRMYXllclRvTWFwKGZlYXR1cmVzOiBGZWF0dXJlW10sIGlkKSB7XHJcbiAgICBsZXQgaSA9IDE7XHJcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0aGlzLm1hcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSkpIHtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYXRhU291cmNlU2VydmljZVxyXG4gICAgICAgIC5jcmVhdGVBc3luY0RhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgdHlwZTogJ3ZlY3RvcicsXHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZVxyXG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlOiBEYXRhU291cmNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvbExheWVyID0gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXIoe1xyXG4gICAgICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcclxuICAgICAgICAgICAgKSkgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmZWF0dXJlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGZlYXR1cmUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VWZWN0b3I8T2xHZW9tZXRyeT47XHJcbiAgICAgICAgICBvbC5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcclxuICAgICAgICAgIGlmICh0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihcclxuICAgICAgICAgICAgICB0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpID0gaSAtIDE7XHJcbiAgICAgICAgICAgIG9sTGF5ZXIudGl0bGUgPSAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcclxuICAgICAgICAgICAgKSkgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBvbExheWVyLm9wdGlvbnMudGl0bGUgPSBvbExheWVyLnRpdGxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5wdXNoTGF5ZXIob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHpvb21Ub0ZlYXR1cmVFeHRlbnQoZmVhdHVyZSkge1xyXG4gICAgaWYgKGZlYXR1cmUpIHtcclxuICAgICAgY29uc3Qgb2xGZWF0dXJlID0gdGhpcy5mb3JtYXQucmVhZEZlYXR1cmUoZmVhdHVyZSwge1xyXG4gICAgICAgIGRhdGFQcm9qZWN0aW9uOiBmZWF0dXJlLnByb2plY3Rpb24sXHJcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb25cclxuICAgICAgfSk7XHJcbiAgICAgIG1vdmVUb09sRmVhdHVyZXModGhpcy5tYXAsIFtvbEZlYXR1cmVdLCBGZWF0dXJlTW90aW9uLlpvb20pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVzaExheWVyKGxheWVyKSB7XHJcbiAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmFjdGl2ZUxheWVycykge1xyXG4gICAgICBpZiAobGF5LmlkID09PSBsYXllci5pZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aXZlTGF5ZXJzLnB1c2gobGF5ZXIpO1xyXG4gIH1cclxufVxyXG4iLCI8aWdvLXBhbmVsPlxyXG4gIDxpZ28tc3BhdGlhbC1maWx0ZXItdHlwZVxyXG4gICAgW3N0b3JlXT1cInNwYXRpYWxMaXN0U3RvcmVcIlxyXG4gICAgW3NlbGVjdGVkUXVlcnlUeXBlXT1cInF1ZXJ5VHlwZVwiXHJcbiAgICBbem9uZV09XCJ6b25lXCJcclxuICAgIFtsYXllcnNdPVwiYWN0aXZlTGF5ZXJzXCJcclxuICAgIChldmVudFR5cGUpPVwiZ2V0T3V0cHV0VHlwZSgkZXZlbnQpXCJcclxuICAgIChldmVudFF1ZXJ5VHlwZSk9XCJnZXRPdXRwdXRRdWVyeVR5cGUoJGV2ZW50KVwiXHJcbiAgICAoem9uZUNoYW5nZSk9XCJvblpvbmVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAoem9uZVdpdGhCdWZmZXJDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgKGJ1ZmZlckNoYW5nZSk9XCJidWZmZXIgPSAkZXZlbnRcIlxyXG4gICAgKG1lYXN1cmVVbml0Q2hhbmdlKT1cIm1lYXN1cmVVbml0ID0gJGV2ZW50XCI+XHJcbiAgPC9pZ28tc3BhdGlhbC1maWx0ZXItdHlwZT5cclxuXHJcbiAgPGlnby1zcGF0aWFsLWZpbHRlci1pdGVtXHJcbiAgICBbdHlwZV09XCJ0eXBlXCJcclxuICAgIFtxdWVyeVR5cGVdPVwicXVlcnlUeXBlXCJcclxuICAgIFttYXBdPVwibWFwXCJcclxuICAgIFt6b25lXT1cInpvbmVcIlxyXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICBbc3RvcmVdPVwic3RvcmVcIlxyXG4gICAgW2xheWVyc109XCJhY3RpdmVMYXllcnNcIlxyXG4gICAgW2FsbExheWVyc109XCJsYXllcnNcIlxyXG4gICAgW3RoZW1hdGljTGVuZ3RoXT1cInRoZW1hdGljTGVuZ3RoXCJcclxuICAgIChyYWRpdXNFdmVudCk9XCJidWZmZXIgPSAkZXZlbnRcIlxyXG4gICAgKGJ1ZmZlckV2ZW50KT1cImJ1ZmZlciA9ICRldmVudFwiXHJcbiAgICAobWVhc3VyZVVuaXRDaGFuZ2UpPVwibWVhc3VyZVVuaXQgPSAkZXZlbnRcIlxyXG4gICAgKGZyZWVoYW5kQ29udHJvbCk9XCJmcmVlaGFuZERyYXdJc0FjdGl2ZSA9ICRldmVudFwiXHJcbiAgICAoZHJhd1pvbmVFdmVudCk9XCJ6b25lID0gJGV2ZW50XCJcclxuICAgICh6b25lV2l0aEJ1ZmZlckNoYW5nZSk9XCJvblpvbmVDaGFuZ2UoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAoaXRlbVR5cGVDaGFuZ2UpPVwiaXRlbVR5cGUgPSAkZXZlbnRcIlxyXG4gICAgKHRoZW1hdGljQ2hhbmdlKT1cInRoZW1hdGljcyA9ICRldmVudFwiXHJcbiAgICAodG9nZ2xlU2VhcmNoKT1cImdldE91dHB1dFRvZ2dsZVNlYXJjaCgpXCJcclxuICAgIChjbGVhckJ1dHRvbkV2ZW50KT1cImNsZWFyTWFwKClcIlxyXG4gICAgKGNsZWFyU2VhcmNoRXZlbnQpPVwiZ2V0T3V0cHV0Q2xlYXJTZWFyY2goKVwiXHJcbiAgICAoZXhwb3J0KT1cImFjdGl2YXRlRXhwb3J0VG9vbCgpXCJcclxuICAgIChvcGVuV29ya3NwYWNlKT1cImFjdGl2YXRlV29ya3NwYWNlKClcIlxyXG4gICAgKGVudGl0eUNoYW5nZSk9XCJhY3RpdmF0ZVdvcmtzcGFjZSgkZXZlbnQpXCI+XHJcbiAgPC9pZ28tc3BhdGlhbC1maWx0ZXItaXRlbT5cclxuPC9pZ28tcGFuZWw+XHJcblxyXG48aWdvLXBhbmVsPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZlYXR1cmUkIHwgYXN5bmMgYXMgZmVhdHVyZVwiPlxyXG4gICAgPGlnby1mZWF0dXJlLWRldGFpbHMgW2ZlYXR1cmVdPVwiZmVhdHVyZVwiPjwvaWdvLWZlYXR1cmUtZGV0YWlscz5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9pZ28tcGFuZWw+Il19
1
+ import { __decorate } from "tslib";
2
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
3
+ import { forkJoin, Subject } from 'rxjs';
4
+ import { tap, take, takeUntil } from 'rxjs/operators';
5
+ import { moveToOlFeatures, FeatureMotion, featureToOl, SpatialFilterType, SpatialFilterItemType, createOverlayMarkerStyle, MeasureLengthUnit } from '@igo2/geo';
6
+ import { EntityStore, ToolComponent } from '@igo2/common';
7
+ import olFormatGeoJSON from 'ol/format/GeoJSON';
8
+ import { BehaviorSubject } from 'rxjs';
9
+ import { ImportExportMode } from './../../import-export/import-export.state';
10
+ import * as olstyle from 'ol/style';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/material/icon";
13
+ import * as i2 from "@igo2/geo";
14
+ import * as i3 from "../../map/map.state";
15
+ import * as i4 from "@igo2/core";
16
+ import * as i5 from "./../../import-export/import-export.state";
17
+ import * as i6 from "../../tool/tool.state";
18
+ import * as i7 from "../../workspace/workspace.state";
19
+ import * as i8 from "@angular/common";
20
+ function SpatialFilterToolComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementContainerStart(0);
22
+ i0.ɵɵelement(1, "igo-feature-details", 3);
23
+ i0.ɵɵelementContainerEnd();
24
+ } if (rf & 2) {
25
+ const feature_r1 = ctx.ngIf;
26
+ i0.ɵɵadvance(1);
27
+ i0.ɵɵproperty("feature", feature_r1);
28
+ } }
29
+ /**
30
+ * Tool to apply spatial filter
31
+ */
32
+ let SpatialFilterToolComponent = class SpatialFilterToolComponent {
33
+ constructor(matIconRegistry, spatialFilterService, dataSourceService, layerService, mapState, messageService, languageService, importExportState, toolState, workspaceState, cdRef) {
34
+ this.matIconRegistry = matIconRegistry;
35
+ this.spatialFilterService = spatialFilterService;
36
+ this.dataSourceService = dataSourceService;
37
+ this.layerService = layerService;
38
+ this.mapState = mapState;
39
+ this.messageService = messageService;
40
+ this.languageService = languageService;
41
+ this.importExportState = importExportState;
42
+ this.toolState = toolState;
43
+ this.workspaceState = workspaceState;
44
+ this.cdRef = cdRef;
45
+ this.itemType = SpatialFilterItemType.Address;
46
+ this.layers = [];
47
+ this.activeLayers = [];
48
+ this.buffer = 0;
49
+ this.iterator = 1;
50
+ this.selectedFeature$ = new BehaviorSubject(undefined);
51
+ this.format = new olFormatGeoJSON();
52
+ this.store = new EntityStore([]); // Store to print results at the end
53
+ this.spatialListStore = new EntityStore([]);
54
+ this.loading = false;
55
+ this.thematicLength = 0;
56
+ this.measureUnit = MeasureLengthUnit.Meters;
57
+ this.unsubscribe$ = new Subject();
58
+ }
59
+ get map() {
60
+ return this.mapState.map;
61
+ }
62
+ ngOnInit() {
63
+ for (const layer of this.map.layers) {
64
+ if (layer.title && layer.title.includes(this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'))) {
65
+ this.layers.push(layer);
66
+ }
67
+ }
68
+ }
69
+ ngOnDestroy() {
70
+ this.unsubscribe$.next();
71
+ this.unsubscribe$.complete();
72
+ }
73
+ getOutputType(event) {
74
+ this.type = event;
75
+ this.queryType = undefined;
76
+ }
77
+ getOutputQueryType(event) {
78
+ this.queryType = event;
79
+ if (this.queryType) {
80
+ this.loadFilterList();
81
+ }
82
+ }
83
+ activateExportTool() {
84
+ const ids = [];
85
+ const re = new RegExp('^Zone \\d+');
86
+ for (const layer of this.layers) {
87
+ if (!layer.title.match(re)) {
88
+ ids.push(layer.id);
89
+ }
90
+ }
91
+ this.importExportState.setMode(ImportExportMode.export);
92
+ this.importExportState.setsExportOptions({ layers: ids });
93
+ this.toolState.toolbox.activateTool('importExport');
94
+ }
95
+ activateWorkspace(record) {
96
+ let layerToOpenWks;
97
+ this.workspaceState.store.entities$.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
98
+ if (!record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
99
+ if (this.itemType === SpatialFilterItemType.Thematics) {
100
+ for (const thematic of this.thematics) {
101
+ if (!thematic.zeroResults) {
102
+ layerToOpenWks = this.activeLayers.find(layer => layer.title.includes(thematic.name + ' ' + this.iterator.toString()));
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ else {
108
+ const title = 'Adresses ' + this.iterator.toString();
109
+ this.activeLayers.forEach((layer) => {
110
+ if (layer.title.includes(title)) {
111
+ layerToOpenWks = layer;
112
+ }
113
+ });
114
+ }
115
+ if (layerToOpenWks) {
116
+ this.workspaceState.workspacePanelExpanded = true;
117
+ this.workspaceState.setActiveWorkspaceById(layerToOpenWks.id);
118
+ }
119
+ }
120
+ else if (record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
121
+ this.selectWorkspaceEntity(record);
122
+ this.moveendKey = this.map.ol.on('moveend', () => {
123
+ this.selectWorkspaceEntity(record);
124
+ });
125
+ }
126
+ });
127
+ }
128
+ selectWorkspaceEntity(record) {
129
+ this.workspaceState.store.all().forEach(workspace => {
130
+ workspace.entityStore.state.updateAll({ selected: false });
131
+ if (workspace.title.includes(record.added[0].meta.title)) {
132
+ this.workspaceState.setActiveWorkspaceById(workspace.id);
133
+ workspace.entityStore.state.updateMany(record.added, { selected: true });
134
+ }
135
+ });
136
+ }
137
+ loadFilterList() {
138
+ this.spatialFilterService
139
+ .loadFilterList(this.queryType)
140
+ .pipe(takeUntil(this.unsubscribe$))
141
+ .subscribe((features) => {
142
+ features.sort((a, b) => {
143
+ if (a.properties.nom < b.properties.nom) {
144
+ return -1;
145
+ }
146
+ if (a.properties.nom > b.properties.nom) {
147
+ return 1;
148
+ }
149
+ return 0;
150
+ });
151
+ this.spatialListStore.clear();
152
+ this.spatialListStore.load(features);
153
+ });
154
+ }
155
+ getOutputToggleSearch() {
156
+ this.loadThematics();
157
+ }
158
+ getOutputClearSearch() {
159
+ this.zone = undefined;
160
+ this.queryType = undefined;
161
+ }
162
+ clearMap() {
163
+ this.map.removeLayers(this.layers);
164
+ this.layers = [];
165
+ this.activeLayers = [];
166
+ this.thematicLength = 0;
167
+ this.iterator = 1;
168
+ if (this.type === SpatialFilterType.Predefined) {
169
+ this.zone = undefined;
170
+ this.queryType = undefined;
171
+ }
172
+ }
173
+ loadThematics() {
174
+ this.loading = true;
175
+ let zeroResults = true;
176
+ let thematics;
177
+ if (this.buffer === 0 || this.type === SpatialFilterType.Point) {
178
+ this.tryAddFeaturesToMap([this.zone]);
179
+ }
180
+ if (this.itemType !== SpatialFilterItemType.Thematics) {
181
+ const theme = {
182
+ name: ''
183
+ };
184
+ thematics = [theme];
185
+ }
186
+ else {
187
+ thematics = this.thematics;
188
+ }
189
+ if (this.measureUnit === MeasureLengthUnit.Kilometers && this.type !== SpatialFilterType.Point) {
190
+ this.buffer = this.buffer * 1000;
191
+ }
192
+ if (this.type === SpatialFilterType.Polygon) {
193
+ this.buffer = 0; // to avoid buffer enter a second time in terrAPI
194
+ }
195
+ const observables$ = [];
196
+ thematics.forEach(thematic => {
197
+ observables$.push(this.spatialFilterService
198
+ .loadFilterItem(this.zone, this.itemType, this.queryType, thematic, this.buffer)
199
+ .pipe(tap((features) => {
200
+ this.store.insertMany(features);
201
+ const featuresPoint = [];
202
+ const featuresLinePoly = [];
203
+ let idPoint;
204
+ let idLinePoly;
205
+ features.forEach(feature => {
206
+ if (feature.geometry.type === 'Point') {
207
+ feature.properties.longitude = feature.geometry.coordinates[0];
208
+ feature.properties.latitude = feature.geometry.coordinates[1];
209
+ featuresPoint.push(feature);
210
+ idPoint = feature.meta.id;
211
+ }
212
+ else {
213
+ featuresLinePoly.push(feature);
214
+ idLinePoly = feature.meta.id;
215
+ }
216
+ });
217
+ this.tryAddPointToMap(featuresPoint, idPoint);
218
+ this.tryAddLayerToMap(featuresLinePoly, idLinePoly);
219
+ if (features.length) {
220
+ zeroResults = false;
221
+ this.thematicLength += 1;
222
+ thematic.zeroResults = false;
223
+ this.cdRef.detectChanges();
224
+ }
225
+ else {
226
+ thematic.zeroResults = true;
227
+ }
228
+ if (features.length >= 10000) {
229
+ this.messageService.alert('igo.geo.spatialFilter.maxSizeAlert', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
230
+ }
231
+ })));
232
+ });
233
+ forkJoin(observables$).pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
234
+ this.loading = false;
235
+ if (zeroResults) {
236
+ this.messageService.alert('igo.geo.spatialFilter.zeroResults', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
237
+ }
238
+ });
239
+ }
240
+ onZoneChange(feature, buffer) {
241
+ this.zone = feature;
242
+ if (feature) {
243
+ buffer ? this.tryAddFeaturesToMap([feature], true) : this.tryAddFeaturesToMap([feature]);
244
+ this.zoomToFeatureExtent(feature);
245
+ }
246
+ }
247
+ /**
248
+ * Try to add zone feature to the map overlay
249
+ */
250
+ tryAddFeaturesToMap(features, buffer) {
251
+ let i = 1;
252
+ for (const feature of features) {
253
+ if (this.type === SpatialFilterType.Predefined) {
254
+ for (const layer of this.layers) {
255
+ if (layer.options._internal &&
256
+ layer.options._internal.code === feature.properties.code &&
257
+ !buffer) {
258
+ if (!layer.title?.startsWith('Zone')) {
259
+ const index = this.layers.indexOf(layer);
260
+ this.layers.splice(index, 1);
261
+ }
262
+ return;
263
+ }
264
+ if (layer.title?.startsWith('Zone')) {
265
+ this.activeLayers = [];
266
+ const index = this.layers.indexOf(layer);
267
+ this.layers.splice(index, 1);
268
+ this.map.removeLayer(layer);
269
+ }
270
+ }
271
+ }
272
+ else {
273
+ if (buffer) {
274
+ for (const layer of this.activeLayers) {
275
+ if (this.activeLayers.length === 1 && layer.title?.startsWith('Zone')) {
276
+ const index = this.layers.indexOf(layer);
277
+ this.layers.splice(index, 1);
278
+ this.map.removeLayer(layer);
279
+ }
280
+ }
281
+ }
282
+ this.activeLayers = [];
283
+ }
284
+ for (const layer of this.layers) {
285
+ if (layer.title?.startsWith('Zone')) {
286
+ i++;
287
+ }
288
+ }
289
+ this.defaultStyle = (_feature, resolution) => {
290
+ const coordinates = features[0].coordinates;
291
+ return new olstyle.Style({
292
+ image: new olstyle.Circle({
293
+ radius: coordinates
294
+ ? this.buffer /
295
+ Math.cos((Math.PI / 180) * coordinates[1]) /
296
+ resolution
297
+ : undefined,
298
+ fill: new olstyle.Fill({
299
+ color: 'rgba(200, 200, 20, 0.2)'
300
+ }),
301
+ stroke: new olstyle.Stroke({
302
+ width: 1,
303
+ color: 'orange'
304
+ })
305
+ }),
306
+ stroke: new olstyle.Stroke({
307
+ width: 1,
308
+ color: 'orange'
309
+ }),
310
+ fill: new olstyle.Fill({
311
+ color: 'rgba(200, 200, 20, 0.2)'
312
+ })
313
+ });
314
+ };
315
+ this.dataSourceService
316
+ .createAsyncDataSource({
317
+ type: 'vector',
318
+ queryable: true
319
+ })
320
+ .pipe(take(1))
321
+ .subscribe((dataSource) => {
322
+ const olLayer = this.layerService.createLayer({
323
+ isIgoInternalLayer: true,
324
+ title: ('Zone ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
325
+ workspace: { enabled: true },
326
+ _internal: {
327
+ code: this.type === SpatialFilterType.Predefined
328
+ ? feature.properties.code
329
+ : undefined
330
+ },
331
+ source: dataSource,
332
+ visible: true
333
+ });
334
+ const featuresOl = features.map(f => {
335
+ return featureToOl(f, this.map.projection);
336
+ });
337
+ if (this.type !== SpatialFilterType.Predefined) {
338
+ const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
339
+ featuresOl[0].set('nom', 'Zone', true);
340
+ featuresOl[0].set('type', type, true);
341
+ }
342
+ const ol = dataSource.ol;
343
+ ol.addFeatures(featuresOl);
344
+ olLayer.ol.setStyle(this.defaultStyle);
345
+ this.map.addLayer(olLayer);
346
+ this.layers.push(olLayer);
347
+ this.activeLayers.push(olLayer);
348
+ this.cdRef.detectChanges();
349
+ });
350
+ }
351
+ }
352
+ /**
353
+ * Try to add point features to the map
354
+ * Necessary to create clusters
355
+ */
356
+ tryAddPointToMap(features, id) {
357
+ let i = 1;
358
+ if (features.length) {
359
+ if (this.map === undefined) {
360
+ return;
361
+ }
362
+ for (const layer of this.layers) {
363
+ if (layer.title?.startsWith(features[0].meta.title)) {
364
+ i++;
365
+ }
366
+ }
367
+ this.dataSourceService
368
+ .createAsyncDataSource({
369
+ type: 'cluster',
370
+ id,
371
+ queryable: true,
372
+ distance: 120,
373
+ meta: {
374
+ title: 'Cluster'
375
+ }
376
+ })
377
+ .pipe(take(1))
378
+ .subscribe((dataSource) => {
379
+ const icon = features[0].meta.icon;
380
+ let style;
381
+ if (!icon) {
382
+ style = createOverlayMarkerStyle();
383
+ }
384
+ else {
385
+ style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
386
+ }
387
+ const olLayer = this.layerService.createLayer({
388
+ isIgoInternalLayer: true,
389
+ title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
390
+ source: dataSource,
391
+ visible: true,
392
+ style
393
+ });
394
+ const featuresOl = features.map(feature => {
395
+ return featureToOl(feature, this.map.projection);
396
+ });
397
+ const ol = dataSource.ol;
398
+ ol.getSource().addFeatures(featuresOl);
399
+ if (this.layers.find(layer => layer.id === olLayer.id)) {
400
+ this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
401
+ i = i - 1;
402
+ olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
403
+ olLayer.options.title = olLayer.title;
404
+ }
405
+ this.iterator = i;
406
+ this.map.addLayer(olLayer);
407
+ this.layers.push(olLayer);
408
+ this.pushLayer(olLayer);
409
+ this.cdRef.detectChanges();
410
+ });
411
+ }
412
+ }
413
+ createSvgIcon(icon) {
414
+ let style;
415
+ this.matIconRegistry.getNamedSvgIcon(icon).subscribe(svgObj => {
416
+ const xmlSerializer = new XMLSerializer();
417
+ svgObj.setAttribute('width', '30');
418
+ svgObj.setAttribute('height', '30');
419
+ svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
420
+ svgObj.setAttribute('stroke', 'white');
421
+ const svg = xmlSerializer.serializeToString(svgObj);
422
+ style = new olstyle.Style({
423
+ image: new olstyle.Icon({
424
+ src: 'data:image/svg+xml;utf8,' + svg
425
+ })
426
+ });
427
+ });
428
+ return style;
429
+ }
430
+ /**
431
+ * Try to add line or polygon features to the map
432
+ */
433
+ tryAddLayerToMap(features, id) {
434
+ let i = 1;
435
+ if (features.length) {
436
+ if (this.map === undefined) {
437
+ return;
438
+ }
439
+ for (const layer of this.layers) {
440
+ if (layer.title?.startsWith(features[0].meta.title)) {
441
+ i++;
442
+ }
443
+ }
444
+ this.dataSourceService
445
+ .createAsyncDataSource({
446
+ type: 'vector',
447
+ id,
448
+ queryable: true
449
+ })
450
+ .pipe(take(1))
451
+ .subscribe((dataSource) => {
452
+ const olLayer = this.layerService.createLayer({
453
+ isIgoInternalLayer: true,
454
+ title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
455
+ source: dataSource,
456
+ visible: true
457
+ });
458
+ const featuresOl = features.map(feature => {
459
+ return featureToOl(feature, this.map.projection);
460
+ });
461
+ const ol = dataSource.ol;
462
+ ol.addFeatures(featuresOl);
463
+ if (this.layers.find(layer => layer.id === olLayer.id)) {
464
+ this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
465
+ i = i - 1;
466
+ olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
467
+ olLayer.options.title = olLayer.title;
468
+ }
469
+ this.map.addLayer(olLayer);
470
+ this.layers.push(olLayer);
471
+ this.pushLayer(olLayer);
472
+ this.cdRef.detectChanges();
473
+ });
474
+ }
475
+ }
476
+ zoomToFeatureExtent(feature) {
477
+ if (feature) {
478
+ const olFeature = this.format.readFeature(feature, {
479
+ dataProjection: feature.projection,
480
+ featureProjection: this.map.projection
481
+ });
482
+ moveToOlFeatures(this.map, [olFeature], FeatureMotion.Zoom);
483
+ }
484
+ }
485
+ pushLayer(layer) {
486
+ for (const lay of this.activeLayers) {
487
+ if (lay.id === layer.id) {
488
+ return;
489
+ }
490
+ }
491
+ this.activeLayers.push(layer);
492
+ }
493
+ };
494
+ SpatialFilterToolComponent.ɵfac = function SpatialFilterToolComponent_Factory(t) { return new (t || SpatialFilterToolComponent)(i0.ɵɵdirectiveInject(i1.MatIconRegistry), i0.ɵɵdirectiveInject(i2.SpatialFilterService), i0.ɵɵdirectiveInject(i2.DataSourceService), i0.ɵɵdirectiveInject(i2.LayerService), i0.ɵɵdirectiveInject(i3.MapState), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ImportExportState), i0.ɵɵdirectiveInject(i6.ToolState), i0.ɵɵdirectiveInject(i7.WorkspaceState), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
495
+ SpatialFilterToolComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpatialFilterToolComponent, selectors: [["igo-spatial-filter-tool"]], inputs: { type: "type", itemType: "itemType", freehandDrawIsActive: "freehandDrawIsActive" }, decls: 6, vars: 16, consts: [[3, "store", "selectedQueryType", "zone", "layers", "eventType", "eventQueryType", "zoneChange", "zoneWithBufferChange", "bufferChange", "measureUnitChange"], [3, "type", "queryType", "map", "zone", "loading", "store", "layers", "allLayers", "thematicLength", "radiusEvent", "bufferEvent", "measureUnitChange", "freehandControl", "drawZoneEvent", "zoneWithBufferChange", "itemTypeChange", "thematicChange", "toggleSearch", "clearButtonEvent", "clearSearchEvent", "export", "openWorkspace", "entityChange"], [4, "ngIf"], [3, "feature"]], template: function SpatialFilterToolComponent_Template(rf, ctx) { if (rf & 1) {
496
+ i0.ɵɵelementStart(0, "igo-panel")(1, "igo-spatial-filter-type", 0);
497
+ i0.ɵɵlistener("eventType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventType_1_listener($event) { return ctx.getOutputType($event); })("eventQueryType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventQueryType_1_listener($event) { return ctx.getOutputQueryType($event); })("zoneChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneChange_1_listener($event) { return ctx.onZoneChange($event); })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneWithBufferChange_1_listener($event) { return ctx.onZoneChange($event, true); })("bufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_bufferChange_1_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_measureUnitChange_1_listener($event) { return ctx.measureUnit = $event; });
498
+ i0.ɵɵelementEnd();
499
+ i0.ɵɵelementStart(2, "igo-spatial-filter-item", 1);
500
+ i0.ɵɵlistener("radiusEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_radiusEvent_2_listener($event) { return ctx.buffer = $event; })("bufferEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_bufferEvent_2_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_measureUnitChange_2_listener($event) { return ctx.measureUnit = $event; })("freehandControl", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_freehandControl_2_listener($event) { return ctx.freehandDrawIsActive = $event; })("drawZoneEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_drawZoneEvent_2_listener($event) { return ctx.zone = $event; })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_zoneWithBufferChange_2_listener($event) { return ctx.onZoneChange($event, true); })("itemTypeChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_itemTypeChange_2_listener($event) { return ctx.itemType = $event; })("thematicChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_thematicChange_2_listener($event) { return ctx.thematics = $event; })("toggleSearch", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_toggleSearch_2_listener() { return ctx.getOutputToggleSearch(); })("clearButtonEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearButtonEvent_2_listener() { return ctx.clearMap(); })("clearSearchEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearSearchEvent_2_listener() { return ctx.getOutputClearSearch(); })("export", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_export_2_listener() { return ctx.activateExportTool(); })("openWorkspace", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_openWorkspace_2_listener() { return ctx.activateWorkspace(); })("entityChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_entityChange_2_listener($event) { return ctx.activateWorkspace($event); });
501
+ i0.ɵɵelementEnd()();
502
+ i0.ɵɵelementStart(3, "igo-panel");
503
+ i0.ɵɵtemplate(4, SpatialFilterToolComponent_ng_container_4_Template, 2, 1, "ng-container", 2);
504
+ i0.ɵɵpipe(5, "async");
505
+ i0.ɵɵelementEnd();
506
+ } if (rf & 2) {
507
+ i0.ɵɵadvance(1);
508
+ i0.ɵɵproperty("store", ctx.spatialListStore)("selectedQueryType", ctx.queryType)("zone", ctx.zone)("layers", ctx.activeLayers);
509
+ i0.ɵɵadvance(1);
510
+ i0.ɵɵproperty("type", ctx.type)("queryType", ctx.queryType)("map", ctx.map)("zone", ctx.zone)("loading", ctx.loading)("store", ctx.store)("layers", ctx.activeLayers)("allLayers", ctx.layers)("thematicLength", ctx.thematicLength);
511
+ i0.ɵɵadvance(2);
512
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(5, 14, ctx.selectedFeature$));
513
+ } }, dependencies: [i2.SpatialFilterTypeComponent, i2.SpatialFilterItemComponent, i8.NgIf, i8.AsyncPipe], changeDetection: 0 });
514
+ SpatialFilterToolComponent = __decorate([
515
+ ToolComponent({
516
+ name: 'spatialFilter',
517
+ title: 'igo.integration.tools.spatialFilter',
518
+ icon: 'selection-marker'
519
+ })
520
+ /**
521
+ * Spatial Filter Type
522
+ */
523
+ ], SpatialFilterToolComponent);
524
+ export { SpatialFilterToolComponent };
525
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpatialFilterToolComponent, [{
526
+ type: Component,
527
+ args: [{ selector: 'igo-spatial-filter-tool', changeDetection: ChangeDetectionStrategy.OnPush, template: "<igo-panel>\n <igo-spatial-filter-type\n [store]=\"spatialListStore\"\n [selectedQueryType]=\"queryType\"\n [zone]=\"zone\"\n [layers]=\"activeLayers\"\n (eventType)=\"getOutputType($event)\"\n (eventQueryType)=\"getOutputQueryType($event)\"\n (zoneChange)=\"onZoneChange($event)\"\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\n (bufferChange)=\"buffer = $event\"\n (measureUnitChange)=\"measureUnit = $event\">\n </igo-spatial-filter-type>\n\n <igo-spatial-filter-item\n [type]=\"type\"\n [queryType]=\"queryType\"\n [map]=\"map\"\n [zone]=\"zone\"\n [loading]=\"loading\"\n [store]=\"store\"\n [layers]=\"activeLayers\"\n [allLayers]=\"layers\"\n [thematicLength]=\"thematicLength\"\n (radiusEvent)=\"buffer = $event\"\n (bufferEvent)=\"buffer = $event\"\n (measureUnitChange)=\"measureUnit = $event\"\n (freehandControl)=\"freehandDrawIsActive = $event\"\n (drawZoneEvent)=\"zone = $event\"\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\n (itemTypeChange)=\"itemType = $event\"\n (thematicChange)=\"thematics = $event\"\n (toggleSearch)=\"getOutputToggleSearch()\"\n (clearButtonEvent)=\"clearMap()\"\n (clearSearchEvent)=\"getOutputClearSearch()\"\n (export)=\"activateExportTool()\"\n (openWorkspace)=\"activateWorkspace()\"\n (entityChange)=\"activateWorkspace($event)\">\n </igo-spatial-filter-item>\n</igo-panel>\n\n<igo-panel>\n <ng-container *ngIf=\"selectedFeature$ | async as feature\">\n <igo-feature-details [feature]=\"feature\"></igo-feature-details>\n </ng-container>\n</igo-panel>" }]
528
+ }], function () { return [{ type: i1.MatIconRegistry }, { type: i2.SpatialFilterService }, { type: i2.DataSourceService }, { type: i2.LayerService }, { type: i3.MapState }, { type: i4.MessageService }, { type: i4.LanguageService }, { type: i5.ImportExportState }, { type: i6.ToolState }, { type: i7.WorkspaceState }, { type: i0.ChangeDetectorRef }]; }, { type: [{
529
+ type: Input
530
+ }], itemType: [{
531
+ type: Input
532
+ }], freehandDrawIsActive: [{
533
+ type: Input
534
+ }] }); })();
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFjLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsV0FBVyxFQUlYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFLckIsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUNsQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoRyxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7SUNPbEMsNkJBQTBEO0lBQ3hELHlDQUErRDtJQUNqRSwwQkFBZTs7O0lBRFEsZUFBbUI7SUFBbkIsb0NBQW1C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dEM7U0EzaEJZLDBCQUEwQjt1RkFBMUIsMEJBQTBCO2NBTnRDLFNBQVM7MkJBQ0UseUJBQXlCLG1CQUdsQix1QkFBdUIsQ0FBQyxNQUFNO3VXQU90QyxJQUFJO2tCQUFaLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csb0JBQW9CO2tCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIElnb01hcCxcbiAgRGF0YVNvdXJjZVNlcnZpY2UsXG4gIExheWVyU2VydmljZSxcbiAgRmVhdHVyZSxcbiAgbW92ZVRvT2xGZWF0dXJlcyxcbiAgRmVhdHVyZU1vdGlvbixcbiAgQ2x1c3RlckRhdGFTb3VyY2UsXG4gIGZlYXR1cmVUb09sLFxuICBEYXRhU291cmNlLFxuICBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyxcbiAgU3BhdGlhbEZpbHRlclNlcnZpY2UsXG4gIFNwYXRpYWxGaWx0ZXJUeXBlLFxuICBTcGF0aWFsRmlsdGVySXRlbVR5cGUsXG4gIFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGUsXG4gIFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyxcbiAgTGF5ZXIsXG4gIFZlY3RvckxheWVyLFxuICBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUsXG4gIEV4cG9ydE9wdGlvbnMsXG4gIE1lYXN1cmVMZW5ndGhVbml0XG59IGZyb20gJ0BpZ28yL2dlbyc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZSwgVG9vbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5pbXBvcnQgb2xGb3JtYXRHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCBvbFNvdXJjZVZlY3RvciBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCBvbFNvdXJjZUNsdXN0ZXIgZnJvbSAnb2wvc291cmNlL0NsdXN0ZXInO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWFwU3RhdGUgfSBmcm9tICcuLi8uLi9tYXAvbWFwLnN0YXRlJztcbmltcG9ydCB7IEltcG9ydEV4cG9ydE1vZGUsIEltcG9ydEV4cG9ydFN0YXRlIH0gZnJvbSAnLi8uLi8uLi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQuc3RhdGUnO1xuaW1wb3J0ICogYXMgb2xzdHlsZSBmcm9tICdvbC9zdHlsZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBUb29sU3RhdGUgfSBmcm9tICcuLi8uLi90b29sL3Rvb2wuc3RhdGUnO1xuaW1wb3J0IHsgV29ya3NwYWNlU3RhdGUgfSBmcm9tICcuLi8uLi93b3Jrc3BhY2Uvd29ya3NwYWNlLnN0YXRlJztcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XG5cbi8qKlxuICogVG9vbCB0byBhcHBseSBzcGF0aWFsIGZpbHRlclxuICovXG5AVG9vbENvbXBvbmVudCh7XG4gIG5hbWU6ICdzcGF0aWFsRmlsdGVyJyxcbiAgdGl0bGU6ICdpZ28uaW50ZWdyYXRpb24udG9vbHMuc3BhdGlhbEZpbHRlcicsXG4gIGljb246ICdzZWxlY3Rpb24tbWFya2VyJ1xufSlcbi8qKlxuICogU3BhdGlhbCBGaWx0ZXIgVHlwZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tc3BhdGlhbC1maWx0ZXItdG9vbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRmlsdGVyVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcbiAgfVxuXG4gIEBJbnB1dCgpIHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xuICBASW5wdXQoKSBpdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3M7XG4gIEBJbnB1dCgpIGZyZWVoYW5kRHJhd0lzQWN0aXZlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBsYXllcnM6IExheWVyW10gPSBbXTtcbiAgcHVibGljIGFjdGl2ZUxheWVyczogTGF5ZXJbXSA9IFtdO1xuXG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGU7XG4gIHB1YmxpYyB0aGVtYXRpY3M6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdO1xuICBwdWJsaWMgem9uZTogRmVhdHVyZTtcbiAgcHVibGljIHpvbmVXaXRoQnVmZmVyOiBGZWF0dXJlO1xuICBwdWJsaWMgYnVmZmVyID0gMDtcblxuICBwdWJsaWMgaXRlcmF0b3IgPSAxO1xuXG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmUkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIHByaXZhdGUgZm9ybWF0ID0gbmV3IG9sRm9ybWF0R2VvSlNPTigpO1xuXG4gIHB1YmxpYyBzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pOyAvLyBTdG9yZSB0byBwcmludCByZXN1bHRzIGF0IHRoZSBlbmRcblxuICBwdWJsaWMgc3BhdGlhbExpc3RTdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pO1xuXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIHRoZW1hdGljTGVuZ3RoID0gMDtcblxuICBwdWJsaWMgbWVhc3VyZVVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0ID0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzO1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtb3ZlZW5kS2V5OiBFdmVudHNLZXk7XG5cbiAgcHVibGljIGRlZmF1bHRTdHlsZTogb2xzdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xzdHlsZS5TdHlsZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXRJY29uUmVnaXN0cnk6IE1hdEljb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHNwYXRpYWxGaWx0ZXJTZXJ2aWNlOiBTcGF0aWFsRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFTb3VyY2VTZXJ2aWNlOiBEYXRhU291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbXBvcnRFeHBvcnRTdGF0ZTogSW1wb3J0RXhwb3J0U3RhdGUsXG4gICAgcHJpdmF0ZSB0b29sU3RhdGU6IFRvb2xTdGF0ZSxcbiAgICBwcml2YXRlIHdvcmtzcGFjZVN0YXRlOiBXb3Jrc3BhY2VTdGF0ZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLm1hcC5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci50aXRsZSAmJiBsYXllci50aXRsZS5pbmNsdWRlcyh0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInKSkpIHtcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXRPdXRwdXRUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyVHlwZSkge1xuICAgIHRoaXMudHlwZSA9IGV2ZW50O1xuICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0T3V0cHV0UXVlcnlUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyUXVlcnlUeXBlKSB7XG4gICAgdGhpcy5xdWVyeVR5cGUgPSBldmVudDtcbiAgICBpZiAodGhpcy5xdWVyeVR5cGUpIHtcbiAgICAgIHRoaXMubG9hZEZpbHRlckxpc3QoKTtcbiAgICB9XG4gIH1cblxuICBhY3RpdmF0ZUV4cG9ydFRvb2woKSB7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeWm9uZSBcXFxcZCsnKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBpZiAoIWxheWVyLnRpdGxlLm1hdGNoKHJlKSkge1xuICAgICAgICBpZHMucHVzaChsYXllci5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW1wb3J0RXhwb3J0U3RhdGUuc2V0TW9kZShJbXBvcnRFeHBvcnRNb2RlLmV4cG9ydCk7XG4gICAgdGhpcy5pbXBvcnRFeHBvcnRTdGF0ZS5zZXRzRXhwb3J0T3B0aW9ucyh7IGxheWVyczogaWRzIH0gYXMgRXhwb3J0T3B0aW9ucyk7XG4gICAgdGhpcy50b29sU3RhdGUudG9vbGJveC5hY3RpdmF0ZVRvb2woJ2ltcG9ydEV4cG9ydCcpO1xuICB9XG5cbiAgYWN0aXZhdGVXb3Jrc3BhY2UocmVjb3JkPykge1xuICAgIGxldCBsYXllclRvT3BlbldrcztcbiAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmVudGl0aWVzJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIXJlY29yZCAmJiB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiYgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMudGhlbWF0aWNzKSB7XG4gICAgICAgICAgICAgIGlmICghdGhlbWF0aWMuemVyb1Jlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IHRoaXMuYWN0aXZlTGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudGl0bGUuaW5jbHVkZXModGhlbWF0aWMubmFtZSArICcgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAnQWRyZXNzZXMgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsYXllci50aXRsZS5pbmNsdWRlcyh0aXRsZSkpIHtcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IGxheWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllclRvT3Blbldrcykge1xuICAgICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUud29ya3NwYWNlUGFuZWxFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zZXRBY3RpdmVXb3Jrc3BhY2VCeUlkKGxheWVyVG9PcGVuV2tzLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWNvcmQgJiYgdGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoICYmIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xuICAgICAgICB0aGlzLm1vdmVlbmRLZXkgPSB0aGlzLm1hcC5vbC5vbignbW92ZWVuZCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCkge1xuICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkuZm9yRWFjaCh3b3Jrc3BhY2UgPT4ge1xuICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7c2VsZWN0ZWQ6IGZhbHNlfSk7XG4gICAgICBpZiAod29ya3NwYWNlLnRpdGxlLmluY2x1ZGVzKHJlY29yZC5hZGRlZFswXS5tZXRhLnRpdGxlKSkge1xuICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQod29ya3NwYWNlLmlkKTtcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZU1hbnkocmVjb3JkLmFkZGVkLCB7c2VsZWN0ZWQ6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZpbHRlckxpc3QoKSB7XG4gICAgdGhpcy5zcGF0aWFsRmlsdGVyU2VydmljZVxuICAgICAgLmxvYWRGaWx0ZXJMaXN0KHRoaXMucXVlcnlUeXBlKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IHtcbiAgICAgICAgZmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGlmIChhLnByb3BlcnRpZXMubm9tIDwgYi5wcm9wZXJ0aWVzLm5vbSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYS5wcm9wZXJ0aWVzLm5vbSA+IGIucHJvcGVydGllcy5ub20pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3BhdGlhbExpc3RTdG9yZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNwYXRpYWxMaXN0U3RvcmUubG9hZChmZWF0dXJlcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldE91dHB1dFRvZ2dsZVNlYXJjaCgpIHtcbiAgICB0aGlzLmxvYWRUaGVtYXRpY3MoKTtcbiAgfVxuXG4gIGdldE91dHB1dENsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsZWFyTWFwKCkge1xuICAgIHRoaXMubWFwLnJlbW92ZUxheWVycyh0aGlzLmxheWVycyk7XG4gICAgdGhpcy5sYXllcnMgPSBbXTtcbiAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xuICAgIHRoaXMudGhlbWF0aWNMZW5ndGggPSAwO1xuICAgIHRoaXMuaXRlcmF0b3IgPSAxO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcbiAgICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRoZW1hdGljcygpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGxldCB6ZXJvUmVzdWx0cyA9IHRydWU7XG4gICAgbGV0IHRoZW1hdGljcztcbiAgICBpZiAodGhpcy5idWZmZXIgPT09IDAgfHwgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCkge1xuICAgICAgdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFt0aGlzLnpvbmVdKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbVR5cGUgIT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcbiAgICAgIGNvbnN0IHRoZW1lOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgPSB7XG4gICAgICAgIG5hbWU6ICcnXG4gICAgICB9O1xuICAgICAgdGhlbWF0aWNzID0gW3RoZW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWF0aWNzID0gdGhpcy50aGVtYXRpY3M7XG4gICAgfVxuICAgIGlmICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmIHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIgKiAxMDAwO1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2x5Z29uKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IDA7IC8vIHRvIGF2b2lkIGJ1ZmZlciBlbnRlciBhIHNlY29uZCB0aW1lIGluIHRlcnJBUElcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZhYmxlcyQ6IE9ic2VydmFibGU8RmVhdHVyZVtdPltdID0gW107XG4gICAgdGhlbWF0aWNzLmZvckVhY2godGhlbWF0aWMgPT4ge1xuICAgICAgb2JzZXJ2YWJsZXMkLnB1c2goXG4gICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAubG9hZEZpbHRlckl0ZW0oXG4gICAgICAgICAgICB0aGlzLnpvbmUsXG4gICAgICAgICAgICB0aGlzLml0ZW1UeXBlLFxuICAgICAgICAgICAgdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICB0aGVtYXRpYyxcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyXG4gICAgICAgICAgKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFwKChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmUuaW5zZXJ0TWFueShmZWF0dXJlcyk7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzUG9pbnQ6IEZlYXR1cmVbXSA9IFtdO1xuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlc0xpbmVQb2x5OiBGZWF0dXJlW10gPSBbXTtcbiAgICAgICAgICAgICAgbGV0IGlkUG9pbnQ7XG4gICAgICAgICAgICAgIGxldCBpZExpbmVQb2x5O1xuICAgICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5sb25naXR1ZGUgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmxhdGl0dWRlID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzUG9pbnQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkUG9pbnQgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzTGluZVBvbHkucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkTGluZVBvbHkgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB0aGlzLnRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXNQb2ludCwgaWRQb2ludCk7XG4gICAgICAgICAgICAgIHRoaXMudHJ5QWRkTGF5ZXJUb01hcChmZWF0dXJlc0xpbmVQb2x5LCBpZExpbmVQb2x5KTtcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY0xlbmd0aCArPSAxO1xuICAgICAgICAgICAgICAgIHRoZW1hdGljLnplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlbWF0aWMuemVyb1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA+PSAxMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLm1heFNpemVBbGVydCcsXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgeyB0aW1lT3V0OiAxMDAwMCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMkKS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh6ZXJvUmVzdWx0cykge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuemVyb1Jlc3VsdHMnLFxuICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIud2FybmluZycsXG4gICAgICAgICAgeyB0aW1lT3V0OiAxMDAwMCB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblpvbmVDaGFuZ2UoZmVhdHVyZTogRmVhdHVyZSwgYnVmZmVyPzogYm9vbGVhbikge1xuICAgIHRoaXMuem9uZSA9IGZlYXR1cmU7XG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIGJ1ZmZlciA/IHRoaXMudHJ5QWRkRmVhdHVyZXNUb01hcChbZmVhdHVyZV0sIHRydWUpIDogdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFtmZWF0dXJlXSk7XG4gICAgICB0aGlzLnpvb21Ub0ZlYXR1cmVFeHRlbnQoZmVhdHVyZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBhZGQgem9uZSBmZWF0dXJlIHRvIHRoZSBtYXAgb3ZlcmxheVxuICAgKi9cbiAgcHVibGljIHRyeUFkZEZlYXR1cmVzVG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgYnVmZmVyPzogYm9vbGVhbikge1xuICAgIGxldCBpID0gMTtcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuX2ludGVybmFsICYmXG4gICAgICAgICAgICBsYXllci5vcHRpb25zLl9pbnRlcm5hbC5jb2RlID09PSBmZWF0dXJlLnByb3BlcnRpZXMuY29kZSAmJlxuICAgICAgICAgICAgIWJ1ZmZlclxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCFsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmFjdGl2ZUxheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlTGF5ZXJzLmxlbmd0aCA9PT0gMSAmJiBsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGVmYXVsdFN0eWxlID0gKF9mZWF0dXJlLCByZXNvbHV0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gKGZlYXR1cmVzWzBdIGFzIGFueSkuY29vcmRpbmF0ZXM7XG4gICAgICAgIHJldHVybiBuZXcgb2xzdHlsZS5TdHlsZSh7XG4gICAgICAgICAgaW1hZ2U6IG5ldyBvbHN0eWxlLkNpcmNsZSh7XG4gICAgICAgICAgICByYWRpdXM6IGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgID8gdGhpcy5idWZmZXIgL1xuICAgICAgICAgICAgICAgIE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIGNvb3JkaW5hdGVzWzFdKSAvXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGZpbGw6IG5ldyBvbHN0eWxlLkZpbGwoe1xuICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMjAwLCAyMDAsIDIwLCAwLjIpJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgICBjb2xvcjogJ29yYW5nZSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3Ryb2tlOiBuZXcgb2xzdHlsZS5TdHJva2Uoe1xuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBjb2xvcjogJ29yYW5nZSdcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWxsOiBuZXcgb2xzdHlsZS5GaWxsKHtcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgyMDAsIDIwMCwgMjAsIDAuMiknXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5kYXRhU291cmNlU2VydmljZVxuICAgICAgICAuY3JlYXRlQXN5bmNEYXRhU291cmNlKHtcbiAgICAgICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgICAgICBxdWVyeWFibGU6IHRydWVcbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucylcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllcih7XG4gICAgICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgICAgICAgICB0aXRsZTogKCdab25lICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICAgKSkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgd29ya3NwYWNlOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIF9pbnRlcm5hbDoge1xuICAgICAgICAgICAgICBjb2RlOlxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyBmZWF0dXJlLnByb3BlcnRpZXMuY29kZVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgfSkgYXMgVmVjdG9yTGF5ZXI7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodGhpcy50eXBlICE9PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCA/ICdDZXJjbGUnIDogJ1BvbHlnb25lJztcbiAgICAgICAgICAgIGZlYXR1cmVzT2xbMF0uc2V0KCdub20nLCAnWm9uZScsIHRydWUpO1xuICAgICAgICAgICAgZmVhdHVyZXNPbFswXS5zZXQoJ3R5cGUnLCB0eXBlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb2wgPSBkYXRhU291cmNlLm9sIGFzIG9sU291cmNlVmVjdG9yPE9sR2VvbWV0cnk+IHwgb2xTb3VyY2VDbHVzdGVyO1xuICAgICAgICAgIG9sLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xuICAgICAgICAgIG9sTGF5ZXIub2wuc2V0U3R5bGUodGhpcy5kZWZhdWx0U3R5bGUpO1xuICAgICAgICAgIHRoaXMubWFwLmFkZExheWVyKG9sTGF5ZXIpO1xuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMucHVzaChvbExheWVyKTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBhZGQgcG9pbnQgZmVhdHVyZXMgdG8gdGhlIG1hcFxuICAgKiBOZWNlc3NhcnkgdG8gY3JlYXRlIGNsdXN0ZXJzXG4gICAqL1xuICBwcml2YXRlIHRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgaWQpIHtcbiAgICBsZXQgaSA9IDE7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMubWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSkpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlcnZpY2VcbiAgICAgICAgLmNyZWF0ZUFzeW5jRGF0YVNvdXJjZSh7XG4gICAgICAgICAgdHlwZTogJ2NsdXN0ZXInLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogMTIwLFxuICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnQ2x1c3RlcidcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2U6IENsdXN0ZXJEYXRhU291cmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWNvbiA9IGZlYXR1cmVzWzBdLm1ldGEuaWNvbjtcbiAgICAgICAgICBsZXQgc3R5bGU6IG9sc3R5bGUuU3R5bGU7XG4gICAgICAgICAgaWYgKCFpY29uKSB7XG4gICAgICAgICAgICBzdHlsZSA9IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZSA9IHRoaXMuY3JlYXRlU3ZnSWNvbihpY29uKSB8fCBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBvbExheWVyID0gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXIoe1xuICAgICAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcbiAgICAgICAgICAgICkpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBzdHlsZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmZWF0dXJlLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VDbHVzdGVyO1xuICAgICAgICAgIG9sLmdldFNvdXJjZSgpLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xuICAgICAgICAgIGlmICh0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKSkge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIoXG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaSA9IGkgLSAxO1xuICAgICAgICAgICAgb2xMYXllci50aXRsZSA9IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcbiAgICAgICAgICAgICkpIGFzIHN0cmluZztcbiAgICAgICAgICAgIG9sTGF5ZXIub3B0aW9ucy50aXRsZSA9IG9sTGF5ZXIudGl0bGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpO1xuICAgICAgICAgIHRoaXMubWFwLmFkZExheWVyKG9sTGF5ZXIpO1xuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5wdXNoTGF5ZXIob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3ZnSWNvbihpY29uKTogb2xzdHlsZS5TdHlsZSB7XG4gICAgbGV0IHN0eWxlOiBvbHN0eWxlLlN0eWxlO1xuICAgIHRoaXMubWF0SWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihpY29uKS5zdWJzY3JpYmUoc3ZnT2JqID0+IHtcbiAgICAgIGNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpO1xuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMzAnKTtcbiAgICAgIHN2Z09iai5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICczMCcpO1xuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdyZ2JhKDAsIDEyOCwgMjU1KScpO1xuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ3doaXRlJyk7XG4gICAgICBjb25zdCBzdmcgPSB4bWxTZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Z09iaik7XG4gICAgICBzdHlsZSA9IG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgICAgaW1hZ2U6IG5ldyBvbHN0eWxlLkljb24oe1xuICAgICAgICAgIHNyYzogJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCcgKyBzdmdcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuICAvKipcbiAgICogVHJ5IHRvIGFkZCBsaW5lIG9yIHBvbHlnb24gZmVhdHVyZXMgdG8gdGhlIG1hcFxuICAgKi9cbiAgcHJpdmF0ZSB0cnlBZGRMYXllclRvTWFwKGZlYXR1cmVzOiBGZWF0dXJlW10sIGlkKSB7XG4gICAgbGV0IGkgPSAxO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLm1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgIC5jcmVhdGVBc3luY0RhdGFTb3VyY2Uoe1xuICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZVxuICAgICAgICB9IGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlOiBEYXRhU291cmNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2xMYXllciA9IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyKHtcbiAgICAgICAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICAgICAgICAgIHRpdGxlOiAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXG4gICAgICAgICAgICApKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmZWF0dXJlLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VWZWN0b3I8T2xHZW9tZXRyeT47XG4gICAgICAgICAgb2wuYWRkRmVhdHVyZXMoZmVhdHVyZXNPbCk7XG4gICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpID0gaSAtIDE7XG4gICAgICAgICAgICBvbExheWVyLnRpdGxlID0gKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICAgKSkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb2xMYXllci5vcHRpb25zLnRpdGxlID0gb2xMYXllci50aXRsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcbiAgICAgICAgICB0aGlzLnB1c2hMYXllcihvbExheWVyKTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgem9vbVRvRmVhdHVyZUV4dGVudChmZWF0dXJlKSB7XG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIGNvbnN0IG9sRmVhdHVyZSA9IHRoaXMuZm9ybWF0LnJlYWRGZWF0dXJlKGZlYXR1cmUsIHtcbiAgICAgICAgZGF0YVByb2plY3Rpb246IGZlYXR1cmUucHJvamVjdGlvbixcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb25cbiAgICAgIH0pO1xuICAgICAgbW92ZVRvT2xGZWF0dXJlcyh0aGlzLm1hcCwgW29sRmVhdHVyZV0sIEZlYXR1cmVNb3Rpb24uWm9vbSk7XG4gICAgfVxuICB9XG5cbiAgcHVzaExheWVyKGxheWVyKSB7XG4gICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5hY3RpdmVMYXllcnMpIHtcbiAgICAgIGlmIChsYXkuaWQgPT09IGxheWVyLmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUxheWVycy5wdXNoKGxheWVyKTtcbiAgfVxufVxuIiwiPGlnby1wYW5lbD5cbiAgPGlnby1zcGF0aWFsLWZpbHRlci10eXBlXG4gICAgW3N0b3JlXT1cInNwYXRpYWxMaXN0U3RvcmVcIlxuICAgIFtzZWxlY3RlZFF1ZXJ5VHlwZV09XCJxdWVyeVR5cGVcIlxuICAgIFt6b25lXT1cInpvbmVcIlxuICAgIFtsYXllcnNdPVwiYWN0aXZlTGF5ZXJzXCJcbiAgICAoZXZlbnRUeXBlKT1cImdldE91dHB1dFR5cGUoJGV2ZW50KVwiXG4gICAgKGV2ZW50UXVlcnlUeXBlKT1cImdldE91dHB1dFF1ZXJ5VHlwZSgkZXZlbnQpXCJcbiAgICAoem9uZUNoYW5nZSk9XCJvblpvbmVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKHpvbmVXaXRoQnVmZmVyQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQsIHRydWUpXCJcbiAgICAoYnVmZmVyQ2hhbmdlKT1cImJ1ZmZlciA9ICRldmVudFwiXG4gICAgKG1lYXN1cmVVbml0Q2hhbmdlKT1cIm1lYXN1cmVVbml0ID0gJGV2ZW50XCI+XG4gIDwvaWdvLXNwYXRpYWwtZmlsdGVyLXR5cGU+XG5cbiAgPGlnby1zcGF0aWFsLWZpbHRlci1pdGVtXG4gICAgW3R5cGVdPVwidHlwZVwiXG4gICAgW3F1ZXJ5VHlwZV09XCJxdWVyeVR5cGVcIlxuICAgIFttYXBdPVwibWFwXCJcbiAgICBbem9uZV09XCJ6b25lXCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbc3RvcmVdPVwic3RvcmVcIlxuICAgIFtsYXllcnNdPVwiYWN0aXZlTGF5ZXJzXCJcbiAgICBbYWxsTGF5ZXJzXT1cImxheWVyc1wiXG4gICAgW3RoZW1hdGljTGVuZ3RoXT1cInRoZW1hdGljTGVuZ3RoXCJcbiAgICAocmFkaXVzRXZlbnQpPVwiYnVmZmVyID0gJGV2ZW50XCJcbiAgICAoYnVmZmVyRXZlbnQpPVwiYnVmZmVyID0gJGV2ZW50XCJcbiAgICAobWVhc3VyZVVuaXRDaGFuZ2UpPVwibWVhc3VyZVVuaXQgPSAkZXZlbnRcIlxuICAgIChmcmVlaGFuZENvbnRyb2wpPVwiZnJlZWhhbmREcmF3SXNBY3RpdmUgPSAkZXZlbnRcIlxuICAgIChkcmF3Wm9uZUV2ZW50KT1cInpvbmUgPSAkZXZlbnRcIlxuICAgICh6b25lV2l0aEJ1ZmZlckNoYW5nZSk9XCJvblpvbmVDaGFuZ2UoJGV2ZW50LCB0cnVlKVwiXG4gICAgKGl0ZW1UeXBlQ2hhbmdlKT1cIml0ZW1UeXBlID0gJGV2ZW50XCJcbiAgICAodGhlbWF0aWNDaGFuZ2UpPVwidGhlbWF0aWNzID0gJGV2ZW50XCJcbiAgICAodG9nZ2xlU2VhcmNoKT1cImdldE91dHB1dFRvZ2dsZVNlYXJjaCgpXCJcbiAgICAoY2xlYXJCdXR0b25FdmVudCk9XCJjbGVhck1hcCgpXCJcbiAgICAoY2xlYXJTZWFyY2hFdmVudCk9XCJnZXRPdXRwdXRDbGVhclNlYXJjaCgpXCJcbiAgICAoZXhwb3J0KT1cImFjdGl2YXRlRXhwb3J0VG9vbCgpXCJcbiAgICAob3BlbldvcmtzcGFjZSk9XCJhY3RpdmF0ZVdvcmtzcGFjZSgpXCJcbiAgICAoZW50aXR5Q2hhbmdlKT1cImFjdGl2YXRlV29ya3NwYWNlKCRldmVudClcIj5cbiAgPC9pZ28tc3BhdGlhbC1maWx0ZXItaXRlbT5cbjwvaWdvLXBhbmVsPlxuXG48aWdvLXBhbmVsPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGZWF0dXJlJCB8IGFzeW5jIGFzIGZlYXR1cmVcIj5cbiAgICA8aWdvLWZlYXR1cmUtZGV0YWlscyBbZmVhdHVyZV09XCJmZWF0dXJlXCI+PC9pZ28tZmVhdHVyZS1kZXRhaWxzPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvaWdvLXBhbmVsPiJdfQ==