@igo2/integration 18.0.0 → 18.0.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/fesm2022/igo2-integration.mjs +252 -254
  2. package/fesm2022/igo2-integration.mjs.map +1 -1
  3. package/package.json +8 -10
  4. package/esm2022/igo2-integration.mjs +0 -5
  5. package/esm2022/lib/about/about-tool/about-tool.component.mjs +0 -152
  6. package/esm2022/lib/about/about-tool/index.mjs +0 -2
  7. package/esm2022/lib/about/about.module.mjs +0 -26
  8. package/esm2022/lib/about/index.mjs +0 -2
  9. package/esm2022/lib/analytics/analytics-listener.service.mjs +0 -149
  10. package/esm2022/lib/analytics/index.mjs +0 -2
  11. package/esm2022/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +0 -117
  12. package/esm2022/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +0 -19
  13. package/esm2022/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +0 -110
  14. package/esm2022/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +0 -19
  15. package/esm2022/lib/catalog/catalog.module.mjs +0 -19
  16. package/esm2022/lib/catalog/catalog.state.mjs +0 -58
  17. package/esm2022/lib/catalog/index.mjs +0 -6
  18. package/esm2022/lib/context/context-editor-tool/context-editor-tool.component.mjs +0 -33
  19. package/esm2022/lib/context/context-manager-tool/context-manager-tool.component.mjs +0 -46
  20. package/esm2022/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +0 -23
  21. package/esm2022/lib/context/context-share-tool/context-share-tool.component.mjs +0 -40
  22. package/esm2022/lib/context/context.directive.mjs +0 -11
  23. package/esm2022/lib/context/context.module.mjs +0 -23
  24. package/esm2022/lib/context/context.state.mjs +0 -96
  25. package/esm2022/lib/context/index.mjs +0 -7
  26. package/esm2022/lib/directions/directions-tool/directions-tool.component.mjs +0 -121
  27. package/esm2022/lib/directions/directions-tool/index.mjs +0 -2
  28. package/esm2022/lib/directions/directions.module.mjs +0 -25
  29. package/esm2022/lib/directions/directions.state.mjs +0 -57
  30. package/esm2022/lib/directions/index.mjs +0 -3
  31. package/esm2022/lib/draw/draw.module.mjs +0 -18
  32. package/esm2022/lib/draw/draw.state.mjs +0 -43
  33. package/esm2022/lib/draw/drawing-tool/drawing-tool.component.mjs +0 -72
  34. package/esm2022/lib/draw/drawing-tool/drawing-tool.module.mjs +0 -19
  35. package/esm2022/lib/draw/index.mjs +0 -4
  36. package/esm2022/lib/environment/environment.interface.mjs +0 -2
  37. package/esm2022/lib/environment/index.mjs +0 -2
  38. package/esm2022/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +0 -10
  39. package/esm2022/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +0 -43
  40. package/esm2022/lib/filter/active-ogc-filter-tool/index.mjs +0 -2
  41. package/esm2022/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +0 -10
  42. package/esm2022/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +0 -43
  43. package/esm2022/lib/filter/active-time-filter-tool/index.mjs +0 -2
  44. package/esm2022/lib/filter/filter.module.mjs +0 -53
  45. package/esm2022/lib/filter/index.mjs +0 -18
  46. package/esm2022/lib/filter/ogc-filter-tool/index.mjs +0 -2
  47. package/esm2022/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +0 -22
  48. package/esm2022/lib/filter/spatial-filter-tool/index.mjs +0 -2
  49. package/esm2022/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +0 -589
  50. package/esm2022/lib/filter/time-filter-tool/index.mjs +0 -2
  51. package/esm2022/lib/filter/time-filter-tool/time-filter-tool.component.mjs +0 -22
  52. package/esm2022/lib/geometry-form/data-issue-reporter-tool/data-issue-reporter-tool.component.mjs +0 -188
  53. package/esm2022/lib/geometry-form/data-issue-reporter-tool/index.mjs +0 -2
  54. package/esm2022/lib/geometry-form/geometry-form.module.mjs +0 -37
  55. package/esm2022/lib/geometry-form/index.mjs +0 -2
  56. package/esm2022/lib/import-export/import-export-tool/import-export-tool.component.mjs +0 -113
  57. package/esm2022/lib/import-export/import-export-tool/index.mjs +0 -2
  58. package/esm2022/lib/import-export/import-export.module.mjs +0 -25
  59. package/esm2022/lib/import-export/import-export.state.mjs +0 -39
  60. package/esm2022/lib/import-export/index.mjs +0 -3
  61. package/esm2022/lib/integration.module.mjs +0 -70
  62. package/esm2022/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +0 -446
  63. package/esm2022/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +0 -66
  64. package/esm2022/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +0 -157
  65. package/esm2022/lib/map/advanced-map-tool/index.mjs +0 -2
  66. package/esm2022/lib/map/index.mjs +0 -10
  67. package/esm2022/lib/map/layer-list-tool.state.mjs +0 -40
  68. package/esm2022/lib/map/map-details-tool/index.mjs +0 -2
  69. package/esm2022/lib/map/map-details-tool/map-details-tool.component.mjs +0 -190
  70. package/esm2022/lib/map/map-legend/index.mjs +0 -2
  71. package/esm2022/lib/map/map-legend/map-legend-tool.component.mjs +0 -165
  72. package/esm2022/lib/map/map-proximity-tool/index.mjs +0 -2
  73. package/esm2022/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +0 -152
  74. package/esm2022/lib/map/map-proximity.state.mjs +0 -179
  75. package/esm2022/lib/map/map-tool/index.mjs +0 -2
  76. package/esm2022/lib/map/map-tool/map-tool.component.mjs +0 -152
  77. package/esm2022/lib/map/map-tools/index.mjs +0 -2
  78. package/esm2022/lib/map/map-tools/map-tools.component.mjs +0 -350
  79. package/esm2022/lib/map/map.directive.mjs +0 -15
  80. package/esm2022/lib/map/map.module.mjs +0 -59
  81. package/esm2022/lib/map/map.state.mjs +0 -56
  82. package/esm2022/lib/measure/index.mjs +0 -4
  83. package/esm2022/lib/measure/measure.module.mjs +0 -18
  84. package/esm2022/lib/measure/measure.state.mjs +0 -41
  85. package/esm2022/lib/measure/measurer-tool/measurer-tool.component.mjs +0 -51
  86. package/esm2022/lib/measure/measurer-tool/measurer-tool.module.mjs +0 -19
  87. package/esm2022/lib/print/index.mjs +0 -2
  88. package/esm2022/lib/print/print-tool/index.mjs +0 -2
  89. package/esm2022/lib/print/print-tool/print-tool.component.mjs +0 -32
  90. package/esm2022/lib/print/print.module.mjs +0 -25
  91. package/esm2022/lib/search/index.mjs +0 -7
  92. package/esm2022/lib/search/query.state.mjs +0 -48
  93. package/esm2022/lib/search/search-bar/search-bar-binding.directive.mjs +0 -71
  94. package/esm2022/lib/search/search-bar/search-bar.module.mjs +0 -19
  95. package/esm2022/lib/search/search-results-tool/search-results-tool.component.mjs +0 -557
  96. package/esm2022/lib/search/search-results-tool/search-results-tool.module.mjs +0 -19
  97. package/esm2022/lib/search/search.module.mjs +0 -20
  98. package/esm2022/lib/search/search.state.mjs +0 -155
  99. package/esm2022/lib/storage/index.mjs +0 -2
  100. package/esm2022/lib/storage/storage.state.mjs +0 -25
  101. package/esm2022/lib/tool/index.mjs +0 -2
  102. package/esm2022/lib/tool/tool.state.mjs +0 -56
  103. package/esm2022/lib/workspace/index.mjs +0 -4
  104. package/esm2022/lib/workspace/shared/edition-actions.service.mjs +0 -75
  105. package/esm2022/lib/workspace/shared/feature-actions.service.mjs +0 -65
  106. package/esm2022/lib/workspace/shared/index.mjs +0 -3
  107. package/esm2022/lib/workspace/shared/wfs-actions.service.mjs +0 -77
  108. package/esm2022/lib/workspace/shared/workspace.utils.mjs +0 -166
  109. package/esm2022/lib/workspace/workspace-button/index.mjs +0 -2
  110. package/esm2022/lib/workspace/workspace-button/workspace-button.component.mjs +0 -72
  111. package/esm2022/lib/workspace/workspace.module.mjs +0 -19
  112. package/esm2022/lib/workspace/workspace.state.mjs +0 -205
  113. package/esm2022/public_api.mjs +0 -35
@@ -1,589 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { AsyncPipe, NgIf } from '@angular/common';
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input } from '@angular/core';
4
- import { MatIconRegistry } from '@angular/material/icon';
5
- import { EntityStore } from '@igo2/common/entity';
6
- import { SELECTION_MARKER_ICON } from '@igo2/common/icon';
7
- import { PanelComponent } from '@igo2/common/panel';
8
- import { ToolComponent } from '@igo2/common/tool';
9
- import { LanguageService } from '@igo2/core/language';
10
- import { MessageService } from '@igo2/core/message';
11
- import { FeatureDetailsComponent, FeatureMotion, LayerService, MeasureLengthUnit, SpatialFilterItemComponent, SpatialFilterItemType, SpatialFilterService, SpatialFilterType, SpatialFilterTypeComponent, createOverlayMarkerStyle, featureToOl, isLayerItem, moveToOlFeatures } from '@igo2/geo';
12
- import olFormatGeoJSON from 'ol/format/GeoJSON';
13
- import * as olstyle from 'ol/style';
14
- import { Subject, forkJoin } from 'rxjs';
15
- import { BehaviorSubject } from 'rxjs';
16
- import { take, takeUntil, tap } from 'rxjs/operators';
17
- import { MapState } from '../../map/map.state';
18
- import { ToolState } from '../../tool/tool.state';
19
- import { WorkspaceState } from '../../workspace/workspace.state';
20
- import { ImportExportMode, ImportExportState } from './../../import-export/import-export.state';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@angular/material/icon";
23
- import * as i2 from "@igo2/geo";
24
- import * as i3 from "../../map/map.state";
25
- import * as i4 from "@igo2/core/message";
26
- import * as i5 from "@igo2/core/language";
27
- import * as i6 from "./../../import-export/import-export.state";
28
- import * as i7 from "../../tool/tool.state";
29
- import * as i8 from "../../workspace/workspace.state";
30
- /**
31
- * Tool to apply spatial filter
32
- */
33
- let SpatialFilterToolComponent = class SpatialFilterToolComponent {
34
- matIconRegistry;
35
- spatialFilterService;
36
- layerService;
37
- mapState;
38
- messageService;
39
- languageService;
40
- importExportState;
41
- toolState;
42
- workspaceState;
43
- cdRef;
44
- get map() {
45
- return this.mapState.map;
46
- }
47
- type;
48
- itemType = SpatialFilterItemType.Address;
49
- freehandDrawIsActive;
50
- layers = [];
51
- activeLayers = [];
52
- queryType;
53
- thematics;
54
- zone;
55
- zoneWithBuffer;
56
- buffer = 0;
57
- iterator = 1;
58
- selectedFeature$ = new BehaviorSubject(undefined);
59
- format = new olFormatGeoJSON();
60
- store = new EntityStore([]); // Store to print results at the end
61
- spatialListStore = new EntityStore([]);
62
- loading = false;
63
- thematicLength = 0;
64
- measureUnit = MeasureLengthUnit.Meters;
65
- unsubscribe$ = new Subject();
66
- defaultStyle;
67
- constructor(matIconRegistry, spatialFilterService, layerService, mapState, messageService, languageService, importExportState, toolState, workspaceState, cdRef) {
68
- this.matIconRegistry = matIconRegistry;
69
- this.spatialFilterService = spatialFilterService;
70
- this.layerService = layerService;
71
- this.mapState = mapState;
72
- this.messageService = messageService;
73
- this.languageService = languageService;
74
- this.importExportState = importExportState;
75
- this.toolState = toolState;
76
- this.workspaceState = workspaceState;
77
- this.cdRef = cdRef;
78
- }
79
- ngOnInit() {
80
- for (const layer of this.map.layerController.all) {
81
- if (layer.title &&
82
- layer.title.includes(this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'))) {
83
- this.layers.push(layer);
84
- }
85
- }
86
- }
87
- ngOnDestroy() {
88
- this.unsubscribe$.next();
89
- this.unsubscribe$.complete();
90
- }
91
- getOutputType(event) {
92
- this.type = event;
93
- this.queryType = undefined;
94
- }
95
- getOutputQueryType(event) {
96
- this.queryType = event;
97
- if (this.queryType) {
98
- this.loadFilterList();
99
- }
100
- }
101
- activateExportTool() {
102
- const ids = [];
103
- const re = new RegExp('^Zone \\d+');
104
- for (const layer of this.layers) {
105
- if (!layer.title.match(re)) {
106
- ids.push(layer.id);
107
- }
108
- }
109
- this.importExportState.setMode(ImportExportMode.export);
110
- this.importExportState.setsExportOptions({ layers: ids });
111
- this.toolState.toolbox.activateTool('importExport');
112
- }
113
- activateWorkspace(record) {
114
- let layerToOpenWks;
115
- this.workspaceState.store.entities$
116
- .pipe(takeUntil(this.unsubscribe$))
117
- .subscribe(() => {
118
- if (!record &&
119
- this.activeLayers.length &&
120
- this.workspaceState.store.all().length > 1) {
121
- if (this.itemType === SpatialFilterItemType.Thematics &&
122
- this.thematics) {
123
- for (const thematic of this.thematics) {
124
- if (!thematic.zeroResults) {
125
- layerToOpenWks = this.activeLayers.find((layer) => layer.title.includes(thematic.name + ' ' + this.iterator.toString()));
126
- break;
127
- }
128
- }
129
- }
130
- else {
131
- const title = 'Adresses ' + this.iterator.toString();
132
- this.activeLayers.forEach((layer) => {
133
- if (layer.title.includes(title)) {
134
- layerToOpenWks = layer;
135
- }
136
- });
137
- }
138
- if (layerToOpenWks) {
139
- this.workspaceState.workspacePanelExpanded = true;
140
- this.workspaceState.setActiveWorkspaceById(layerToOpenWks.id);
141
- }
142
- }
143
- else if (record &&
144
- this.activeLayers.length &&
145
- this.workspaceState.store.all().length > 1) {
146
- this.selectWorkspaceEntity(record);
147
- this.map.ol.on('moveend', () => {
148
- this.selectWorkspaceEntity(record);
149
- });
150
- }
151
- });
152
- }
153
- selectWorkspaceEntity(record) {
154
- this.workspaceState.store.all().forEach((workspace) => {
155
- workspace.entityStore.state.updateAll({ selected: false });
156
- if (workspace.title.includes(record.added[0].meta.title)) {
157
- this.workspaceState.setActiveWorkspaceById(workspace.id);
158
- workspace.entityStore.state.updateMany(record.added, {
159
- selected: true
160
- });
161
- }
162
- });
163
- }
164
- loadFilterList() {
165
- this.spatialFilterService
166
- .loadFilterList(this.queryType)
167
- .pipe(takeUntil(this.unsubscribe$))
168
- .subscribe((features) => {
169
- features.sort((a, b) => {
170
- if (a.properties.nom < b.properties.nom) {
171
- return -1;
172
- }
173
- if (a.properties.nom > b.properties.nom) {
174
- return 1;
175
- }
176
- return 0;
177
- });
178
- this.spatialListStore.clear();
179
- this.spatialListStore.load(features);
180
- });
181
- }
182
- getOutputToggleSearch() {
183
- this.loadThematics();
184
- }
185
- getOutputClearSearch() {
186
- this.zone = undefined;
187
- this.queryType = undefined;
188
- }
189
- clearMap() {
190
- this.map.layerController.remove(...this.layers);
191
- this.layers = [];
192
- this.activeLayers = [];
193
- this.thematicLength = 0;
194
- this.iterator = 1;
195
- if (this.type === SpatialFilterType.Predefined) {
196
- this.zone = undefined;
197
- this.queryType = undefined;
198
- }
199
- }
200
- loadThematics() {
201
- this.loading = true;
202
- let zeroResults = true;
203
- let thematics;
204
- if (this.buffer === 0 || this.type === SpatialFilterType.Point) {
205
- this.tryAddFeaturesToMap([this.zone]);
206
- }
207
- if (this.itemType !== SpatialFilterItemType.Thematics) {
208
- const theme = {
209
- name: ''
210
- };
211
- thematics = [theme];
212
- }
213
- else {
214
- thematics = this.thematics;
215
- }
216
- if (this.measureUnit === MeasureLengthUnit.Kilometers &&
217
- this.type !== SpatialFilterType.Point) {
218
- this.buffer = this.buffer * 1000;
219
- }
220
- if (this.type === SpatialFilterType.Polygon) {
221
- this.buffer = 0; // to avoid buffer enter a second time in terrAPI
222
- }
223
- const observables$ = [];
224
- thematics.forEach((thematic) => {
225
- observables$.push(this.spatialFilterService
226
- .loadFilterItem(this.zone, this.itemType, this.queryType, thematic, this.buffer)
227
- .pipe(tap((features) => {
228
- this.store.insertMany(features);
229
- const featuresPoint = [];
230
- const featuresLinePoly = [];
231
- let idPoint;
232
- let idLinePoly;
233
- features.forEach((feature) => {
234
- if (feature.geometry.type === 'Point') {
235
- feature.properties.longitude =
236
- feature.geometry.coordinates[0];
237
- feature.properties.latitude = feature.geometry.coordinates[1];
238
- featuresPoint.push(feature);
239
- idPoint = feature.meta.id;
240
- }
241
- else {
242
- featuresLinePoly.push(feature);
243
- idLinePoly = feature.meta.id;
244
- }
245
- });
246
- this.tryAddPointToMap(featuresPoint, idPoint);
247
- this.tryAddLayerToMap(featuresLinePoly, idLinePoly);
248
- if (features.length) {
249
- zeroResults = false;
250
- this.thematicLength += 1;
251
- thematic.zeroResults = false;
252
- this.cdRef.detectChanges();
253
- }
254
- else {
255
- thematic.zeroResults = true;
256
- }
257
- if (features.length >= 10000) {
258
- this.messageService.alert('igo.geo.spatialFilter.maxSizeAlert', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
259
- }
260
- })));
261
- });
262
- forkJoin(observables$)
263
- .pipe(takeUntil(this.unsubscribe$))
264
- .subscribe(() => {
265
- this.loading = false;
266
- if (zeroResults) {
267
- this.messageService.alert('igo.geo.spatialFilter.zeroResults', 'igo.geo.spatialFilter.warning', { timeOut: 10000 });
268
- }
269
- });
270
- }
271
- onZoneChange(feature, buffer) {
272
- this.zone = feature;
273
- if (feature) {
274
- this.tryAddFeaturesToMap([feature], buffer);
275
- this.zoomToFeatureExtent(feature);
276
- }
277
- }
278
- /**
279
- * Try to add zone feature to the map overlay
280
- */
281
- tryAddFeaturesToMap(features, buffer) {
282
- let i = 1;
283
- for (const feature of features) {
284
- if (this.type === SpatialFilterType.Predefined) {
285
- for (const layer of this.layers) {
286
- if (isLayerItem(layer) &&
287
- layer.options._internal &&
288
- layer.options._internal.code === feature.properties.code &&
289
- !buffer) {
290
- if (!layer.title?.startsWith('Zone')) {
291
- const index = this.layers.indexOf(layer);
292
- this.layers.splice(index, 1);
293
- }
294
- return;
295
- }
296
- if (layer.title?.startsWith('Zone')) {
297
- this.activeLayers = [];
298
- const index = this.layers.indexOf(layer);
299
- this.layers.splice(index, 1);
300
- this.map.layerController.remove(layer);
301
- }
302
- }
303
- }
304
- else {
305
- if (buffer) {
306
- for (const layer of this.activeLayers) {
307
- if (this.activeLayers.length === 1 &&
308
- layer.title?.startsWith('Zone')) {
309
- const index = this.layers.indexOf(layer);
310
- this.layers.splice(index, 1);
311
- this.map.layerController.remove(layer);
312
- }
313
- }
314
- }
315
- this.activeLayers = [];
316
- }
317
- for (const layer of this.layers) {
318
- if (layer.title?.startsWith('Zone')) {
319
- i++;
320
- }
321
- }
322
- this.defaultStyle = (_feature, resolution) => {
323
- const coordinates = features[0].coordinates;
324
- return new olstyle.Style({
325
- image: new olstyle.Circle({
326
- radius: coordinates
327
- ? this.buffer /
328
- Math.cos((Math.PI / 180) * coordinates[1]) /
329
- resolution
330
- : undefined,
331
- fill: new olstyle.Fill({
332
- color: 'rgba(200, 200, 20, 0.2)'
333
- }),
334
- stroke: new olstyle.Stroke({
335
- width: 1,
336
- color: 'orange'
337
- })
338
- }),
339
- stroke: new olstyle.Stroke({
340
- width: 1,
341
- color: 'orange'
342
- }),
343
- fill: new olstyle.Fill({
344
- color: 'rgba(200, 200, 20, 0.2)'
345
- })
346
- });
347
- };
348
- const options = {
349
- isIgoInternalLayer: true,
350
- title: ('Zone ' +
351
- i +
352
- ' - ' +
353
- this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
354
- workspace: { enabled: true },
355
- _internal: {
356
- code: this.type === SpatialFilterType.Predefined
357
- ? feature.properties.code
358
- : undefined
359
- },
360
- sourceOptions: {
361
- type: 'vector',
362
- queryable: true
363
- },
364
- visible: true
365
- };
366
- this.layerService
367
- .createAsyncLayer(options)
368
- .pipe(take(1))
369
- .subscribe((layer) => {
370
- const featuresOl = features.map((f) => {
371
- return featureToOl(f, this.map.projection);
372
- });
373
- if (this.type !== SpatialFilterType.Predefined) {
374
- const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
375
- featuresOl[0].set('nom', 'Zone', true);
376
- featuresOl[0].set('type', type, true);
377
- }
378
- const ol = layer.dataSource.ol;
379
- ol.addFeatures(featuresOl);
380
- layer.ol.setStyle(this.defaultStyle);
381
- this.map.layerController.add(layer);
382
- this.layers.push(layer);
383
- this.activeLayers.push(layer);
384
- this.cdRef.detectChanges();
385
- });
386
- }
387
- }
388
- /**
389
- * Try to add point features to the map
390
- * Necessary to create clusters
391
- */
392
- tryAddPointToMap(features, id) {
393
- let i = 1;
394
- if (features.length) {
395
- if (this.map === undefined) {
396
- return;
397
- }
398
- for (const layer of this.layers) {
399
- if (layer.title?.startsWith(features[0].meta.title)) {
400
- i++;
401
- }
402
- }
403
- const icon = features[0].meta.icon;
404
- let style;
405
- if (!icon) {
406
- style = createOverlayMarkerStyle();
407
- }
408
- else {
409
- style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
410
- }
411
- const options = {
412
- isIgoInternalLayer: true,
413
- title: (features[0].meta.title +
414
- ' ' +
415
- i +
416
- ' - ' +
417
- this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
418
- visible: true,
419
- style,
420
- sourceOptions: {
421
- type: 'cluster',
422
- id,
423
- queryable: true,
424
- distance: 120,
425
- meta: {
426
- title: 'Cluster'
427
- }
428
- }
429
- };
430
- this.layerService
431
- .createAsyncLayer(options)
432
- .pipe(take(1))
433
- .subscribe((layer) => {
434
- const featuresOl = features.map((feature) => {
435
- return featureToOl(feature, this.map.projection);
436
- });
437
- const ol = layer.dataSource.ol;
438
- ol.getSource().addFeatures(featuresOl);
439
- const previousLayer = this.layers.find((prevLayer) => prevLayer.id === layer.id);
440
- if (previousLayer) {
441
- this.map.layerController.remove(previousLayer);
442
- i = i - 1;
443
- layer.title = (features[0].meta.title +
444
- ' ' +
445
- i +
446
- ' - ' +
447
- this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
448
- layer.options.title = layer.title;
449
- }
450
- this.iterator = i;
451
- this.map.layerController.add(layer);
452
- this.layers.push(layer);
453
- this.pushLayer(layer);
454
- this.cdRef.detectChanges();
455
- });
456
- }
457
- }
458
- createSvgIcon(icon) {
459
- let style;
460
- this.matIconRegistry.getNamedSvgIcon(icon).subscribe((svgObj) => {
461
- const xmlSerializer = new XMLSerializer();
462
- svgObj.setAttribute('width', '30');
463
- svgObj.setAttribute('height', '30');
464
- svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
465
- svgObj.setAttribute('stroke', 'white');
466
- const svg = xmlSerializer.serializeToString(svgObj);
467
- style = new olstyle.Style({
468
- image: new olstyle.Icon({
469
- src: 'data:image/svg+xml;utf8,' + svg
470
- })
471
- });
472
- });
473
- return style;
474
- }
475
- /**
476
- * Try to add line or polygon features to the map
477
- */
478
- tryAddLayerToMap(features, id) {
479
- let i = 1;
480
- if (features.length) {
481
- if (this.map === undefined) {
482
- return;
483
- }
484
- for (const layer of this.layers) {
485
- if (layer.title?.startsWith(features[0].meta.title)) {
486
- i++;
487
- }
488
- }
489
- const options = {
490
- isIgoInternalLayer: true,
491
- title: (features[0].meta.title +
492
- ' ' +
493
- i +
494
- ' - ' +
495
- this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
496
- sourceOptions: {
497
- type: 'vector',
498
- id,
499
- queryable: true
500
- },
501
- visible: true
502
- };
503
- this.layerService
504
- .createAsyncLayer(options)
505
- .pipe(take(1))
506
- .subscribe((layer) => {
507
- const featuresOl = features.map((feature) => {
508
- return featureToOl(feature, this.map.projection);
509
- });
510
- const ol = layer.dataSource.ol;
511
- ol.addFeatures(featuresOl);
512
- const previousLayer = this.layers.find((prevLayer) => prevLayer.id === layer.id);
513
- if (previousLayer) {
514
- this.map.layerController.remove(previousLayer);
515
- i = i - 1;
516
- layer.title = (features[0].meta.title +
517
- ' ' +
518
- i +
519
- ' - ' +
520
- this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
521
- layer.options.title = layer.title;
522
- }
523
- this.map.layerController.add(layer);
524
- this.layers.push(layer);
525
- this.pushLayer(layer);
526
- this.cdRef.detectChanges();
527
- });
528
- }
529
- }
530
- zoomToFeatureExtent(feature) {
531
- if (feature) {
532
- const olFeature = this.format.readFeature(feature, {
533
- dataProjection: feature.projection,
534
- featureProjection: this.map.projection
535
- });
536
- moveToOlFeatures(this.map.viewController, [olFeature], FeatureMotion.Zoom);
537
- }
538
- }
539
- pushLayer(layer) {
540
- for (const lay of this.activeLayers) {
541
- if (lay.id === layer.id) {
542
- return;
543
- }
544
- }
545
- this.activeLayers.push(layer);
546
- }
547
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialFilterToolComponent, deps: [{ token: i1.MatIconRegistry }, { token: i2.SpatialFilterService }, { token: i2.LayerService }, { token: i3.MapState }, { token: i4.MessageService }, { token: i5.LanguageService }, { token: i6.ImportExportState }, { token: i7.ToolState }, { token: i8.WorkspaceState }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
548
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SpatialFilterToolComponent, isStandalone: true, selector: "igo-spatial-filter-tool", inputs: { type: "type", itemType: "itemType", freehandDrawIsActive: "freehandDrawIsActive" }, ngImport: i0, template: "<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>\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>\n</igo-spatial-filter-item>\n<ng-container *ngIf=\"selectedFeature$ | async as feature\">\n <igo-feature-details [feature]=\"feature\"></igo-feature-details>\n</ng-container>\n", styles: [":host igo-spatial-filter-item{display:block;padding:0 12px}:host ::ng-deep .mat-mdc-tab-body-wrapper{margin-top:12px;padding:0 12px}\n"], dependencies: [{ kind: "component", type: SpatialFilterTypeComponent, selector: "igo-spatial-filter-type", inputs: ["store", "selectedQueryType", "zone", "layers"], outputs: ["eventType", "eventQueryType", "zoneChange", "zoneWithBufferChange", "bufferChange", "measureUnitChange"] }, { kind: "component", type: SpatialFilterItemComponent, selector: "igo-spatial-filter-item", inputs: ["map", "type", "queryType", "zone", "loading", "store", "layers", "allLayers", "thematicLength"], outputs: ["toggleSearch", "itemTypeChange", "thematicChange", "drawZoneEvent", "bufferEvent", "zoneWithBufferChange", "measureUnitChange", "radiusEvent", "freehandControl", "predefinedRadius", "clearButtonEvent", "clearSearchEvent", "export", "openWorkspace", "entityChange"] }, { kind: "component", type: FeatureDetailsComponent, selector: "igo-feature-details", inputs: ["source", "map", "toolbox", "feature"], outputs: ["routeEvent", "selectFeature", "htmlDisplayEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
549
- };
550
- SpatialFilterToolComponent = __decorate([
551
- ToolComponent({
552
- name: 'spatialFilter',
553
- title: 'igo.integration.tools.spatialFilter',
554
- icon: SELECTION_MARKER_ICON
555
- })
556
- /**
557
- * Spatial Filter Type
558
- */
559
- ,
560
- __metadata("design:paramtypes", [MatIconRegistry,
561
- SpatialFilterService,
562
- LayerService,
563
- MapState,
564
- MessageService,
565
- LanguageService,
566
- ImportExportState,
567
- ToolState,
568
- WorkspaceState,
569
- ChangeDetectorRef])
570
- ], SpatialFilterToolComponent);
571
- export { SpatialFilterToolComponent };
572
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialFilterToolComponent, decorators: [{
573
- type: Component,
574
- args: [{ selector: 'igo-spatial-filter-tool', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
575
- SpatialFilterTypeComponent,
576
- SpatialFilterItemComponent,
577
- PanelComponent,
578
- FeatureDetailsComponent,
579
- NgIf,
580
- AsyncPipe
581
- ], template: "<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>\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>\n</igo-spatial-filter-item>\n<ng-container *ngIf=\"selectedFeature$ | async as feature\">\n <igo-feature-details [feature]=\"feature\"></igo-feature-details>\n</ng-container>\n", styles: [":host igo-spatial-filter-item{display:block;padding:0 12px}:host ::ng-deep .mat-mdc-tab-body-wrapper{margin-top:12px;padding:0 12px}\n"] }]
582
- }], ctorParameters: () => [{ type: i1.MatIconRegistry }, { type: i2.SpatialFilterService }, { type: i2.LayerService }, { type: i3.MapState }, { type: i4.MessageService }, { type: i5.LanguageService }, { type: i6.ImportExportState }, { type: i7.ToolState }, { type: i8.WorkspaceState }, { type: i0.ChangeDetectorRef }], propDecorators: { type: [{
583
- type: Input
584
- }], itemType: [{
585
- type: Input
586
- }], freehandDrawIsActive: [{
587
- type: Input
588
- }] } });
589
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUlMLHVCQUF1QixFQUN2QixhQUFhLEVBRWIsWUFBWSxFQUNaLGlCQUFpQixFQUVqQiwwQkFBMEIsRUFDMUIscUJBQXFCLEVBRXJCLG9CQUFvQixFQUVwQixpQkFBaUIsRUFDakIsMEJBQTBCLEVBRzFCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsV0FBVyxFQUNYLGdCQUFnQixFQUNqQixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRCxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2xCLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7QUFFbkQ7O0dBRUc7QUF3QkksSUFBTSwwQkFBMEIsR0FBaEMsTUFBTSwwQkFBMEI7SUFzQzNCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBOUNWLElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQUVRLElBQUksQ0FBb0I7SUFDeEIsUUFBUSxHQUEwQixxQkFBcUIsQ0FBQyxPQUFPLENBQUM7SUFDaEUsb0JBQW9CLENBQVU7SUFFaEMsTUFBTSxHQUFlLEVBQUUsQ0FBQztJQUN4QixZQUFZLEdBQWUsRUFBRSxDQUFDO0lBRTlCLFNBQVMsQ0FBeUI7SUFDbEMsU0FBUyxDQUEwQjtJQUNuQyxJQUFJLENBQVU7SUFDZCxjQUFjLENBQVU7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYixnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxTQUFTLENBQUMsQ0FBQztJQUUxRCxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUVoQyxLQUFLLEdBQXlCLElBQUksV0FBVyxDQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO0lBRWhHLGdCQUFnQixHQUF5QixJQUFJLFdBQVcsQ0FBVSxFQUFFLENBQUMsQ0FBQztJQUV0RSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFbkIsV0FBVyxHQUFzQixpQkFBaUIsQ0FBQyxNQUFNLENBQUM7SUFDekQsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFcEMsWUFBWSxDQUEyRDtJQUU5RSxZQUNVLGVBQWdDLEVBQ2hDLG9CQUEwQyxFQUMxQyxZQUEwQixFQUMxQixRQUFrQixFQUNsQixjQUE4QixFQUM5QixlQUFnQyxFQUNoQyxpQkFBb0MsRUFDcEMsU0FBb0IsRUFDcEIsY0FBOEIsRUFDOUIsS0FBd0I7UUFUeEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7SUFDL0IsQ0FBQztJQUVKLFFBQVE7UUFDTixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pELElBQ0UsS0FBSyxDQUFDLEtBQUs7Z0JBQ1gsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMscUNBQXFDLENBQ3RDLENBQ0YsRUFDRCxDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUF3QjtRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBNkI7UUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNmLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBbUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBTztRQUN2QixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUNFLENBQUMsTUFBTTtnQkFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzFDLENBQUM7Z0JBQ0QsSUFDRSxJQUFJLENBQUMsUUFBUSxLQUFLLHFCQUFxQixDQUFDLFNBQVM7b0JBQ2pELElBQUksQ0FBQyxTQUFTLEVBQ2QsQ0FBQztvQkFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDMUIsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ2xCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQy9DLENBQ0YsQ0FBQzs0QkFDRixNQUFNO3dCQUNSLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxLQUFLLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDaEMsY0FBYyxHQUFHLEtBQUssQ0FBQzt3QkFDekIsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO29CQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFDTCxNQUFNO2dCQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDMUMsQ0FBQztnQkFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO29CQUM3QixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE1BQU07UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ25ELFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0I7YUFDdEIsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDbEMsU0FBUyxDQUFDLENBQUMsUUFBbUIsRUFBRSxFQUFFO1lBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDeEMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDWixDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDeEMsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztnQkFDRCxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUsscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEQsTUFBTSxLQUFLLEdBQTBCO2dCQUNuQyxJQUFJLEVBQUUsRUFBRTthQUNULENBQUM7WUFDRixTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUNFLElBQUksQ0FBQyxXQUFXLEtBQUssaUJBQWlCLENBQUMsVUFBVTtZQUNqRCxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLEtBQUssRUFDckMsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLGlEQUFpRDtRQUNwRSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUNqRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0IsWUFBWSxDQUFDLElBQUksQ0FDZixJQUFJLENBQUMsb0JBQW9CO2lCQUN0QixjQUFjLENBQ2IsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxTQUFTLEVBQ2QsUUFBUSxFQUNSLElBQUksQ0FBQyxNQUFNLENBQ1o7aUJBQ0EsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQW1CLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sYUFBYSxHQUFjLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxnQkFBZ0IsR0FBYyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksT0FBTyxDQUFDO2dCQUNaLElBQUksVUFBVSxDQUFDO2dCQUNmLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDM0IsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDdEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTOzRCQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlELGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzVCLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDL0IsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMvQixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BCLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO29CQUN6QixRQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztvQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixDQUFDO2dCQUVELElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQ3ZCLG9DQUFvQyxFQUNwQywrQkFBK0IsRUFDL0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQ25CLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNILENBQ0osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQzthQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQ3ZCLG1DQUFtQyxFQUNuQywrQkFBK0IsRUFDL0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQ25CLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWdCLEVBQUUsTUFBZ0I7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQUMsUUFBbUIsRUFBRSxNQUFnQjtRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hDLElBQ0UsV0FBVyxDQUFDLEtBQUssQ0FBQzt3QkFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTO3dCQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUN4RCxDQUFDLE1BQU0sRUFDUCxDQUFDO3dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDOzRCQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUMvQixDQUFDO3dCQUNELE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO3dCQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUN0QyxJQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7NEJBQzlCLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUMvQixDQUFDOzRCQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLENBQUMsRUFBRSxDQUFDO2dCQUNOLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRTtnQkFDM0MsTUFBTSxXQUFXLEdBQUksUUFBUSxDQUFDLENBQUMsQ0FBUyxDQUFDLFdBQVcsQ0FBQztnQkFDckQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3ZCLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ3hCLE1BQU0sRUFBRSxXQUFXOzRCQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07Z0NBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUMxQyxVQUFVOzRCQUNaLENBQUMsQ0FBQyxTQUFTO3dCQUNiLElBQUksRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7NEJBQ3JCLEtBQUssRUFBRSx5QkFBeUI7eUJBQ2pDLENBQUM7d0JBQ0YsTUFBTSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDekIsS0FBSyxFQUFFLENBQUM7NEJBQ1IsS0FBSyxFQUFFLFFBQVE7eUJBQ2hCLENBQUM7cUJBQ0gsQ0FBQztvQkFDRixNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUN6QixLQUFLLEVBQUUsQ0FBQzt3QkFDUixLQUFLLEVBQUUsUUFBUTtxQkFDaEIsQ0FBQztvQkFDRixJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNyQixLQUFLLEVBQUUseUJBQXlCO3FCQUNqQyxDQUFDO2lCQUNILENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUF1QjtnQkFDbEMsa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsS0FBSyxFQUFFLENBQUMsT0FBTztvQkFDYixDQUFDO29CQUNELEtBQUs7b0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNwQyxxQ0FBcUMsQ0FDdEMsQ0FBVztnQkFDZCxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2dCQUM1QixTQUFTLEVBQUU7b0JBQ1QsSUFBSSxFQUNGLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVTt3QkFDeEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTt3QkFDekIsQ0FBQyxDQUFDLFNBQVM7aUJBQ2hCO2dCQUNELGFBQWEsRUFBRTtvQkFDYixJQUFJLEVBQUUsUUFBUTtvQkFDZCxTQUFTLEVBQUUsSUFBSTtpQkFDYztnQkFDL0IsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1lBRUYsSUFBSSxDQUFDLFlBQVk7aUJBQ2QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2lCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNwQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUMvQyxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7b0JBQ2hFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdkMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUNELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBc0MsQ0FBQztnQkFDbkUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUVyQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXBDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCLENBQUMsUUFBbUIsRUFBRSxFQUFFO1FBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztZQUNULENBQUM7WUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3BELENBQUMsRUFBRSxDQUFDO2dCQUNOLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkMsSUFBSSxLQUFvQixDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixLQUFLLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUNqRSxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQXVCO2dCQUNsQyxrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUs7b0JBQzVCLEdBQUc7b0JBQ0gsQ0FBQztvQkFDRCxLQUFLO29CQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMscUNBQXFDLENBQ3RDLENBQVc7Z0JBQ2QsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsS0FBSztnQkFFTCxhQUFhLEVBQUU7b0JBQ2IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsRUFBRTtvQkFDRixTQUFTLEVBQUUsSUFBSTtvQkFDZixRQUFRLEVBQUUsR0FBRztvQkFDYixJQUFJLEVBQUU7d0JBQ0osS0FBSyxFQUFFLFNBQVM7cUJBQ2pCO2lCQUM0QjthQUNoQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVk7aUJBQ2QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2lCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUMxQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFxQixDQUFDO2dCQUNsRCxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDcEMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FDekMsQ0FBQztnQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQy9DLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNWLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUs7d0JBQ25DLEdBQUc7d0JBQ0gsQ0FBQzt3QkFDRCxLQUFLO3dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMscUNBQXFDLENBQ3RDLENBQVcsQ0FBQztvQkFDZixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsSUFBSTtRQUN4QixJQUFJLEtBQW9CLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUMxQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN4QixLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUN0QixHQUFHLEVBQUUsMEJBQTBCLEdBQUcsR0FBRztpQkFDdEMsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0Q7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxRQUFtQixFQUFFLEVBQUU7UUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDcEQsQ0FBQyxFQUFFLENBQUM7Z0JBQ04sQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBdUI7Z0JBQ2xDLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSztvQkFDNUIsR0FBRztvQkFDSCxDQUFDO29CQUNELEtBQUs7b0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNwQyxxQ0FBcUMsQ0FDdEMsQ0FBVztnQkFDZCxhQUFhLEVBQUU7b0JBQ2IsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsRUFBRTtvQkFDRixTQUFTLEVBQUUsSUFBSTtpQkFDYztnQkFDL0IsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVk7aUJBQ2QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2lCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUMxQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFvQixDQUFDO2dCQUNqRCxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDcEMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FDekMsQ0FBQztnQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQy9DLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNWLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUs7d0JBQ25DLEdBQUc7d0JBQ0gsQ0FBQzt3QkFDRCxLQUFLO3dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMscUNBQXFDLENBQ3RDLENBQVcsQ0FBQztvQkFDZixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQU87UUFDekIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDakQsY0FBYyxFQUFFLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7YUFDdkMsQ0FBQyxDQUFDO1lBQ0gsZ0JBQWdCLENBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQ3ZCLENBQUMsU0FBUyxDQUFDLEVBQ1gsYUFBYSxDQUFDLElBQUksQ0FDbkIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUs7UUFDYixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixPQUFPO1lBQ1QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO3dHQTFsQlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsaUxDckZ2QywyOUNBMkNBLGdNRGtDSSwwQkFBMEIsbVBBQzFCLDBCQUEwQixvY0FFMUIsdUJBQXVCLCtLQUN2QixJQUFJLHdGQUNKLFNBQVM7O0FBR0EsMEJBQTBCO0lBdkJ0QyxhQUFhLENBQUM7UUFDYixJQUFJLEVBQUUsZUFBZTtRQUNyQixLQUFLLEVBQUUscUNBQXFDO1FBQzVDLElBQUksRUFBRSxxQkFBcUI7S0FDNUIsQ0FBQztJQUNGOztPQUVHOztxQ0FzRDBCLGVBQWU7UUFDVixvQkFBb0I7UUFDNUIsWUFBWTtRQUNoQixRQUFRO1FBQ0YsY0FBYztRQUNiLGVBQWU7UUFDYixpQkFBaUI7UUFDekIsU0FBUztRQUNKLGNBQWM7UUFDdkIsaUJBQWlCO0dBL0N2QiwwQkFBMEIsQ0EybEJ0Qzs7NEZBM2xCWSwwQkFBMEI7a0JBZnRDLFNBQVM7K0JBQ0UseUJBQXlCLG1CQUdsQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCwwQkFBMEI7d0JBQzFCLDBCQUEwQjt3QkFDMUIsY0FBYzt3QkFDZCx1QkFBdUI7d0JBQ3ZCLElBQUk7d0JBQ0osU0FBUztxQkFDVjt5VkFPUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEljb25SZWdpc3RyeSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuXG5pbXBvcnQgeyBFbnRpdHlTdG9yZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9lbnRpdHknO1xuaW1wb3J0IHsgU0VMRUNUSU9OX01BUktFUl9JQ09OIH0gZnJvbSAnQGlnbzIvY29tbW9uL2ljb24nO1xuaW1wb3J0IHsgUGFuZWxDb21wb25lbnQgfSBmcm9tICdAaWdvMi9jb21tb24vcGFuZWwnO1xuaW1wb3J0IHsgVG9vbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi90b29sJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgQW55TGF5ZXIsXG4gIEV4cG9ydE9wdGlvbnMsXG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVEZXRhaWxzQ29tcG9uZW50LFxuICBGZWF0dXJlTW90aW9uLFxuICBJZ29NYXAsXG4gIExheWVyU2VydmljZSxcbiAgTWVhc3VyZUxlbmd0aFVuaXQsXG4gIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zLFxuICBTcGF0aWFsRmlsdGVySXRlbUNvbXBvbmVudCxcbiAgU3BhdGlhbEZpbHRlckl0ZW1UeXBlLFxuICBTcGF0aWFsRmlsdGVyUXVlcnlUeXBlLFxuICBTcGF0aWFsRmlsdGVyU2VydmljZSxcbiAgU3BhdGlhbEZpbHRlclRoZW1hdGljLFxuICBTcGF0aWFsRmlsdGVyVHlwZSxcbiAgU3BhdGlhbEZpbHRlclR5cGVDb21wb25lbnQsXG4gIFZlY3RvckxheWVyLFxuICBWZWN0b3JMYXllck9wdGlvbnMsXG4gIGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSxcbiAgZmVhdHVyZVRvT2wsXG4gIGlzTGF5ZXJJdGVtLFxuICBtb3ZlVG9PbEZlYXR1cmVzXG59IGZyb20gJ0BpZ28yL2dlbyc7XG5cbmltcG9ydCBvbEZvcm1hdEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xuaW1wb3J0IG9sU291cmNlQ2x1c3RlciBmcm9tICdvbC9zb3VyY2UvQ2x1c3Rlcic7XG5pbXBvcnQgb2xTb3VyY2VWZWN0b3IgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgKiBhcyBvbHN0eWxlIGZyb20gJ29sL3N0eWxlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1hcFN0YXRlIH0gZnJvbSAnLi4vLi4vbWFwL21hcC5zdGF0ZSc7XG5pbXBvcnQgeyBUb29sU3RhdGUgfSBmcm9tICcuLi8uLi90b29sL3Rvb2wuc3RhdGUnO1xuaW1wb3J0IHsgV29ya3NwYWNlU3RhdGUgfSBmcm9tICcuLi8uLi93b3Jrc3BhY2Uvd29ya3NwYWNlLnN0YXRlJztcbmltcG9ydCB7XG4gIEltcG9ydEV4cG9ydE1vZGUsXG4gIEltcG9ydEV4cG9ydFN0YXRlXG59IGZyb20gJy4vLi4vLi4vaW1wb3J0LWV4cG9ydC9pbXBvcnQtZXhwb3J0LnN0YXRlJztcblxuLyoqXG4gKiBUb29sIHRvIGFwcGx5IHNwYXRpYWwgZmlsdGVyXG4gKi9cbkBUb29sQ29tcG9uZW50KHtcbiAgbmFtZTogJ3NwYXRpYWxGaWx0ZXInLFxuICB0aXRsZTogJ2lnby5pbnRlZ3JhdGlvbi50b29scy5zcGF0aWFsRmlsdGVyJyxcbiAgaWNvbjogU0VMRUNUSU9OX01BUktFUl9JQ09OXG59KVxuLyoqXG4gKiBTcGF0aWFsIEZpbHRlciBUeXBlXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1zcGF0aWFsLWZpbHRlci10b29sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgU3BhdGlhbEZpbHRlclR5cGVDb21wb25lbnQsXG4gICAgU3BhdGlhbEZpbHRlckl0ZW1Db21wb25lbnQsXG4gICAgUGFuZWxDb21wb25lbnQsXG4gICAgRmVhdHVyZURldGFpbHNDb21wb25lbnQsXG4gICAgTmdJZixcbiAgICBBc3luY1BpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRmlsdGVyVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcbiAgfVxuXG4gIEBJbnB1dCgpIHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xuICBASW5wdXQoKSBpdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3M7XG4gIEBJbnB1dCgpIGZyZWVoYW5kRHJhd0lzQWN0aXZlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBsYXllcnM6IEFueUxheWVyW10gPSBbXTtcbiAgcHVibGljIGFjdGl2ZUxheWVyczogQW55TGF5ZXJbXSA9IFtdO1xuXG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGU7XG4gIHB1YmxpYyB0aGVtYXRpY3M6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdO1xuICBwdWJsaWMgem9uZTogRmVhdHVyZTtcbiAgcHVibGljIHpvbmVXaXRoQnVmZmVyOiBGZWF0dXJlO1xuICBwdWJsaWMgYnVmZmVyID0gMDtcblxuICBwdWJsaWMgaXRlcmF0b3IgPSAxO1xuXG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlPih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgZm9ybWF0ID0gbmV3IG9sRm9ybWF0R2VvSlNPTigpO1xuXG4gIHB1YmxpYyBzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pOyAvLyBTdG9yZSB0byBwcmludCByZXN1bHRzIGF0IHRoZSBlbmRcblxuICBwdWJsaWMgc3BhdGlhbExpc3RTdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pO1xuXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIHRoZW1hdGljTGVuZ3RoID0gMDtcblxuICBwdWJsaWMgbWVhc3VyZVVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0ID0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzO1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGRlZmF1bHRTdHlsZTogb2xzdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xzdHlsZS5TdHlsZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXRJY29uUmVnaXN0cnk6IE1hdEljb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHNwYXRpYWxGaWx0ZXJTZXJ2aWNlOiBTcGF0aWFsRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbXBvcnRFeHBvcnRTdGF0ZTogSW1wb3J0RXhwb3J0U3RhdGUsXG4gICAgcHJpdmF0ZSB0b29sU3RhdGU6IFRvb2xTdGF0ZSxcbiAgICBwcml2YXRlIHdvcmtzcGFjZVN0YXRlOiBXb3Jrc3BhY2VTdGF0ZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIuYWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxheWVyLnRpdGxlICYmXG4gICAgICAgIGxheWVyLnRpdGxlLmluY2x1ZGVzKFxuICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0T3V0cHV0VHlwZShldmVudDogU3BhdGlhbEZpbHRlclR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSBldmVudDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldE91dHB1dFF1ZXJ5VHlwZShldmVudDogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZSkge1xuICAgIHRoaXMucXVlcnlUeXBlID0gZXZlbnQ7XG4gICAgaWYgKHRoaXMucXVlcnlUeXBlKSB7XG4gICAgICB0aGlzLmxvYWRGaWx0ZXJMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aXZhdGVFeHBvcnRUb29sKCkge1xuICAgIGNvbnN0IGlkcyA9IFtdO1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXlpvbmUgXFxcXGQrJyk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgaWYgKCFsYXllci50aXRsZS5tYXRjaChyZSkpIHtcbiAgICAgICAgaWRzLnB1c2gobGF5ZXIuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmltcG9ydEV4cG9ydFN0YXRlLnNldE1vZGUoSW1wb3J0RXhwb3J0TW9kZS5leHBvcnQpO1xuICAgIHRoaXMuaW1wb3J0RXhwb3J0U3RhdGUuc2V0c0V4cG9ydE9wdGlvbnMoeyBsYXllcnM6IGlkcyB9IGFzIEV4cG9ydE9wdGlvbnMpO1xuICAgIHRoaXMudG9vbFN0YXRlLnRvb2xib3guYWN0aXZhdGVUb29sKCdpbXBvcnRFeHBvcnQnKTtcbiAgfVxuXG4gIGFjdGl2YXRlV29ya3NwYWNlKHJlY29yZD8pIHtcbiAgICBsZXQgbGF5ZXJUb09wZW5Xa3M7XG4gICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5lbnRpdGllcyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFyZWNvcmQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiZcbiAgICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmFsbCgpLmxlbmd0aCA+IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSA9PT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcyAmJlxuICAgICAgICAgICAgdGhpcy50aGVtYXRpY3NcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy50aGVtYXRpY3MpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGVtYXRpYy56ZXJvUmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGxheWVyVG9PcGVuV2tzID0gdGhpcy5hY3RpdmVMYXllcnMuZmluZCgobGF5ZXIpID0+XG4gICAgICAgICAgICAgICAgICBsYXllci50aXRsZS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhlbWF0aWMubmFtZSArICcgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAnQWRyZXNzZXMgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsYXllci50aXRsZS5pbmNsdWRlcyh0aXRsZSkpIHtcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IGxheWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGF5ZXJUb09wZW5Xa3MpIHtcbiAgICAgICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUud29ya3NwYWNlUGFuZWxFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQobGF5ZXJUb09wZW5Xa3MuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICByZWNvcmQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiZcbiAgICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmFsbCgpLmxlbmd0aCA+IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RXb3Jrc3BhY2VFbnRpdHkocmVjb3JkKTtcbiAgICAgICAgICB0aGlzLm1hcC5vbC5vbignbW92ZWVuZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RXb3Jrc3BhY2VFbnRpdHkocmVjb3JkKSB7XG4gICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5mb3JFYWNoKCh3b3Jrc3BhY2UpID0+IHtcbiAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZS51cGRhdGVBbGwoeyBzZWxlY3RlZDogZmFsc2UgfSk7XG4gICAgICBpZiAod29ya3NwYWNlLnRpdGxlLmluY2x1ZGVzKHJlY29yZC5hZGRlZFswXS5tZXRhLnRpdGxlKSkge1xuICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQod29ya3NwYWNlLmlkKTtcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZU1hbnkocmVjb3JkLmFkZGVkLCB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGaWx0ZXJMaXN0KCkge1xuICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgIC5sb2FkRmlsdGVyTGlzdCh0aGlzLnF1ZXJ5VHlwZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB7XG4gICAgICAgIGZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBpZiAoYS5wcm9wZXJ0aWVzLm5vbSA8IGIucHJvcGVydGllcy5ub20pIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEucHJvcGVydGllcy5ub20gPiBiLnByb3BlcnRpZXMubm9tKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNwYXRpYWxMaXN0U3RvcmUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsTGlzdFN0b3JlLmxvYWQoZmVhdHVyZXMpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRPdXRwdXRUb2dnbGVTZWFyY2goKSB7XG4gICAgdGhpcy5sb2FkVGhlbWF0aWNzKCk7XG4gIH1cblxuICBnZXRPdXRwdXRDbGVhclNlYXJjaCgpIHtcbiAgICB0aGlzLnpvbmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5xdWVyeVR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjbGVhck1hcCgpIHtcbiAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIucmVtb3ZlKC4uLnRoaXMubGF5ZXJzKTtcbiAgICB0aGlzLmxheWVycyA9IFtdO1xuICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XG4gICAgdGhpcy50aGVtYXRpY0xlbmd0aCA9IDA7XG4gICAgdGhpcy5pdGVyYXRvciA9IDE7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xuICAgICAgdGhpcy56b25lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5xdWVyeVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVGhlbWF0aWNzKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgbGV0IHplcm9SZXN1bHRzID0gdHJ1ZTtcbiAgICBsZXQgdGhlbWF0aWNzO1xuICAgIGlmICh0aGlzLmJ1ZmZlciA9PT0gMCB8fCB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XG4gICAgICB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW3RoaXMuem9uZV0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pdGVtVHlwZSAhPT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcykge1xuICAgICAgY29uc3QgdGhlbWU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyA9IHtcbiAgICAgICAgbmFtZTogJydcbiAgICAgIH07XG4gICAgICB0aGVtYXRpY3MgPSBbdGhlbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGVtYXRpY3MgPSB0aGlzLnRoZW1hdGljcztcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuS2lsb21ldGVycyAmJlxuICAgICAgdGhpcy50eXBlICE9PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludFxuICAgICkge1xuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciAqIDEwMDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb24pIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gMDsgLy8gdG8gYXZvaWQgYnVmZmVyIGVudGVyIGEgc2Vjb25kIHRpbWUgaW4gdGVyckFQSVxuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmFibGVzJDogT2JzZXJ2YWJsZTxGZWF0dXJlW10+W10gPSBbXTtcbiAgICB0aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcbiAgICAgIG9ic2VydmFibGVzJC5wdXNoKFxuICAgICAgICB0aGlzLnNwYXRpYWxGaWx0ZXJTZXJ2aWNlXG4gICAgICAgICAgLmxvYWRGaWx0ZXJJdGVtKFxuICAgICAgICAgICAgdGhpcy56b25lLFxuICAgICAgICAgICAgdGhpcy5pdGVtVHlwZSxcbiAgICAgICAgICAgIHRoaXMucXVlcnlUeXBlLFxuICAgICAgICAgICAgdGhlbWF0aWMsXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclxuICAgICAgICAgIClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgoZmVhdHVyZXM6IEZlYXR1cmVbXSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN0b3JlLmluc2VydE1hbnkoZmVhdHVyZXMpO1xuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlc1BvaW50OiBGZWF0dXJlW10gPSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXNMaW5lUG9seTogRmVhdHVyZVtdID0gW107XG4gICAgICAgICAgICAgIGxldCBpZFBvaW50O1xuICAgICAgICAgICAgICBsZXQgaWRMaW5lUG9seTtcbiAgICAgICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5sb25naXR1ZGUgPVxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmxhdGl0dWRlID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzUG9pbnQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkUG9pbnQgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzTGluZVBvbHkucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkTGluZVBvbHkgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB0aGlzLnRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXNQb2ludCwgaWRQb2ludCk7XG4gICAgICAgICAgICAgIHRoaXMudHJ5QWRkTGF5ZXJUb01hcChmZWF0dXJlc0xpbmVQb2x5LCBpZExpbmVQb2x5KTtcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY0xlbmd0aCArPSAxO1xuICAgICAgICAgICAgICAgIHRoZW1hdGljLnplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlbWF0aWMuemVyb1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA+PSAxMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLm1heFNpemVBbGVydCcsXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgeyB0aW1lT3V0OiAxMDAwMCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHplcm9SZXN1bHRzKSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuemVyb1Jlc3VsdHMnLFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci53YXJuaW5nJyxcbiAgICAgICAgICAgIHsgdGltZU91dDogMTAwMDAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25ab25lQ2hhbmdlKGZlYXR1cmU6IEZlYXR1cmUsIGJ1ZmZlcj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnpvbmUgPSBmZWF0dXJlO1xuICAgIGlmIChmZWF0dXJlKSB7XG4gICAgICB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW2ZlYXR1cmVdLCBidWZmZXIpO1xuICAgICAgdGhpcy56b29tVG9GZWF0dXJlRXh0ZW50KGZlYXR1cmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYWRkIHpvbmUgZmVhdHVyZSB0byB0aGUgbWFwIG92ZXJsYXlcbiAgICovXG4gIHB1YmxpYyB0cnlBZGRGZWF0dXJlc1RvTWFwKGZlYXR1cmVzOiBGZWF0dXJlW10sIGJ1ZmZlcj86IGJvb2xlYW4pIHtcbiAgICBsZXQgaSA9IDE7XG4gICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0xheWVySXRlbShsYXllcikgJiZcbiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuX2ludGVybmFsICYmXG4gICAgICAgICAgICBsYXllci5vcHRpb25zLl9pbnRlcm5hbC5jb2RlID09PSBmZWF0dXJlLnByb3BlcnRpZXMuY29kZSAmJlxuICAgICAgICAgICAgIWJ1ZmZlclxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCFsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XG4gICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIucmVtb3ZlKGxheWVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYWN0aXZlTGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICBsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLnJlbW92ZShsYXllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IChfZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IChmZWF0dXJlc1swXSBhcyBhbnkpLmNvb3JkaW5hdGVzO1xuICAgICAgICByZXR1cm4gbmV3IG9sc3R5bGUuU3R5bGUoe1xuICAgICAgICAgIGltYWdlOiBuZXcgb2xzdHlsZS5DaXJjbGUoe1xuICAgICAgICAgICAgcmFkaXVzOiBjb29yZGluYXRlc1xuICAgICAgICAgICAgICA/IHRoaXMuYnVmZmVyIC9cbiAgICAgICAgICAgICAgICBNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAgICAgICAgIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaWxsOiBuZXcgb2xzdHlsZS5GaWxsKHtcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDIwMCwgMjAwLCAyMCwgMC4yKSdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3Ryb2tlOiBuZXcgb2xzdHlsZS5TdHJva2Uoe1xuICAgICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgICAgY29sb3I6ICdvcmFuZ2UnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0cm9rZTogbmV3IG9sc3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgY29sb3I6ICdvcmFuZ2UnXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZmlsbDogbmV3IG9sc3R5bGUuRmlsbCh7XG4gICAgICAgICAgICBjb2xvcjogJ3JnYmEoMjAwLCAyMDAsIDIwLCAwLjIpJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3B0aW9uczogVmVjdG9yTGF5ZXJPcHRpb25zID0ge1xuICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgICAgIHRpdGxlOiAoJ1pvbmUgJyArXG4gICAgICAgICAgaSArXG4gICAgICAgICAgJyAtICcgK1xuICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICkpIGFzIHN0cmluZyxcbiAgICAgICAgd29ya3NwYWNlOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgX2ludGVybmFsOiB7XG4gICAgICAgICAgY29kZTpcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZFxuICAgICAgICAgICAgICA/IGZlYXR1cmUucHJvcGVydGllcy5jb2RlXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZU9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgICAgICBxdWVyeWFibGU6IHRydWVcbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5sYXllclNlcnZpY2VcbiAgICAgICAgLmNyZWF0ZUFzeW5jTGF5ZXIob3B0aW9ucylcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobGF5ZXI6IFZlY3RvckxheWVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcCgoZikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGYsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQgPyAnQ2VyY2xlJyA6ICdQb2x5Z29uZSc7XG4gICAgICAgICAgICBmZWF0dXJlc09sWzBdLnNldCgnbm9tJywgJ1pvbmUnLCB0cnVlKTtcbiAgICAgICAgICAgIGZlYXR1cmVzT2xbMF0uc2V0KCd0eXBlJywgdHlwZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9sID0gbGF5ZXIuZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZVZlY3RvciB8IG9sU291cmNlQ2x1c3RlcjtcbiAgICAgICAgICBvbC5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcbiAgICAgICAgICBsYXllci5vbC5zZXRTdHlsZSh0aGlzLmRlZmF1bHRTdHlsZSk7XG5cbiAgICAgICAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIuYWRkKGxheWVyKTtcblxuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFkZCBwb2ludCBmZWF0dXJlcyB0byB0aGUgbWFwXG4gICAqIE5lY2Vzc2FyeSB0byBjcmVhdGUgY2x1c3RlcnNcbiAgICovXG4gIHByaXZhdGUgdHJ5QWRkUG9pbnRUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBpZCkge1xuICAgIGxldCBpID0gMTtcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5tYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aChmZWF0dXJlc1swXS5tZXRhLnRpdGxlKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpY29uID0gZmVhdHVyZXNbMF0ubWV0YS5pY29uO1xuICAgICAgbGV0IHN0eWxlOiBvbHN0eWxlLlN0eWxlO1xuICAgICAgaWYgKCFpY29uKSB7XG4gICAgICAgIHN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZSA9IHRoaXMuY3JlYXRlU3ZnSWNvbihpY29uKSB8fCBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9uczogVmVjdG9yTGF5ZXJPcHRpb25zID0ge1xuICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgICAgIHRpdGxlOiAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICBpICtcbiAgICAgICAgICAnIC0gJyArXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXG4gICAgICAgICAgKSkgYXMgc3RyaW5nLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBzdHlsZSxcblxuICAgICAgICBzb3VyY2VPcHRpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2NsdXN0ZXInLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogMTIwLFxuICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnQ2x1c3RlcidcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnNcbiAgICAgIH07XG4gICAgICB0aGlzLmxheWVyU2VydmljZVxuICAgICAgICAuY3JlYXRlQXN5bmNMYXllcihvcHRpb25zKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChsYXllcjogVmVjdG9yTGF5ZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZVRvT2woZmVhdHVyZSwgdGhpcy5tYXAucHJvamVjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgb2wgPSBsYXllci5kYXRhU291cmNlLm9sIGFzIG9sU291cmNlQ2x1c3RlcjtcbiAgICAgICAgICBvbC5nZXRTb3VyY2UoKS5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0xheWVyID0gdGhpcy5sYXllcnMuZmluZChcbiAgICAgICAgICAgIChwcmV2TGF5ZXIpID0+IHByZXZMYXllci5pZCA9PT0gbGF5ZXIuaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwcmV2aW91c0xheWVyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIucmVtb3ZlKHByZXZpb3VzTGF5ZXIpO1xuICAgICAgICAgICAgaSA9IGkgLSAxO1xuICAgICAgICAgICAgbGF5ZXIudGl0bGUgPSAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArXG4gICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAnIC0gJyArXG4gICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcbiAgICAgICAgICAgICAgKSkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy50aXRsZSA9IGxheWVyLnRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaTtcbiAgICAgICAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIuYWRkKGxheWVyKTtcbiAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICB0aGlzLnB1c2hMYXllcihsYXllcik7XG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3ZnSWNvbihpY29uKTogb2xzdHlsZS5TdHlsZSB7XG4gICAgbGV0IHN0eWxlOiBvbHN0eWxlLlN0eWxlO1xuICAgIHRoaXMubWF0SWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihpY29uKS5zdWJzY3JpYmUoKHN2Z09iaikgPT4ge1xuICAgICAgY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCd3aWR0aCcsICczMCcpO1xuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzMwJyk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdmaWxsJywgJ3JnYmEoMCwgMTI4LCAyNTUpJyk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnd2hpdGUnKTtcbiAgICAgIGNvbnN0IHN2ZyA9IHhtbFNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoc3ZnT2JqKTtcbiAgICAgIHN0eWxlID0gbmV3IG9sc3R5bGUuU3R5bGUoe1xuICAgICAgICBpbWFnZTogbmV3IG9sc3R5bGUuSWNvbih7XG4gICAgICAgICAgc3JjOiAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArIHN2Z1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIC8qKlxuICAgKiBUcnkgdG8gYWRkIGxpbmUgb3IgcG9seWdvbiBmZWF0dXJlcyB0byB0aGUgbWFwXG4gICAqL1xuICBwcml2YXRlIHRyeUFkZExheWVyVG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgaWQpIHtcbiAgICBsZXQgaSA9IDE7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMubWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSkpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3B0aW9uczogVmVjdG9yTGF5ZXJPcHRpb25zID0ge1xuICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgICAgIHRpdGxlOiAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICBpICtcbiAgICAgICAgICAnIC0gJyArXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXG4gICAgICAgICAgKSkgYXMgc3RyaW5nLFxuICAgICAgICBzb3VyY2VPcHRpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ3ZlY3RvcicsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlXG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgIH07XG4gICAgICB0aGlzLmxheWVyU2VydmljZVxuICAgICAgICAuY3JlYXRlQXN5bmNMYXllcihvcHRpb25zKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChsYXllcjogVmVjdG9yTGF5ZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZVRvT2woZmVhdHVyZSwgdGhpcy5tYXAucHJvamVjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgb2wgPSBsYXllci5kYXRhU291cmNlLm9sIGFzIG9sU291cmNlVmVjdG9yO1xuICAgICAgICAgIG9sLmFkZEZlYXR1cmVzKGZlYXR1cmVzT2wpO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzTGF5ZXIgPSB0aGlzLmxheWVycy5maW5kKFxuICAgICAgICAgICAgKHByZXZMYXllcikgPT4gcHJldkxheWVyLmlkID09PSBsYXllci5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHByZXZpb3VzTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLmxheWVyQ29udHJvbGxlci5yZW1vdmUocHJldmlvdXNMYXllcik7XG4gICAgICAgICAgICBpID0gaSAtIDE7XG4gICAgICAgICAgICBsYXllci50aXRsZSA9IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICtcbiAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgaSArXG4gICAgICAgICAgICAgICcgLSAnICtcbiAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICAgICApKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICBsYXllci5vcHRpb25zLnRpdGxlID0gbGF5ZXIudGl0bGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubWFwLmxheWVyQ29udHJvbGxlci5hZGQobGF5ZXIpO1xuICAgICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgIHRoaXMucHVzaExheWVyKGxheWVyKTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgem9vbVRvRmVhdHVyZUV4dGVudChmZWF0dXJlKSB7XG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIGNvbnN0IG9sRmVhdHVyZSA9IHRoaXMuZm9ybWF0LnJlYWRGZWF0dXJlKGZlYXR1cmUsIHtcbiAgICAgICAgZGF0YVByb2plY3Rpb246IGZlYXR1cmUucHJvamVjdGlvbixcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb25cbiAgICAgIH0pO1xuICAgICAgbW92ZVRvT2xGZWF0dXJlcyhcbiAgICAgICAgdGhpcy5tYXAudmlld0NvbnRyb2xsZXIsXG4gICAgICAgIFtvbEZlYXR1cmVdLFxuICAgICAgICBGZWF0dXJlTW90aW9uLlpvb21cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVzaExheWVyKGxheWVyKSB7XG4gICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5hY3RpdmVMYXllcnMpIHtcbiAgICAgIGlmIChsYXkuaWQgPT09IGxheWVyLmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZUxheWVycy5wdXNoKGxheWVyKTtcbiAgfVxufVxuIiwiPGlnby1zcGF0aWFsLWZpbHRlci10eXBlXG4gIFtzdG9yZV09XCJzcGF0aWFsTGlzdFN0b3JlXCJcbiAgW3NlbGVjdGVkUXVlcnlUeXBlXT1cInF1ZXJ5VHlwZVwiXG4gIFt6b25lXT1cInpvbmVcIlxuICBbbGF5ZXJzXT1cImFjdGl2ZUxheWVyc1wiXG4gIChldmVudFR5cGUpPVwiZ2V0T3V0cHV0VHlwZSgkZXZlbnQpXCJcbiAgKGV2ZW50UXVlcnlUeXBlKT1cImdldE91dHB1dFF1ZXJ5VHlwZSgkZXZlbnQpXCJcbiAgKHpvbmVDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudClcIlxuICAoem9uZVdpdGhCdWZmZXJDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAoYnVmZmVyQ2hhbmdlKT1cImJ1ZmZlciA9ICRldmVudFwiXG4gIChtZWFzdXJlVW5pdENoYW5nZSk9XCJtZWFzdXJlVW5pdCA9ICRldmVudFwiXG4+XG48L2lnby1zcGF0aWFsLWZpbHRlci10eXBlPlxuXG48aWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW1cbiAgW3R5cGVdPVwidHlwZVwiXG4gIFtxdWVyeVR5cGVdPVwicXVlcnlUeXBlXCJcbiAgW21hcF09XCJtYXBcIlxuICBbem9uZV09XCJ6b25lXCJcbiAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gIFtzdG9yZV09XCJzdG9yZVwiXG4gIFtsYXllcnNdPVwiYWN0aXZlTGF5ZXJzXCJcbiAgW2FsbExheWVyc109XCJsYXllcnNcIlxuICBbdGhlbWF0aWNMZW5ndGhdPVwidGhlbWF0aWNMZW5ndGhcIlxuICAocmFkaXVzRXZlbnQpPVwiYnVmZmVyID0gJGV2ZW50XCJcbiAgKGJ1ZmZlckV2ZW50KT1cImJ1ZmZlciA9ICRldmVudFwiXG4gIChtZWFzdXJlVW5pdENoYW5nZSk9XCJtZWFzdXJlVW5pdCA9ICRldmVudFwiXG4gIChmcmVlaGFuZENvbnRyb2wpPVwiZnJlZWhhbmREcmF3SXNBY3RpdmUgPSAkZXZlbnRcIlxuICAoZHJhd1pvbmVFdmVudCk9XCJ6b25lID0gJGV2ZW50XCJcbiAgKHpvbmVXaXRoQnVmZmVyQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQsIHRydWUpXCJcbiAgKGl0ZW1UeXBlQ2hhbmdlKT1cIml0ZW1UeXBlID0gJGV2ZW50XCJcbiAgKHRoZW1hdGljQ2hhbmdlKT1cInRoZW1hdGljcyA9ICRldmVudFwiXG4gICh0b2dnbGVTZWFyY2gpPVwiZ2V0T3V0cHV0VG9nZ2xlU2VhcmNoKClcIlxuICAoY2xlYXJCdXR0b25FdmVudCk9XCJjbGVhck1hcCgpXCJcbiAgKGNsZWFyU2VhcmNoRXZlbnQpPVwiZ2V0T3V0cHV0Q2xlYXJTZWFyY2goKVwiXG4gIChleHBvcnQpPVwiYWN0aXZhdGVFeHBvcnRUb29sKClcIlxuICAob3BlbldvcmtzcGFjZSk9XCJhY3RpdmF0ZVdvcmtzcGFjZSgpXCJcbiAgKGVudGl0eUNoYW5nZSk9XCJhY3RpdmF0ZVdvcmtzcGFjZSgkZXZlbnQpXCJcbj5cbjwvaWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW0+XG48bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGZWF0dXJlJCB8IGFzeW5jIGFzIGZlYXR1cmVcIj5cbiAgPGlnby1mZWF0dXJlLWRldGFpbHMgW2ZlYXR1cmVdPVwiZmVhdHVyZVwiPjwvaWdvLWZlYXR1cmUtZGV0YWlscz5cbjwvbmctY29udGFpbmVyPlxuIl19