@kando-env/kando-ui 1.2.121-alpha.4 → 1.2.121

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 (30) hide show
  1. package/lib/Widgets/Map/Map.js +163 -40
  2. package/lib/Widgets/Map/areas/AreaPolygon.js +2 -2
  3. package/lib/Widgets/Map/events/EventIndicator.js +46 -21
  4. package/lib/Widgets/Map/events/EventIndicatorHover.js +252 -0
  5. package/lib/Widgets/Map/events/EventPath.js +38 -16
  6. package/lib/Widgets/Map/events/EventPathHover.js +81 -0
  7. package/lib/Widgets/Map/events/NetworkForSpecificEvent.js +117 -3
  8. package/lib/Widgets/Map/points/PointMarker.js +472 -10
  9. package/lib/Widgets/Map/points/PointMarkers.js +17 -24
  10. package/lib/i18n/en.json +4 -0
  11. package/lib/i18n/he.json +5 -0
  12. package/lib/macros/getVersion.js +2 -2
  13. package/lib/pages/EventsPage/EventsMapContainer/EventsMapContainer.js +4 -1
  14. package/lib/pages/EventsPage/events/events_list/EventsList.js +8 -25
  15. package/lib/pages/EventsPage/events/events_list/Filter/FilterContainer.js +2 -2
  16. package/lib/pages/SamplingsPage/SamplingProperties/ImageUpload.js +2 -2
  17. package/lib/pages/SamplingsPage/SamplingProperties/SamplerInProcess.js +57 -0
  18. package/lib/pages/SamplingsPage/SamplingProperties/SamplingProperties.js +12 -9
  19. package/lib/pages/SamplingsPage/SamplingProperties/SamplingPropertiesForm.js +6 -8
  20. package/lib/pages/SamplingsPage/SamplingProperties/samplingPropertiesUtils.js +1 -1
  21. package/lib/pages/SamplingsPage/SamplingProperties/style.module.scss +3 -0
  22. package/lib/pages/SamplingsPage/SamplingProperties/styles.js +27 -0
  23. package/package.json +1 -1
  24. package/lib/Widgets/Map/MapUtils.js +0 -102
  25. package/lib/Widgets/Map/events/Event.js +0 -69
  26. package/lib/Widgets/Map/events/EventUtils.js +0 -245
  27. package/lib/Widgets/Map/events/PointOfEvent.js +0 -142
  28. package/lib/Widgets/Map/events/PointsForSpecificEvent.js +0 -66
  29. package/lib/Widgets/Map/events/Snail.js +0 -60
  30. package/lib/Widgets/Map/points/PointUtils.js +0 -373
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  var _typeof = require("@babel/runtime/helpers/typeof");
4
6
 
5
7
  Object.defineProperty(exports, "__esModule", {
@@ -7,39 +9,499 @@ Object.defineProperty(exports, "__esModule", {
7
9
  });
8
10
  exports.default = void 0;
9
11
 
12
+ var _jquery = _interopRequireDefault(require("jquery"));
13
+
10
14
  var _react = _interopRequireWildcard(require("react"));
11
15
 
16
+ var _reactDom = _interopRequireDefault(require("react-dom"));
17
+
12
18
  var _reactRedux = require("react-redux");
13
19
 
20
+ var _lineChart = _interopRequireDefault(require("assets/line-chart.svg"));
21
+
22
+ var _pinWater = _interopRequireDefault(require("assets/map/pin-water.svg"));
23
+
24
+ var _waterNoBackground = _interopRequireDefault(require("assets/point_icons/water-no-background.svg"));
25
+
26
+ var _blueCircle = _interopRequireDefault(require("assets/point_icons/blue-circle.svg"));
27
+
28
+ var _brightBlueCircle = _interopRequireDefault(require("assets/point_icons/bright-blue-circle.svg"));
29
+
30
+ var _factoryIcon = _interopRequireDefault(require("assets/point_icons/factory-icon.svg"));
31
+
32
+ var _greenCircle = _interopRequireDefault(require("assets/point_icons/green-circle.svg"));
33
+
34
+ var _observationIcon = _interopRequireDefault(require("assets/point_icons/observation-icon.svg"));
35
+
36
+ var _pinkCircle = _interopRequireDefault(require("assets/point_icons/pink-circle.svg"));
37
+
38
+ var _pumpStationIcon = _interopRequireDefault(require("assets/point_icons/pump-station-icon.svg"));
39
+
40
+ var _redPinRedShadow = _interopRequireDefault(require("assets/point_icons/red-pin-red-shadow.png"));
41
+
42
+ var _samplingIcon = _interopRequireDefault(require("assets/point_icons/sampling-icon.svg"));
43
+
44
+ var _whitePinBlackShadow = _interopRequireDefault(require("assets/point_icons/white-pin-black-shadow.png"));
45
+
46
+ var _whitePinRedShadow = _interopRequireDefault(require("assets/point_icons/white-pin-red-shadow.png"));
47
+
48
+ var _WWTPIcon = _interopRequireDefault(require("assets/point_icons/WWTP-icon.svg"));
49
+
50
+ var _yellowCircle = _interopRequireDefault(require("assets/point_icons/yellow-circle.svg"));
51
+
52
+ var _whitePoint = _interopRequireDefault(require("assets/white-point.png"));
53
+
54
+ var _Sector = _interopRequireDefault(require("components/Sector"));
55
+
14
56
  var _useRemoveExistingLayers = _interopRequireWildcard(require("hooks/useRemoveExistingLayers"));
15
57
 
16
- var _PointUtils = require("./PointUtils");
58
+ var _actions = require("store/global/actions");
59
+
60
+ var _i18n = _interopRequireDefault(require("utilities/i18n"));
61
+
62
+ var _TimeFormat = _interopRequireDefault(require("utilities/TimeFormat"));
17
63
 
18
64
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
65
 
20
66
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
67
 
22
68
  function mapStateToProps(state) {
23
- var events_data = state.events_data;
69
+ var events_data = state.events_data,
70
+ edges_data = state.edges_data;
24
71
  return {
25
- events_data: events_data
72
+ events_data: events_data,
73
+ edges_data: edges_data
26
74
  };
27
75
  }
28
76
 
29
77
  var PointMarker = function PointMarker(props) {
30
- var map = props.map,
78
+ var L = props.L,
79
+ map = props.map,
31
80
  point = props.point,
32
- rerender = props.rerender;
81
+ events_data = props.events_data,
82
+ edges_data = props.edges_data;
83
+ var focusedEvent = events_data.focusedEvent,
84
+ hoveredEvent = events_data.hoveredEvent;
85
+ var dispatch = (0, _reactRedux.useDispatch)();
86
+ var centeredEvent = (0, _react.useMemo)(function () {
87
+ return focusedEvent || hoveredEvent;
88
+ }, [focusedEvent, hoveredEvent]); // iconSize: [width, height],
89
+ // Icon Anchor: [(-right)(+left), (-down)(+up)]
90
+
91
+ var selectedBackground = function selectedBackground() {
92
+ return L.icon({
93
+ iconUrl: _redPinRedShadow.default,
94
+ iconSize: [67, 70],
95
+ iconAnchor: [32, 54],
96
+ popupAnchor: [0, -30]
97
+ });
98
+ };
99
+
100
+ var belongsToSourceBackground = function belongsToSourceBackground() {
101
+ return L.icon({
102
+ iconUrl: _whitePinRedShadow.default,
103
+ iconSize: [67, 70],
104
+ iconAnchor: [32, 54],
105
+ popupAnchor: [0, -30]
106
+ });
107
+ };
108
+
109
+ var standardBackground = function standardBackground() {
110
+ var secondary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
111
+ var third = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
112
+ return L.icon({
113
+ iconUrl: _whitePinBlackShadow.default,
114
+ iconSize: secondary ? [20, 20] : [43, 46],
115
+ iconAnchor: secondary && third ? [-2, 19] : secondary ? [-2, 44] : [20, 42],
116
+ popupAnchor: [0, -30]
117
+ });
118
+ };
119
+
120
+ var combinedFactoryIcon = [L.icon({
121
+ iconUrl: _yellowCircle.default,
122
+ iconSize: [25, 24],
123
+ iconAnchor: [10.7, 33.7],
124
+ popupAnchor: [0, -30]
125
+ }), L.icon({
126
+ iconUrl: _factoryIcon.default,
127
+ iconSize: [15, 15],
128
+ iconAnchor: [5, 30],
129
+ popupAnchor: [0, -30]
130
+ })];
131
+ var combinedPumpStationIcon = [L.icon({
132
+ iconUrl: _greenCircle.default,
133
+ iconSize: [25, 24],
134
+ iconAnchor: [10.7, 33.7],
135
+ popupAnchor: [0, -30]
136
+ }), L.icon({
137
+ iconUrl: _pumpStationIcon.default,
138
+ iconSize: [20, 20],
139
+ iconAnchor: [7, 32],
140
+ popupAnchor: [0, -30]
141
+ })];
142
+ var combinedCollectorsIcon = [L.icon({
143
+ iconUrl: _pinWater.default,
144
+ iconSize: [45, 45],
145
+ iconAnchor: [25, 50],
146
+ popupAnchor: [0, -30]
147
+ })];
148
+ var combinedWWTPIcon = [L.icon({
149
+ iconUrl: _brightBlueCircle.default,
150
+ iconSize: [25, 25],
151
+ iconAnchor: [10.7, 33.7],
152
+ popupAnchor: [0, -30]
153
+ }), L.icon({
154
+ iconUrl: _WWTPIcon.default,
155
+ iconSize: [20, 20],
156
+ iconAnchor: [8, 31],
157
+ popupAnchor: [0, -30]
158
+ })];
159
+
160
+ var markerBelongsToSelectedSource = function markerBelongsToSelectedSource() {
161
+ var source;
162
+
163
+ if (centeredEvent !== null) {
164
+ source = centeredEvent.sources.filter(function (source) {
165
+ return source.point_id === point.id;
166
+ })[0];
167
+ }
168
+
169
+ return centeredEvent !== null && source && centeredEvent.selected_source === source.point_id;
170
+ };
171
+
172
+ var markerBelongsToSource = function markerBelongsToSource() {
173
+ return centeredEvent !== null && centeredEvent.sources.filter(function (source) {
174
+ return source.point_id === point.id;
175
+ })[0];
176
+ };
177
+
178
+ var isCollectorFocused = function isCollectorFocused(point) {
179
+ var _centeredEvent$observ;
180
+
181
+ return (centeredEvent === null || centeredEvent === void 0 ? void 0 : (_centeredEvent$observ = centeredEvent.observations) === null || _centeredEvent$observ === void 0 ? void 0 : _centeredEvent$observ.length) === 1 && point.id === centeredEvent.observations[0].point_id;
182
+ };
183
+
184
+ var matchIconToPoint = function matchIconToPoint(point) {
185
+ switch (point.group.type) {
186
+ case 'Groups::Factory':
187
+ if (combinedFactoryIcon.length === 2) {
188
+ if (markerBelongsToSelectedSource()) {
189
+ combinedFactoryIcon.unshift(selectedBackground());
190
+ } else if (markerBelongsToSource()) {
191
+ combinedFactoryIcon.unshift(belongsToSourceBackground());
192
+ } else {
193
+ combinedFactoryIcon.unshift(standardBackground());
194
+ }
195
+ }
196
+
197
+ return combinedFactoryIcon;
198
+
199
+ case 'Groups::PumpStation':
200
+ if (combinedPumpStationIcon.length === 2) {
201
+ if (markerBelongsToSelectedSource()) {
202
+ combinedPumpStationIcon.unshift(selectedBackground());
203
+ } else if (markerBelongsToSource()) {
204
+ combinedPumpStationIcon.unshift(belongsToSourceBackground());
205
+ } else {
206
+ combinedPumpStationIcon.unshift(standardBackground());
207
+ }
208
+ }
209
+
210
+ return combinedPumpStationIcon;
211
+
212
+ case 'Groups::WastewaterTreatmentPlant':
213
+ if (combinedWWTPIcon.length === 2) {
214
+ if (markerBelongsToSelectedSource()) {
215
+ combinedWWTPIcon.unshift(selectedBackground());
216
+ } else if (markerBelongsToSource()) {
217
+ combinedWWTPIcon.unshift(belongsToSourceBackground());
218
+ } else {
219
+ combinedWWTPIcon.unshift(standardBackground());
220
+ }
221
+ }
222
+
223
+ return combinedWWTPIcon;
224
+
225
+ case 'Groups::Collectors':
226
+ if (isCollectorFocused(point)) {
227
+ return [L.icon({
228
+ iconUrl: _redPinRedShadow.default,
229
+ iconSize: [62, 62],
230
+ iconAnchor: [30, 52]
231
+ }), L.icon({
232
+ iconUrl: _waterNoBackground.default,
233
+ iconSize: [46, 46],
234
+ iconAnchor: [22, 44],
235
+ popupAnchor: [0, -30]
236
+ })];
237
+ }
238
+
239
+ return combinedCollectorsIcon;
240
+
241
+ default:
242
+ return null;
243
+ }
244
+ };
245
+
246
+ var createManholePoint = function createManholePoint(markerLocation) {
247
+ var pointIcon = L.icon({
248
+ iconUrl: _whitePoint.default,
249
+ iconSize: [9, 9],
250
+ iconAnchor: [4.5, 4.5]
251
+ });
252
+ var manholeIcon = L.marker(markerLocation, {
253
+ icon: pointIcon,
254
+ riseOnHover: true
255
+ }).addTo(map);
256
+ manholeIcon.bindTooltip("".concat(point.group.name, " (").concat(point.id, ")"));
257
+ manholeIcon['kando_object_id'] = point.id;
258
+ manholeIcon['kando_object'] = 'Point';
259
+ };
260
+
261
+ var createCustomIconPoint = function createCustomIconPoint(markerLocation) {
262
+ // @ts-ignore
263
+ matchIconToPoint(point) !== null && // @ts-ignore
264
+ matchIconToPoint(point).forEach(function (icon) {
265
+ var pointCustomIcon = L.marker(markerLocation, {
266
+ icon: icon,
267
+ riseOnHover: false
268
+ }).addTo(map);
269
+ pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.id, ")"));
270
+ pointCustomIcon['kando_object_id'] = point.id;
271
+ pointCustomIcon['kando_object'] = 'Point';
272
+ });
273
+
274
+ if (point.relatedEventsAmount) {
275
+ var pointCustomIcon = L.marker(markerLocation, {
276
+ icon: L.divIcon({
277
+ className: "\n ".concat(point.relatedEventsAmount >= 100 ? 'circle-events-amount circle-events-amount--tridigit' : 'circle-events-amount', " \n ").concat(point.relatedEventsAmount > 2 ? 'alert-color' : '', "\n "),
278
+ html: "<p>".concat(point.relatedEventsAmount, "</p>"),
279
+ iconAnchor: [-5, 42]
280
+ }),
281
+ riseOnHover: false
282
+ }).addTo(map);
283
+ pointCustomIcon['kando_object_id'] = point.id;
284
+ pointCustomIcon['kando_object'] = 'IconNumber';
285
+ }
286
+ };
287
+
288
+ var createSamplingIconPoint = function createSamplingIconPoint(markerLocation, secondaryIcon) {
289
+ // iconSize: [width, height],
290
+ // Icon Anchor: [(-right)(+left), (-down)(+up)]
291
+ var samplingIcon = [L.icon({
292
+ iconUrl: _blueCircle.default,
293
+ iconSize: secondaryIcon ? [10, 10] : [25, 24],
294
+ iconAnchor: secondaryIcon ? [-7, 15] : [10.7, 33.7],
295
+ popupAnchor: [0, -30]
296
+ }), L.icon({
297
+ iconUrl: _samplingIcon.default,
298
+ iconSize: secondaryIcon ? [7, 7] : [13, 15],
299
+ iconAnchor: secondaryIcon ? [-8, 13] : [5, 30],
300
+ popupAnchor: [0, -30]
301
+ })];
302
+
303
+ if (markerBelongsToSelectedSource() && !secondaryIcon) {
304
+ samplingIcon.unshift(selectedBackground());
305
+ } else if (markerBelongsToSource() && !secondaryIcon) {
306
+ samplingIcon.unshift(belongsToSourceBackground());
307
+ } else {
308
+ samplingIcon.unshift(standardBackground(secondaryIcon, true));
309
+ }
310
+
311
+ samplingIcon.forEach(function (icon) {
312
+ var pointCustomIcon = L.marker(markerLocation, {
313
+ icon: icon,
314
+ riseOnHover: false
315
+ }).addTo(map);
316
+ pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.id, ")"));
317
+ pointCustomIcon['kando_object_id'] = point.id;
318
+ pointCustomIcon['kando_object'] = 'Sampling';
319
+ });
320
+ };
321
+
322
+ var createObservationIconPoint = function createObservationIconPoint(markerLocation, secondaryIcon) {
323
+ // iconSize: [width, height],
324
+ // Icon Anchor: [(-right)(+left), (-down)(+up)]
325
+ var observationIcon = [L.icon({
326
+ iconUrl: _pinkCircle.default,
327
+ iconSize: secondaryIcon ? [10, 10] : [25, 24],
328
+ iconAnchor: secondaryIcon ? [-7, 40] : [10.7, 33.7],
329
+ popupAnchor: [0, -30]
330
+ }), L.icon({
331
+ iconUrl: _observationIcon.default,
332
+ iconSize: secondaryIcon ? [7, 7] : [13, 15],
333
+ iconAnchor: secondaryIcon ? [-8, 38] : [5, 30],
334
+ popupAnchor: [0, -30]
335
+ })];
336
+
337
+ if (markerBelongsToSelectedSource() && !secondaryIcon) {
338
+ observationIcon.unshift(selectedBackground());
339
+ } else if (markerBelongsToSource() && !secondaryIcon) {
340
+ observationIcon.unshift(belongsToSourceBackground());
341
+ } else {
342
+ observationIcon.unshift(standardBackground(secondaryIcon));
343
+ }
344
+
345
+ observationIcon.forEach(function (icon) {
346
+ var pointCustomIcon = L.marker(markerLocation, {
347
+ icon: icon,
348
+ riseOnHover: false
349
+ }).addTo(map);
350
+ pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.id, ")"));
351
+ pointCustomIcon['kando_object_id'] = point.id;
352
+ pointCustomIcon['kando_object'] = 'Observation';
353
+ });
354
+ };
355
+
356
+ var popupContent = function popupContent(obs) {
357
+ if (obs === null) {
358
+ return "\n <div class=\"event-popup\">\n <div class=\"popup-graph-icon popup-graph-icon-".concat(point.id, "\">\n <img src=\"").concat(_lineChart.default, "\"/>\n </div>\n <div class=\"popup-content\">\n <h5 class=\"popup-content__site-name\"><b>").concat(point.group.name, "</b></h5>\n <hr/>\n \n <div id=\"sector\"></div>\n </div>\n </div>\n ");
359
+ } else {
360
+ return "\n <div class=\"event-popup\">\n <div class=\"popup-graph-icon popup-graph-icon-".concat(obs.id, "\">\n <img src=\"").concat(_lineChart.default, "\"/>\n </div>\n <div class=\"popup-content\">\n <h5 class=\"popup-content__site-name\"><b>").concat(point.group.name, "</b></h5>\n <div class=\"popup-content__severity\">\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.severity"), "</p>\n <span class=\"").concat('popup-content__severity--' + obs.severity, "\">\n <b class=\"popup-content__severity-b\">\n ").concat(_i18n.default.t("events_overview.severities.".concat(obs.severity)), "\n </b>\n </span>\n </div>\n \n <hr class=\"popup-content__hr\" />\n\n <div class=\"popup-content__discharge-time\">\n <div>\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.first_seen"), ":</p>\n <span><b id=\"first-seen-popup\"></b></span>\n </div>\n <div>\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.last_seen"), ":</p>\n <span><b id=\"last-seen-popup\"></b></span>\n </div> \n </div>\n </div>\n </div>\n ");
361
+ }
362
+ };
363
+
33
364
  (0, _useRemoveExistingLayers.default)(map, point, 'Point');
34
365
  (0, _useRemoveExistingLayers.default)(map, point, 'Observation');
35
366
  (0, _useRemoveExistingLayers.default)(map, point, 'Sampling');
36
367
  (0, _useRemoveExistingLayers.default)(map, point, 'IconNumber');
37
368
 
369
+ var pointIsObservation = function pointIsObservation() {
370
+ return centeredEvent !== null && centeredEvent.observations.filter(function (obs) {
371
+ return obs.point_id === point.id;
372
+ })[0];
373
+ };
374
+
375
+ var pointBelongsToEvent = function pointBelongsToEvent() {
376
+ return true;
377
+ };
378
+
379
+ var bindPopupToPoint = function bindPopupToPoint() {
380
+ var obs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
381
+ var layers = map._layers;
382
+
383
+ var _loop = function _loop(property) {
384
+ if (['Point', 'Observation'].includes(layers[property].kando_object) && layers[property].kando_object_id === point.id) {
385
+ layers[property].bindPopup(popupContent(obs), {
386
+ minWidth: 200
387
+ });
388
+ layers[property].on('popupopen', function (e) {
389
+ if (focusedEvent !== null) {
390
+ var firstSeen = document.createElement('div');
391
+ var lastSeen = document.createElement('div');
392
+ var sector = document.createElement('div');
393
+
394
+ if (obs !== null) {
395
+ _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_TimeFormat.default, {
396
+ timestamp: obs.start_time,
397
+ time_zone: obs.time_zone
398
+ }), firstSeen);
399
+
400
+ _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_TimeFormat.default, {
401
+ timestamp: obs.last_seen_time,
402
+ time_zone: obs.time_zone
403
+ }), lastSeen);
404
+ } else {
405
+ _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_Sector.default, {
406
+ sectorName: point.group.sector_name,
407
+ sectorIconName: point.group.sector_icon_name,
408
+ width: "37"
409
+ }), sector);
410
+ }
411
+
412
+ setTimeout(function () {
413
+ (0, _jquery.default)('#first-seen-popup').append(firstSeen);
414
+ (0, _jquery.default)('#last-seen-popup').append(lastSeen);
415
+ (0, _jquery.default)('#sector').append(sector);
416
+ }, 200);
417
+ }
418
+
419
+ var attachClickEvent = function attachClickEvent(selector, observation) {
420
+ (0, _jquery.default)(document.body).on('click', selector, function () {
421
+ dispatch((0, _actions.closeFloatingGraph)());
422
+ dispatch((0, _actions.openFloatingGraph)(true, observation, point));
423
+ });
424
+ };
425
+
426
+ if (obs !== null) {
427
+ attachClickEvent('.popup-graph-icon-' + obs.id, obs);
428
+ } else {
429
+ attachClickEvent('.popup-graph-icon-' + point.id, null);
430
+ }
431
+ });
432
+ layers[property].on('click', function () {
433
+ layers[property].openPopup();
434
+ });
435
+ }
436
+ };
437
+
438
+ for (var property in layers) {
439
+ _loop(property);
440
+ }
441
+ };
442
+
443
+ var customIconForPointsIfPartOfPathAndMonitored = function customIconForPointsIfPartOfPathAndMonitored(markerLocation) {
444
+ if (centeredEvent) {
445
+ var edgesIds = [];
446
+ centeredEvent.path.forEach(function (part) {
447
+ edgesIds.push(part.edge_id);
448
+ });
449
+ var relevantEdges = edges_data.items.filter(function (edge) {
450
+ return edgesIds.includes(edge.id);
451
+ });
452
+ var relevantPoints = [];
453
+ relevantEdges.forEach(function (edge) {
454
+ relevantPoints.push(edge.source_point_id);
455
+ });
456
+
457
+ if (relevantPoints.includes(point.id)) {
458
+ createManholePoint(markerLocation);
459
+ createCustomIconPoint(markerLocation);
460
+ }
461
+ }
462
+ };
463
+
464
+ var createSamplingIcons = function createSamplingIcons(markerLocation) {
465
+ if (focusedEvent !== null) {
466
+ var sampledPointIds = focusedEvent.samplings.map(function (s) {
467
+ return s.point_id;
468
+ });
469
+
470
+ if (focusedEvent !== null && focusedEvent.samplings.length !== 0 && sampledPointIds.includes(point.id)) {
471
+ createSamplingIconPoint(markerLocation, matchIconToPoint(point) !== null);
472
+ }
473
+ }
474
+ };
475
+
38
476
  var renderLogic = function renderLogic() {
39
477
  var markerLocation = [point['latitude'], point['longitude']];
40
- if (markerLocation[0] === null) return;
41
- (0, _PointUtils.createManholePoint)(markerLocation, point, map);
42
- (0, _PointUtils.createBubblePoint)(markerLocation, point, map);
478
+ customIconForPointsIfPartOfPathAndMonitored(markerLocation);
479
+ if (!point.eventsViewHovered) createManholePoint(markerLocation);
480
+
481
+ if (markerLocation[0] !== null) {
482
+ createSamplingIcons(markerLocation);
483
+ if (point.part_of_monitored_path && !point.has_device) return;
484
+
485
+ if (matchIconToPoint(point) !== null && (centeredEvent === null || centeredEvent !== null && pointIsObservation() || point.group.type === 'Groups::WastewaterTreatmentPlant')) {
486
+ if (point.eventsViewHovered) createManholePoint(markerLocation);
487
+ createCustomIconPoint(markerLocation);
488
+ }
489
+
490
+ if (focusedEvent !== null) {
491
+ var hasPrimaryIcon = matchIconToPoint(point) !== null;
492
+
493
+ if (pointIsObservation()) {
494
+ createObservationIconPoint(markerLocation, hasPrimaryIcon);
495
+ }
496
+ }
497
+
498
+ if (centeredEvent !== null && pointBelongsToEvent()) {
499
+ var obs = centeredEvent.observations.filter(function (obs) {
500
+ return obs.point_id === point.id;
501
+ })[0];
502
+ bindPopupToPoint(obs);
503
+ }
504
+ }
43
505
  };
44
506
 
45
507
  (0, _react.useEffect)(function () {
@@ -51,7 +513,7 @@ var PointMarker = function PointMarker(props) {
51
513
  (0, _useRemoveExistingLayers.removeFromMap)(map, point, 'Sampling');
52
514
  (0, _useRemoveExistingLayers.removeFromMap)(map, point, 'IconNumber');
53
515
  };
54
- }, [rerender]);
516
+ }, [centeredEvent]);
55
517
  return /*#__PURE__*/_react.default.createElement("div", null);
56
518
  };
57
519
 
@@ -66,4 +528,4 @@ var _default = connector( /*#__PURE__*/_react.default.memo(PointMarker, function
66
528
  }));
67
529
 
68
530
  exports.default = _default;
69
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9XaWRnZXRzL01hcC9wb2ludHMvUG9pbnRNYXJrZXIudHN4Il0sIm5hbWVzIjpbIm1hcFN0YXRlVG9Qcm9wcyIsInN0YXRlIiwiZXZlbnRzX2RhdGEiLCJQb2ludE1hcmtlciIsInByb3BzIiwibWFwIiwicG9pbnQiLCJyZXJlbmRlciIsInJlbmRlckxvZ2ljIiwibWFya2VyTG9jYXRpb24iLCJjbGVhbnVwIiwiY29ubmVjdG9yIiwiUmVhY3QiLCJtZW1vIiwicHJldlByb3BzIiwibmV4dFByb3BzIiwiZm9jdXNlZEV2ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFLQTs7Ozs7O0FBR0EsU0FBU0EsZUFBVCxDQUF5QkMsS0FBekIsRUFBMkM7QUFDekMsTUFBUUMsV0FBUixHQUF3QkQsS0FBeEIsQ0FBUUMsV0FBUjtBQUVBLFNBQU87QUFDTEEsSUFBQUEsV0FBVyxFQUFYQTtBQURLLEdBQVA7QUFHRDs7QUFRRCxJQUFNQyxXQUE0QixHQUFHLFNBQS9CQSxXQUErQixDQUFDQyxLQUFELEVBQVc7QUFDOUMsTUFBUUMsR0FBUixHQUFpQ0QsS0FBakMsQ0FBUUMsR0FBUjtBQUFBLE1BQWFDLEtBQWIsR0FBaUNGLEtBQWpDLENBQWFFLEtBQWI7QUFBQSxNQUFvQkMsUUFBcEIsR0FBaUNILEtBQWpDLENBQW9CRyxRQUFwQjtBQUVBLHdDQUF3QkYsR0FBeEIsRUFBNkJDLEtBQTdCLEVBQW9DLE9BQXBDO0FBQ0Esd0NBQXdCRCxHQUF4QixFQUE2QkMsS0FBN0IsRUFBb0MsYUFBcEM7QUFDQSx3Q0FBd0JELEdBQXhCLEVBQTZCQyxLQUE3QixFQUFvQyxVQUFwQztBQUNBLHdDQUF3QkQsR0FBeEIsRUFBNkJDLEtBQTdCLEVBQW9DLFlBQXBDOztBQUVBLE1BQU1FLFdBQVcsR0FBRyxTQUFkQSxXQUFjLEdBQU07QUFDeEIsUUFBSUMsY0FBMkIsR0FBRyxDQUFDSCxLQUFLLENBQUMsVUFBRCxDQUFOLEVBQW9CQSxLQUFLLENBQUMsV0FBRCxDQUF6QixDQUFsQztBQUNBLFFBQUlHLGNBQWMsQ0FBQyxDQUFELENBQWQsS0FBc0IsSUFBMUIsRUFBZ0M7QUFFaEMsd0NBQW1CQSxjQUFuQixFQUFtQ0gsS0FBbkMsRUFBMENELEdBQTFDO0FBQ0EsdUNBQWtCSSxjQUFsQixFQUFrQ0gsS0FBbEMsRUFBeUNELEdBQXpDO0FBQ0QsR0FORDs7QUFRQSx3QkFBVSxZQUFNO0FBQ2RHLElBQUFBLFdBQVc7QUFFWCxXQUFPLFNBQVNFLE9BQVQsR0FBbUI7QUFDeEI7QUFDQSxrREFBY0wsR0FBZCxFQUFtQkMsS0FBbkIsRUFBMEIsYUFBMUI7QUFDQSxrREFBY0QsR0FBZCxFQUFtQkMsS0FBbkIsRUFBMEIsT0FBMUI7QUFDQSxrREFBY0QsR0FBZCxFQUFtQkMsS0FBbkIsRUFBMEIsVUFBMUI7QUFDQSxrREFBY0QsR0FBZCxFQUFtQkMsS0FBbkIsRUFBMEIsWUFBMUI7QUFDRCxLQU5EO0FBT0QsR0FWRCxFQVVHLENBQUNDLFFBQUQsQ0FWSDtBQVlBLHNCQUFPLHlDQUFQO0FBQ0QsQ0E3QkQ7O0FBK0JBLElBQU1JLFNBQVMsR0FBRyx5QkFBUVgsZUFBUixDQUFsQjs7ZUFDZVcsU0FBUyxlQUN0QkMsZUFBTUMsSUFBTixDQUFXVixXQUFYLEVBQXdCLFVBQUNXLFNBQUQsRUFBWUMsU0FBWixFQUEwQjtBQUNoRCxNQUNFRCxTQUFTLENBQUNaLFdBQVYsQ0FBc0JjLFlBQXRCLEtBQXVDRCxTQUFTLENBQUNiLFdBQVYsQ0FBc0JjLFlBRC9ELEVBRUU7QUFDQSxXQUFPLEtBQVA7QUFDRDs7QUFFRCxTQUFPLElBQVA7QUFDRCxDQVJELENBRHNCLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29ubmVjdCwgQ29ubmVjdGVkUHJvcHMgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgdXNlUmVtb3ZlRXhpc3RpbmdMYXllcnMsIHtcbiAgcmVtb3ZlRnJvbU1hcCxcbn0gZnJvbSAnc3JjL2hvb2tzL3VzZVJlbW92ZUV4aXN0aW5nTGF5ZXJzJztcbmltcG9ydCB7IElBcHBTdGF0ZSB9IGZyb20gJ3NyYy9tb2RlbHMvSUFwcFN0YXRlJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJ3NyYy9zdG9yZS9wb2ludHMvbW9kZWxzL0lQb2ludCc7XG5pbXBvcnQgeyBjcmVhdGVCdWJibGVQb2ludCwgY3JlYXRlTWFuaG9sZVBvaW50IH0gZnJvbSAnLi9Qb2ludFV0aWxzJztcbmltcG9ydCB7IExhdExuZ1R1cGxlIH0gZnJvbSAnbGVhZmxldCc7XG5cbmZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZTogSUFwcFN0YXRlKSB7XG4gIGNvbnN0IHsgZXZlbnRzX2RhdGEgfSA9IHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRzX2RhdGEsXG4gIH07XG59XG5cbnR5cGUgUHJvcHMgPSBDb25uZWN0ZWRQcm9wczx0eXBlb2YgY29ubmVjdG9yPiAmIHtcbiAgbWFwOiBhbnk7XG4gIHBvaW50OiBJUG9pbnQ7XG4gIHJlcmVuZGVyOiBib29sZWFuO1xufTtcblxuY29uc3QgUG9pbnRNYXJrZXI6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IG1hcCwgcG9pbnQsIHJlcmVuZGVyIH0gPSBwcm9wcztcblxuICB1c2VSZW1vdmVFeGlzdGluZ0xheWVycyhtYXAsIHBvaW50LCAnUG9pbnQnKTtcbiAgdXNlUmVtb3ZlRXhpc3RpbmdMYXllcnMobWFwLCBwb2ludCwgJ09ic2VydmF0aW9uJyk7XG4gIHVzZVJlbW92ZUV4aXN0aW5nTGF5ZXJzKG1hcCwgcG9pbnQsICdTYW1wbGluZycpO1xuICB1c2VSZW1vdmVFeGlzdGluZ0xheWVycyhtYXAsIHBvaW50LCAnSWNvbk51bWJlcicpO1xuXG4gIGNvbnN0IHJlbmRlckxvZ2ljID0gKCkgPT4ge1xuICAgIGxldCBtYXJrZXJMb2NhdGlvbjogTGF0TG5nVHVwbGUgPSBbcG9pbnRbJ2xhdGl0dWRlJ10sIHBvaW50Wydsb25naXR1ZGUnXV07XG4gICAgaWYgKG1hcmtlckxvY2F0aW9uWzBdID09PSBudWxsKSByZXR1cm47XG5cbiAgICBjcmVhdGVNYW5ob2xlUG9pbnQobWFya2VyTG9jYXRpb24sIHBvaW50LCBtYXApO1xuICAgIGNyZWF0ZUJ1YmJsZVBvaW50KG1hcmtlckxvY2F0aW9uLCBwb2ludCwgbWFwKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJlbmRlckxvZ2ljKCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAgIC8vIFVOQklORCBQT1BVUFxuICAgICAgcmVtb3ZlRnJvbU1hcChtYXAsIHBvaW50LCAnT2JzZXJ2YXRpb24nKTtcbiAgICAgIHJlbW92ZUZyb21NYXAobWFwLCBwb2ludCwgJ1BvaW50Jyk7XG4gICAgICByZW1vdmVGcm9tTWFwKG1hcCwgcG9pbnQsICdTYW1wbGluZycpO1xuICAgICAgcmVtb3ZlRnJvbU1hcChtYXAsIHBvaW50LCAnSWNvbk51bWJlcicpO1xuICAgIH07XG4gIH0sIFtyZXJlbmRlcl0pO1xuXG4gIHJldHVybiA8ZGl2PjwvZGl2Pjtcbn07XG5cbmNvbnN0IGNvbm5lY3RvciA9IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzKTtcbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3RvcihcbiAgUmVhY3QubWVtbyhQb2ludE1hcmtlciwgKHByZXZQcm9wcywgbmV4dFByb3BzKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcHJldlByb3BzLmV2ZW50c19kYXRhLmZvY3VzZWRFdmVudCAhPT0gbmV4dFByb3BzLmV2ZW50c19kYXRhLmZvY3VzZWRFdmVudFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KSxcbik7XG4iXX0=
531
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9XaWRnZXRzL01hcC9wb2ludHMvUG9pbnRNYXJrZXIudHN4Il0sIm5hbWVzIjpbIm1hcFN0YXRlVG9Qcm9wcyIsInN0YXRlIiwiZXZlbnRzX2RhdGEiLCJlZGdlc19kYXRhIiwiUG9pbnRNYXJrZXIiLCJwcm9wcyIsIkwiLCJtYXAiLCJwb2ludCIsImZvY3VzZWRFdmVudCIsImhvdmVyZWRFdmVudCIsImRpc3BhdGNoIiwiY2VudGVyZWRFdmVudCIsInNlbGVjdGVkQmFja2dyb3VuZCIsImljb24iLCJpY29uVXJsIiwicmVkUGluUmVkU2hhZG93IiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicG9wdXBBbmNob3IiLCJiZWxvbmdzVG9Tb3VyY2VCYWNrZ3JvdW5kIiwid2hpdGVQaW5SZWRTaGFkb3ciLCJzdGFuZGFyZEJhY2tncm91bmQiLCJzZWNvbmRhcnkiLCJ0aGlyZCIsIndoaXRlUGluQmxhY2tTaGFkb3ciLCJjb21iaW5lZEZhY3RvcnlJY29uIiwieWVsbG93Q2lyY2xlVVJMIiwicGxhbnRJY29uVVJMIiwiY29tYmluZWRQdW1wU3RhdGlvbkljb24iLCJncmVlbkNpcmNsZVVSTCIsInB1bXBTdGF0aW9uSWNvblVSTCIsImNvbWJpbmVkQ29sbGVjdG9yc0ljb24iLCJjb2xsZWN0b3JJY29uIiwiY29tYmluZWRXV1RQSWNvbiIsImJyaWdodEJsdWVDaXJjbGVVUkwiLCJXV1RQSWNvblVSTCIsIm1hcmtlckJlbG9uZ3NUb1NlbGVjdGVkU291cmNlIiwic291cmNlIiwic291cmNlcyIsImZpbHRlciIsInBvaW50X2lkIiwiaWQiLCJzZWxlY3RlZF9zb3VyY2UiLCJtYXJrZXJCZWxvbmdzVG9Tb3VyY2UiLCJpc0NvbGxlY3RvckZvY3VzZWQiLCJvYnNlcnZhdGlvbnMiLCJsZW5ndGgiLCJtYXRjaEljb25Ub1BvaW50IiwiZ3JvdXAiLCJ0eXBlIiwidW5zaGlmdCIsIndhdGVySWNvbk5vQmFja2dyb3VuZCIsImNyZWF0ZU1hbmhvbGVQb2ludCIsIm1hcmtlckxvY2F0aW9uIiwicG9pbnRJY29uIiwid2hpdGVQb2ludCIsIm1hbmhvbGVJY29uIiwibWFya2VyIiwicmlzZU9uSG92ZXIiLCJhZGRUbyIsImJpbmRUb29sdGlwIiwibmFtZSIsImNyZWF0ZUN1c3RvbUljb25Qb2ludCIsImZvckVhY2giLCJwb2ludEN1c3RvbUljb24iLCJyZWxhdGVkRXZlbnRzQW1vdW50IiwiZGl2SWNvbiIsImNsYXNzTmFtZSIsImh0bWwiLCJjcmVhdGVTYW1wbGluZ0ljb25Qb2ludCIsInNlY29uZGFyeUljb24iLCJzYW1wbGluZ0ljb24iLCJibHVlQ2lyY2xlVVJMIiwic2FtcGxpbmdJY29uVVJMIiwiY3JlYXRlT2JzZXJ2YXRpb25JY29uUG9pbnQiLCJvYnNlcnZhdGlvbkljb24iLCJwaW5rQ2lyY2xlVVJMIiwib2JzZXJ2YXRpb25JY29uVVJMIiwicG9wdXBDb250ZW50Iiwib2JzIiwiR3JhcGhJY29uIiwiaTE4biIsInQiLCJzZXZlcml0eSIsInBvaW50SXNPYnNlcnZhdGlvbiIsInBvaW50QmVsb25nc1RvRXZlbnQiLCJiaW5kUG9wdXBUb1BvaW50IiwibGF5ZXJzIiwiX2xheWVycyIsInByb3BlcnR5IiwiaW5jbHVkZXMiLCJrYW5kb19vYmplY3QiLCJrYW5kb19vYmplY3RfaWQiLCJiaW5kUG9wdXAiLCJtaW5XaWR0aCIsIm9uIiwiZSIsImZpcnN0U2VlbiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImxhc3RTZWVuIiwic2VjdG9yIiwiUmVhY3RET00iLCJyZW5kZXIiLCJzdGFydF90aW1lIiwidGltZV96b25lIiwibGFzdF9zZWVuX3RpbWUiLCJzZWN0b3JfbmFtZSIsInNlY3Rvcl9pY29uX25hbWUiLCJzZXRUaW1lb3V0IiwiYXBwZW5kIiwiYXR0YWNoQ2xpY2tFdmVudCIsInNlbGVjdG9yIiwib2JzZXJ2YXRpb24iLCJib2R5Iiwib3BlblBvcHVwIiwiY3VzdG9tSWNvbkZvclBvaW50c0lmUGFydE9mUGF0aEFuZE1vbml0b3JlZCIsImVkZ2VzSWRzIiwicGF0aCIsInBhcnQiLCJwdXNoIiwiZWRnZV9pZCIsInJlbGV2YW50RWRnZXMiLCJpdGVtcyIsImVkZ2UiLCJyZWxldmFudFBvaW50cyIsInNvdXJjZV9wb2ludF9pZCIsImNyZWF0ZVNhbXBsaW5nSWNvbnMiLCJzYW1wbGVkUG9pbnRJZHMiLCJzYW1wbGluZ3MiLCJzIiwicmVuZGVyTG9naWMiLCJldmVudHNWaWV3SG92ZXJlZCIsInBhcnRfb2ZfbW9uaXRvcmVkX3BhdGgiLCJoYXNfZGV2aWNlIiwiaGFzUHJpbWFyeUljb24iLCJjbGVhbnVwIiwiY29ubmVjdG9yIiwiUmVhY3QiLCJtZW1vIiwicHJldlByb3BzIiwibmV4dFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7Ozs7QUFFQTs7QUFDQTs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FBS0E7O0FBQ0E7Ozs7OztBQUVBLFNBQVNBLGVBQVQsQ0FBeUJDLEtBQXpCLEVBQTJDO0FBQ3pDLE1BQVFDLFdBQVIsR0FBb0NELEtBQXBDLENBQVFDLFdBQVI7QUFBQSxNQUFxQkMsVUFBckIsR0FBb0NGLEtBQXBDLENBQXFCRSxVQUFyQjtBQUVBLFNBQU87QUFDTEQsSUFBQUEsV0FBVyxFQUFYQSxXQURLO0FBRUxDLElBQUFBLFVBQVUsRUFBVkE7QUFGSyxHQUFQO0FBSUQ7O0FBUUQsSUFBTUMsV0FBNEIsR0FBRyxTQUEvQkEsV0FBK0IsQ0FBQ0MsS0FBRCxFQUFXO0FBQzlDLE1BQVFDLENBQVIsR0FBbURELEtBQW5ELENBQVFDLENBQVI7QUFBQSxNQUFXQyxHQUFYLEdBQW1ERixLQUFuRCxDQUFXRSxHQUFYO0FBQUEsTUFBZ0JDLEtBQWhCLEdBQW1ESCxLQUFuRCxDQUFnQkcsS0FBaEI7QUFBQSxNQUF1Qk4sV0FBdkIsR0FBbURHLEtBQW5ELENBQXVCSCxXQUF2QjtBQUFBLE1BQW9DQyxVQUFwQyxHQUFtREUsS0FBbkQsQ0FB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QSxXQUFXO0FBRVgsV0FBTyxTQUFTSyxPQUFULEdBQW1CO0FBQ3hCO0FBQ0Esa0RBQWNsSSxHQUFkLEVBQW1CQyxLQUFuQixFQUEwQixhQUExQjtBQUNBLGtEQUFjRCxHQUFkLEVBQW1CQyxLQUFuQixFQUEwQixPQUExQjtBQUNBLGtEQUFjRCxHQUFkLEVBQW1CQyxLQUFuQixFQUEwQixVQUExQjtBQUNBLGtEQUFjRCxHQUFkLEVBQW1CQyxLQUFuQixFQUEwQixZQUExQjtBQUNELEtBTkQ7QUFPRCxHQVZELEVBVUcsQ0FBQ0ksYUFBRCxDQVZIO0FBWUEsc0JBQU8seUNBQVA7QUFDRCxDQTVpQkQ7O0FBOGlCQSxJQUFNOEgsU0FBUyxHQUFHLHlCQUFRMUksZUFBUixDQUFsQjs7ZUFDZTBJLFNBQVMsZUFDdEJDLGVBQU1DLElBQU4sQ0FBV3hJLFdBQVgsRUFBd0IsVUFBQ3lJLFNBQUQsRUFBWUMsU0FBWixFQUEwQjtBQUNoRCxNQUNFRCxTQUFTLENBQUMzSSxXQUFWLENBQXNCTyxZQUF0QixLQUF1Q3FJLFNBQVMsQ0FBQzVJLFdBQVYsQ0FBc0JPLFlBRC9ELEVBRUU7QUFDQSxXQUFPLEtBQVA7QUFDRDs7QUFFRCxTQUFPLElBQVA7QUFDRCxDQVJELENBRHNCLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgY29ubmVjdCwgQ29ubmVjdGVkUHJvcHMsIHVzZURpc3BhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IEdyYXBoSWNvbiBmcm9tICdzcmMvYXNzZXRzL2xpbmUtY2hhcnQuc3ZnJztcbmltcG9ydCBjb2xsZWN0b3JJY29uIGZyb20gJ3NyYy9hc3NldHMvbWFwL3Bpbi13YXRlci5zdmcnO1xuaW1wb3J0IHdhdGVySWNvbk5vQmFja2dyb3VuZCBmcm9tICdzcmMvYXNzZXRzL3BvaW50X2ljb25zL3dhdGVyLW5vLWJhY2tncm91bmQuc3ZnJztcbmltcG9ydCBibHVlQ2lyY2xlVVJMIGZyb20gJ3NyYy9hc3NldHMvcG9pbnRfaWNvbnMvYmx1ZS1jaXJjbGUuc3ZnJztcbmltcG9ydCBicmlnaHRCbHVlQ2lyY2xlVVJMIGZyb20gJ3NyYy9hc3NldHMvcG9pbnRfaWNvbnMvYnJpZ2h0LWJsdWUtY2lyY2xlLnN2Zyc7XG5pbXBvcnQgcGxhbnRJY29uVVJMIGZyb20gJ3NyYy9hc3NldHMvcG9pbnRfaWNvbnMvZmFjdG9yeS1pY29uLnN2Zyc7XG5pbXBvcnQgZ3JlZW5DaXJjbGVVUkwgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy9ncmVlbi1jaXJjbGUuc3ZnJztcbmltcG9ydCBvYnNlcnZhdGlvbkljb25VUkwgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy9vYnNlcnZhdGlvbi1pY29uLnN2Zyc7XG5pbXBvcnQgcGlua0NpcmNsZVVSTCBmcm9tICdzcmMvYXNzZXRzL3BvaW50X2ljb25zL3BpbmstY2lyY2xlLnN2Zyc7XG5pbXBvcnQgcHVtcFN0YXRpb25JY29uVVJMIGZyb20gJ3NyYy9hc3NldHMvcG9pbnRfaWNvbnMvcHVtcC1zdGF0aW9uLWljb24uc3ZnJztcbmltcG9ydCByZWRQaW5SZWRTaGFkb3cgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy9yZWQtcGluLXJlZC1zaGFkb3cucG5nJztcbmltcG9ydCBzYW1wbGluZ0ljb25VUkwgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy9zYW1wbGluZy1pY29uLnN2Zyc7XG5pbXBvcnQgd2hpdGVQaW5CbGFja1NoYWRvdyBmcm9tICdzcmMvYXNzZXRzL3BvaW50X2ljb25zL3doaXRlLXBpbi1ibGFjay1zaGFkb3cucG5nJztcbmltcG9ydCB3aGl0ZVBpblJlZFNoYWRvdyBmcm9tICdzcmMvYXNzZXRzL3BvaW50X2ljb25zL3doaXRlLXBpbi1yZWQtc2hhZG93LnBuZyc7XG5pbXBvcnQgV1dUUEljb25VUkwgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy9XV1RQLWljb24uc3ZnJztcbmltcG9ydCB5ZWxsb3dDaXJjbGVVUkwgZnJvbSAnc3JjL2Fzc2V0cy9wb2ludF9pY29ucy95ZWxsb3ctY2lyY2xlLnN2Zyc7XG5pbXBvcnQgd2hpdGVQb2ludCBmcm9tICdzcmMvYXNzZXRzL3doaXRlLXBvaW50LnBuZyc7XG5pbXBvcnQgU2VjdG9yIGZyb20gJ3NyYy9jb21wb25lbnRzL1NlY3Rvcic7XG5pbXBvcnQgdXNlUmVtb3ZlRXhpc3RpbmdMYXllcnMsIHtcbiAgcmVtb3ZlRnJvbU1hcCxcbn0gZnJvbSAnc3JjL2hvb2tzL3VzZVJlbW92ZUV4aXN0aW5nTGF5ZXJzJztcbmltcG9ydCB7IElBcHBTdGF0ZSB9IGZyb20gJ3NyYy9tb2RlbHMvSUFwcFN0YXRlJztcbmltcG9ydCB7XG4gIGNsb3NlRmxvYXRpbmdHcmFwaCxcbiAgb3BlbkZsb2F0aW5nR3JhcGgsXG59IGZyb20gJ3NyYy9zdG9yZS9nbG9iYWwvYWN0aW9ucyc7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICdzcmMvc3RvcmUvcG9pbnRzL21vZGVscy9JUG9pbnQnO1xuaW1wb3J0IGkxOG4gZnJvbSAnc3JjL3V0aWxpdGllcy9pMThuJztcbmltcG9ydCBUaW1lRm9ybWF0IGZyb20gJ3NyYy91dGlsaXRpZXMvVGltZUZvcm1hdCc7XG5cbmZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZTogSUFwcFN0YXRlKSB7XG4gIGNvbnN0IHsgZXZlbnRzX2RhdGEsIGVkZ2VzX2RhdGEgfSA9IHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRzX2RhdGEsXG4gICAgZWRnZXNfZGF0YSxcbiAgfTtcbn1cblxudHlwZSBQcm9wcyA9IENvbm5lY3RlZFByb3BzPHR5cGVvZiBjb25uZWN0b3I+ICYge1xuICBtYXA6IGFueTtcbiAgTDogYW55O1xuICBwb2ludDogSVBvaW50O1xufTtcblxuY29uc3QgUG9pbnRNYXJrZXI6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IEwsIG1hcCwgcG9pbnQsIGV2ZW50c19kYXRhLCBlZGdlc19kYXRhIH0gPSBwcm9wcztcbiAgY29uc3QgeyBmb2N1c2VkRXZlbnQsIGhvdmVyZWRFdmVudCB9ID0gZXZlbnRzX2RhdGE7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICBjb25zdCBjZW50ZXJlZEV2ZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBmb2N1c2VkRXZlbnQgfHwgaG92ZXJlZEV2ZW50LFxuICAgIFtmb2N1c2VkRXZlbnQsIGhvdmVyZWRFdmVudF0sXG4gICk7XG4gIC8vIGljb25TaXplOiBbd2lkdGgsIGhlaWdodF0sXG4gIC8vIEljb24gQW5jaG9yOiBbKC1yaWdodCkoK2xlZnQpLCAoLWRvd24pKCt1cCldXG4gIGNvbnN0IHNlbGVjdGVkQmFja2dyb3VuZCA9ICgpID0+IHtcbiAgICByZXR1cm4gTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHJlZFBpblJlZFNoYWRvdyxcbiAgICAgIGljb25TaXplOiBbNjcsIDcwXSxcbiAgICAgIGljb25BbmNob3I6IFszMiwgNTRdLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGJlbG9uZ3NUb1NvdXJjZUJhY2tncm91bmQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIEwuaWNvbih7XG4gICAgICBpY29uVXJsOiB3aGl0ZVBpblJlZFNoYWRvdyxcbiAgICAgIGljb25TaXplOiBbNjcsIDcwXSxcbiAgICAgIGljb25BbmNob3I6IFszMiwgNTRdLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHN0YW5kYXJkQmFja2dyb3VuZCA9IChcbiAgICBzZWNvbmRhcnk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aGlyZDogYm9vbGVhbiA9IGZhbHNlLFxuICApID0+IHtcbiAgICByZXR1cm4gTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHdoaXRlUGluQmxhY2tTaGFkb3csXG4gICAgICBpY29uU2l6ZTogc2Vjb25kYXJ5ID8gWzIwLCAyMF0gOiBbNDMsIDQ2XSxcbiAgICAgIGljb25BbmNob3I6XG4gICAgICAgIHNlY29uZGFyeSAmJiB0aGlyZCA/IFstMiwgMTldIDogc2Vjb25kYXJ5ID8gWy0yLCA0NF0gOiBbMjAsIDQyXSxcbiAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjb21iaW5lZEZhY3RvcnlJY29uID0gW1xuICAgIEwuaWNvbih7XG4gICAgICBpY29uVXJsOiB5ZWxsb3dDaXJjbGVVUkwsXG4gICAgICBpY29uU2l6ZTogWzI1LCAyNF0sXG4gICAgICBpY29uQW5jaG9yOiBbMTAuNywgMzMuN10sXG4gICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgfSksXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHBsYW50SWNvblVSTCxcbiAgICAgIGljb25TaXplOiBbMTUsIDE1XSxcbiAgICAgIGljb25BbmNob3I6IFs1LCAzMF0sXG4gICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgfSksXG4gIF07XG5cbiAgY29uc3QgY29tYmluZWRQdW1wU3RhdGlvbkljb24gPSBbXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IGdyZWVuQ2lyY2xlVVJMLFxuICAgICAgaWNvblNpemU6IFsyNSwgMjRdLFxuICAgICAgaWNvbkFuY2hvcjogWzEwLjcsIDMzLjddLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pLFxuICAgIEwuaWNvbih7XG4gICAgICBpY29uVXJsOiBwdW1wU3RhdGlvbkljb25VUkwsXG4gICAgICBpY29uU2l6ZTogWzIwLCAyMF0sXG4gICAgICBpY29uQW5jaG9yOiBbNywgMzJdLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pLFxuICBdO1xuXG4gIGNvbnN0IGNvbWJpbmVkQ29sbGVjdG9yc0ljb24gPSBbXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IGNvbGxlY3Rvckljb24sXG4gICAgICBpY29uU2l6ZTogWzQ1LCA0NV0sXG5cbiAgICAgIGljb25BbmNob3I6IFsyNSwgNTBdLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pLFxuICBdO1xuXG4gIGNvbnN0IGNvbWJpbmVkV1dUUEljb24gPSBbXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IGJyaWdodEJsdWVDaXJjbGVVUkwsXG4gICAgICBpY29uU2l6ZTogWzI1LCAyNV0sXG4gICAgICBpY29uQW5jaG9yOiBbMTAuNywgMzMuN10sXG4gICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgfSksXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IFdXVFBJY29uVVJMLFxuICAgICAgaWNvblNpemU6IFsyMCwgMjBdLFxuICAgICAgaWNvbkFuY2hvcjogWzgsIDMxXSxcbiAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgICB9KSxcbiAgXTtcblxuICBjb25zdCBtYXJrZXJCZWxvbmdzVG9TZWxlY3RlZFNvdXJjZSA9ICgpID0+IHtcbiAgICBsZXQgc291cmNlO1xuXG4gICAgaWYgKGNlbnRlcmVkRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IGNlbnRlcmVkRXZlbnQuc291cmNlcy5maWx0ZXIoXG4gICAgICAgIChzb3VyY2UpID0+IHNvdXJjZS5wb2ludF9pZCA9PT0gcG9pbnQuaWQsXG4gICAgICApWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjZW50ZXJlZEV2ZW50ICE9PSBudWxsICYmXG4gICAgICBzb3VyY2UgJiZcbiAgICAgIGNlbnRlcmVkRXZlbnQuc2VsZWN0ZWRfc291cmNlID09PSBzb3VyY2UucG9pbnRfaWRcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IG1hcmtlckJlbG9uZ3NUb1NvdXJjZSA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2VudGVyZWRFdmVudCAhPT0gbnVsbCAmJlxuICAgICAgY2VudGVyZWRFdmVudC5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UucG9pbnRfaWQgPT09IHBvaW50LmlkKVswXVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgaXNDb2xsZWN0b3JGb2N1c2VkID0gKHBvaW50OiBJUG9pbnQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2VudGVyZWRFdmVudD8ub2JzZXJ2YXRpb25zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHBvaW50LmlkID09PSBjZW50ZXJlZEV2ZW50Lm9ic2VydmF0aW9uc1swXS5wb2ludF9pZFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgbWF0Y2hJY29uVG9Qb2ludCA9IChwb2ludDogSVBvaW50KSA9PiB7XG4gICAgc3dpdGNoIChwb2ludC5ncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdHcm91cHM6OkZhY3RvcnknOlxuICAgICAgICBpZiAoY29tYmluZWRGYWN0b3J5SWNvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAobWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UoKSkge1xuICAgICAgICAgICAgY29tYmluZWRGYWN0b3J5SWNvbi51bnNoaWZ0KHNlbGVjdGVkQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZSgpKSB7XG4gICAgICAgICAgICBjb21iaW5lZEZhY3RvcnlJY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tYmluZWRGYWN0b3J5SWNvbi51bnNoaWZ0KHN0YW5kYXJkQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tYmluZWRGYWN0b3J5SWNvbjtcbiAgICAgIGNhc2UgJ0dyb3Vwczo6UHVtcFN0YXRpb24nOlxuICAgICAgICBpZiAoY29tYmluZWRQdW1wU3RhdGlvbkljb24ubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKG1hcmtlckJlbG9uZ3NUb1NlbGVjdGVkU291cmNlKCkpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkUHVtcFN0YXRpb25JY29uLnVuc2hpZnQoc2VsZWN0ZWRCYWNrZ3JvdW5kKCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobWFya2VyQmVsb25nc1RvU291cmNlKCkpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkUHVtcFN0YXRpb25JY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tYmluZWRQdW1wU3RhdGlvbkljb24udW5zaGlmdChzdGFuZGFyZEJhY2tncm91bmQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkUHVtcFN0YXRpb25JY29uO1xuICAgICAgY2FzZSAnR3JvdXBzOjpXYXN0ZXdhdGVyVHJlYXRtZW50UGxhbnQnOlxuICAgICAgICBpZiAoY29tYmluZWRXV1RQSWNvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAobWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UoKSkge1xuICAgICAgICAgICAgY29tYmluZWRXV1RQSWNvbi51bnNoaWZ0KHNlbGVjdGVkQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZSgpKSB7XG4gICAgICAgICAgICBjb21iaW5lZFdXVFBJY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tYmluZWRXV1RQSWNvbi51bnNoaWZ0KHN0YW5kYXJkQmFja2dyb3VuZCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tYmluZWRXV1RQSWNvbjtcblxuICAgICAgY2FzZSAnR3JvdXBzOjpDb2xsZWN0b3JzJzpcbiAgICAgICAgaWYgKGlzQ29sbGVjdG9yRm9jdXNlZChwb2ludCkpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgTC5pY29uKHtcbiAgICAgICAgICAgICAgaWNvblVybDogcmVkUGluUmVkU2hhZG93LFxuICAgICAgICAgICAgICBpY29uU2l6ZTogWzYyLCA2Ml0sXG4gICAgICAgICAgICAgIGljb25BbmNob3I6IFszMCwgNTJdLFxuICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgIEwuaWNvbih7XG4gICAgICAgICAgICAgIGljb25Vcmw6IHdhdGVySWNvbk5vQmFja2dyb3VuZCxcbiAgICAgICAgICAgICAgaWNvblNpemU6IFs0NiwgNDZdLFxuXG4gICAgICAgICAgICAgIGljb25BbmNob3I6IFsyMiwgNDRdLFxuICAgICAgICAgICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkQ29sbGVjdG9yc0ljb247XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjcmVhdGVNYW5ob2xlUG9pbnQgPSAobWFya2VyTG9jYXRpb246IG9iamVjdCkgPT4ge1xuICAgIGxldCBwb2ludEljb24gPSBMLmljb24oe1xuICAgICAgaWNvblVybDogd2hpdGVQb2ludCxcbiAgICAgIGljb25TaXplOiBbOSwgOV0sXG4gICAgICBpY29uQW5jaG9yOiBbNC41LCA0LjVdLFxuICAgIH0pO1xuICAgIGxldCBtYW5ob2xlSWNvbjogYW55ID0gTC5tYXJrZXIobWFya2VyTG9jYXRpb24sIHtcbiAgICAgIGljb246IHBvaW50SWNvbixcbiAgICAgIHJpc2VPbkhvdmVyOiB0cnVlLFxuICAgIH0pLmFkZFRvKG1hcCk7XG4gICAgbWFuaG9sZUljb24uYmluZFRvb2x0aXAoYCR7cG9pbnQuZ3JvdXAubmFtZX0gKCR7cG9pbnQuaWR9KWApO1xuICAgIG1hbmhvbGVJY29uWydrYW5kb19vYmplY3RfaWQnXSA9IHBvaW50LmlkO1xuICAgIG1hbmhvbGVJY29uWydrYW5kb19vYmplY3QnXSA9ICdQb2ludCc7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlQ3VzdG9tSWNvblBvaW50ID0gKG1hcmtlckxvY2F0aW9uOiBvYmplY3QpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbWF0Y2hJY29uVG9Qb2ludChwb2ludCkgIT09IG51bGwgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG1hdGNoSWNvblRvUG9pbnQocG9pbnQpLmZvckVhY2goKGljb246IGFueSkgPT4ge1xuICAgICAgICBsZXQgcG9pbnRDdXN0b21JY29uOiBhbnkgPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgICAgICAgIGljb246IGljb24sXG4gICAgICAgICAgcmlzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgICB9KS5hZGRUbyhtYXApO1xuICAgICAgICBwb2ludEN1c3RvbUljb24uYmluZFRvb2x0aXAoYCR7cG9pbnQuZ3JvdXAubmFtZX0gKCR7cG9pbnQuaWR9KWApO1xuICAgICAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdF9pZCddID0gcG9pbnQuaWQ7XG4gICAgICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0J10gPSAnUG9pbnQnO1xuICAgICAgfSk7XG5cbiAgICBpZiAocG9pbnQucmVsYXRlZEV2ZW50c0Ftb3VudCkge1xuICAgICAgbGV0IHBvaW50Q3VzdG9tSWNvbiA9IEwubWFya2VyKG1hcmtlckxvY2F0aW9uLCB7XG4gICAgICAgIGljb246IEwuZGl2SWNvbih7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgXG4gICAgICAgICAgJHtcbiAgICAgICAgICAgIHBvaW50LnJlbGF0ZWRFdmVudHNBbW91bnQgPj0gMTAwXG4gICAgICAgICAgICAgID8gJ2NpcmNsZS1ldmVudHMtYW1vdW50IGNpcmNsZS1ldmVudHMtYW1vdW50LS10cmlkaWdpdCdcbiAgICAgICAgICAgICAgOiAnY2lyY2xlLWV2ZW50cy1hbW91bnQnXG4gICAgICAgICAgfSBcbiAgICAgICAgICAke3BvaW50LnJlbGF0ZWRFdmVudHNBbW91bnQgPiAyID8gJ2FsZXJ0LWNvbG9yJyA6ICcnfVxuICAgICAgICAgICAgYCxcbiAgICAgICAgICBodG1sOiBgPHA+JHtwb2ludC5yZWxhdGVkRXZlbnRzQW1vdW50fTwvcD5gLFxuICAgICAgICAgIGljb25BbmNob3I6IFstNSwgNDJdLFxuICAgICAgICB9KSxcbiAgICAgICAgcmlzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgfSkuYWRkVG8obWFwKTtcblxuICAgICAgcG9pbnRDdXN0b21JY29uWydrYW5kb19vYmplY3RfaWQnXSA9IHBvaW50LmlkO1xuICAgICAgcG9pbnRDdXN0b21JY29uWydrYW5kb19vYmplY3QnXSA9ICdJY29uTnVtYmVyJztcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlU2FtcGxpbmdJY29uUG9pbnQgPSAoXG4gICAgbWFya2VyTG9jYXRpb246IG9iamVjdCxcbiAgICBzZWNvbmRhcnlJY29uOiBib29sZWFuLFxuICApID0+IHtcbiAgICAvLyBpY29uU2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAgIC8vIEljb24gQW5jaG9yOiBbKC1yaWdodCkoK2xlZnQpLCAoLWRvd24pKCt1cCldXG4gICAgbGV0IHNhbXBsaW5nSWNvbiA9IFtcbiAgICAgIEwuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IGJsdWVDaXJjbGVVUkwsXG4gICAgICAgIGljb25TaXplOiBzZWNvbmRhcnlJY29uID8gWzEwLCAxMF0gOiBbMjUsIDI0XSxcbiAgICAgICAgaWNvbkFuY2hvcjogc2Vjb25kYXJ5SWNvbiA/IFstNywgMTVdIDogWzEwLjcsIDMzLjddLFxuICAgICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgICB9KSxcbiAgICAgIEwuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IHNhbXBsaW5nSWNvblVSTCxcbiAgICAgICAgaWNvblNpemU6IHNlY29uZGFyeUljb24gPyBbNywgN10gOiBbMTMsIDE1XSxcbiAgICAgICAgaWNvbkFuY2hvcjogc2Vjb25kYXJ5SWNvbiA/IFstOCwgMTNdIDogWzUsIDMwXSxcbiAgICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGlmIChtYXJrZXJCZWxvbmdzVG9TZWxlY3RlZFNvdXJjZSgpICYmICFzZWNvbmRhcnlJY29uKSB7XG4gICAgICBzYW1wbGluZ0ljb24udW5zaGlmdChzZWxlY3RlZEJhY2tncm91bmQoKSk7XG4gICAgfSBlbHNlIGlmIChtYXJrZXJCZWxvbmdzVG9Tb3VyY2UoKSAmJiAhc2Vjb25kYXJ5SWNvbikge1xuICAgICAgc2FtcGxpbmdJY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FtcGxpbmdJY29uLnVuc2hpZnQoc3RhbmRhcmRCYWNrZ3JvdW5kKHNlY29uZGFyeUljb24sIHRydWUpKTtcbiAgICB9XG5cbiAgICBzYW1wbGluZ0ljb24uZm9yRWFjaCgoaWNvbikgPT4ge1xuICAgICAgbGV0IHBvaW50Q3VzdG9tSWNvbjogYW55ID0gTC5tYXJrZXIobWFya2VyTG9jYXRpb24sIHtcbiAgICAgICAgaWNvbjogaWNvbixcbiAgICAgICAgcmlzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgfSkuYWRkVG8obWFwKTtcbiAgICAgIHBvaW50Q3VzdG9tSWNvbi5iaW5kVG9vbHRpcChgJHtwb2ludC5ncm91cC5uYW1lfSAoJHtwb2ludC5pZH0pYCk7XG4gICAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdF9pZCddID0gcG9pbnQuaWQ7XG4gICAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdCddID0gJ1NhbXBsaW5nJztcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVPYnNlcnZhdGlvbkljb25Qb2ludCA9IChcbiAgICBtYXJrZXJMb2NhdGlvbjogb2JqZWN0LFxuICAgIHNlY29uZGFyeUljb246IGJvb2xlYW4sXG4gICkgPT4ge1xuICAgIC8vIGljb25TaXplOiBbd2lkdGgsIGhlaWdodF0sXG4gICAgLy8gSWNvbiBBbmNob3I6IFsoLXJpZ2h0KSgrbGVmdCksICgtZG93bikoK3VwKV1cbiAgICBsZXQgb2JzZXJ2YXRpb25JY29uID0gW1xuICAgICAgTC5pY29uKHtcbiAgICAgICAgaWNvblVybDogcGlua0NpcmNsZVVSTCxcbiAgICAgICAgaWNvblNpemU6IHNlY29uZGFyeUljb24gPyBbMTAsIDEwXSA6IFsyNSwgMjRdLFxuICAgICAgICBpY29uQW5jaG9yOiBzZWNvbmRhcnlJY29uID8gWy03LCA0MF0gOiBbMTAuNywgMzMuN10sXG4gICAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgICAgIH0pLFxuICAgICAgTC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb2JzZXJ2YXRpb25JY29uVVJMLFxuICAgICAgICBpY29uU2l6ZTogc2Vjb25kYXJ5SWNvbiA/IFs3LCA3XSA6IFsxMywgMTVdLFxuICAgICAgICBpY29uQW5jaG9yOiBzZWNvbmRhcnlJY29uID8gWy04LCAzOF0gOiBbNSwgMzBdLFxuICAgICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgICB9KSxcbiAgICBdO1xuXG4gICAgaWYgKG1hcmtlckJlbG9uZ3NUb1NlbGVjdGVkU291cmNlKCkgJiYgIXNlY29uZGFyeUljb24pIHtcbiAgICAgIG9ic2VydmF0aW9uSWNvbi51bnNoaWZ0KHNlbGVjdGVkQmFja2dyb3VuZCgpKTtcbiAgICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZSgpICYmICFzZWNvbmRhcnlJY29uKSB7XG4gICAgICBvYnNlcnZhdGlvbkljb24udW5zaGlmdChiZWxvbmdzVG9Tb3VyY2VCYWNrZ3JvdW5kKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnNlcnZhdGlvbkljb24udW5zaGlmdChzdGFuZGFyZEJhY2tncm91bmQoc2Vjb25kYXJ5SWNvbikpO1xuICAgIH1cblxuICAgIG9ic2VydmF0aW9uSWNvbi5mb3JFYWNoKChpY29uKSA9PiB7XG4gICAgICBsZXQgcG9pbnRDdXN0b21JY29uOiBhbnkgPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICByaXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICB9KS5hZGRUbyhtYXApO1xuICAgICAgcG9pbnRDdXN0b21JY29uLmJpbmRUb29sdGlwKGAke3BvaW50Lmdyb3VwLm5hbWV9ICgke3BvaW50LmlkfSlgKTtcbiAgICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0X2lkJ10gPSBwb2ludC5pZDtcbiAgICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0J10gPSAnT2JzZXJ2YXRpb24nO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHBvcHVwQ29udGVudCA9IChvYnM6IGFueSkgPT4ge1xuICAgIGlmIChvYnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtcG9wdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtZ3JhcGgtaWNvbiBwb3B1cC1ncmFwaC1pY29uLSR7cG9pbnQuaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiJHtHcmFwaEljb259XCIvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NpdGUtbmFtZVwiPjxiPiR7cG9pbnQuZ3JvdXAubmFtZX08L2I+PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPGhyLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWN0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1wb3B1cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1ncmFwaC1pY29uIHBvcHVwLWdyYXBoLWljb24tJHtvYnMuaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiJHtHcmFwaEljb259XCIvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NpdGUtbmFtZVwiPjxiPiR7XG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnQuZ3JvdXAubmFtZVxuICAgICAgICAgICAgICAgICAgICB9PC9iPjwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250ZW50X19zZXZlcml0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwb3B1cC1jb250ZW50X19zZXZlcml0eS1wXCI+JHtpMThuLnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBldmVudHNfb3ZlcnZpZXcuc2V2ZXJpdHlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgKX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwb3B1cC1jb250ZW50X19zZXZlcml0eS0tJyArIG9icy5zZXZlcml0eVxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwicG9wdXAtY29udGVudF9fc2V2ZXJpdHktYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2kxOG4udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZXZlbnRzX292ZXJ2aWV3LnNldmVyaXRpZXMuJHtvYnMuc2V2ZXJpdHl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwicG9wdXAtY29udGVudF9faHJcIiAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250ZW50X19kaXNjaGFyZ2UtdGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NldmVyaXR5LXBcIj4ke2kxOG4udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBldmVudHNfb3ZlcnZpZXcuZmlyc3Rfc2VlbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX06PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxiIGlkPVwiZmlyc3Qtc2Vlbi1wb3B1cFwiPjwvYj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwb3B1cC1jb250ZW50X19zZXZlcml0eS1wXCI+JHtpMThuLnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZXZlbnRzX292ZXJ2aWV3Lmxhc3Rfc2VlbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX06PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxiIGlkPVwibGFzdC1zZWVuLXBvcHVwXCI+PC9iPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuICAgIH1cbiAgfTtcblxuICB1c2VSZW1vdmVFeGlzdGluZ0xheWVycyhtYXAsIHBvaW50LCAnUG9pbnQnKTtcbiAgdXNlUmVtb3ZlRXhpc3RpbmdMYXllcnMobWFwLCBwb2ludCwgJ09ic2VydmF0aW9uJyk7XG4gIHVzZVJlbW92ZUV4aXN0aW5nTGF5ZXJzKG1hcCwgcG9pbnQsICdTYW1wbGluZycpO1xuICB1c2VSZW1vdmVFeGlzdGluZ0xheWVycyhtYXAsIHBvaW50LCAnSWNvbk51bWJlcicpO1xuXG4gIGNvbnN0IHBvaW50SXNPYnNlcnZhdGlvbiA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2VudGVyZWRFdmVudCAhPT0gbnVsbCAmJlxuICAgICAgY2VudGVyZWRFdmVudC5vYnNlcnZhdGlvbnMuZmlsdGVyKChvYnMpID0+IG9icy5wb2ludF9pZCA9PT0gcG9pbnQuaWQpWzBdXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBwb2ludEJlbG9uZ3NUb0V2ZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRQb3B1cFRvUG9pbnQgPSAob2JzOiBhbnkgPSBudWxsKSA9PiB7XG4gICAgbGV0IGxheWVycyA9IG1hcC5fbGF5ZXJzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXJzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFsnUG9pbnQnLCAnT2JzZXJ2YXRpb24nXS5pbmNsdWRlcyhsYXllcnNbcHJvcGVydHldLmthbmRvX29iamVjdCkgJiZcbiAgICAgICAgbGF5ZXJzW3Byb3BlcnR5XS5rYW5kb19vYmplY3RfaWQgPT09IHBvaW50LmlkXG4gICAgICApIHtcbiAgICAgICAgbGF5ZXJzW3Byb3BlcnR5XS5iaW5kUG9wdXAocG9wdXBDb250ZW50KG9icyksIHtcbiAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICB9KTtcbiAgICAgICAgbGF5ZXJzW3Byb3BlcnR5XS5vbigncG9wdXBvcGVuJywgZnVuY3Rpb24gKGU6IGFueSkge1xuICAgICAgICAgIGlmIChmb2N1c2VkRXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdFNlZW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxldCBsYXN0U2VlbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbGV0IHNlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBpZiAob2JzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgICAgICAgICA8VGltZUZvcm1hdFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wPXtvYnMuc3RhcnRfdGltZX1cbiAgICAgICAgICAgICAgICAgIHRpbWVfem9uZT17b2JzLnRpbWVfem9uZX1cbiAgICAgICAgICAgICAgICAvPixcbiAgICAgICAgICAgICAgICBmaXJzdFNlZW4sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgICAgICAgICA8VGltZUZvcm1hdFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wPXtvYnMubGFzdF9zZWVuX3RpbWV9XG4gICAgICAgICAgICAgICAgICB0aW1lX3pvbmU9e29icy50aW1lX3pvbmV9XG4gICAgICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICAgICAgbGFzdFNlZW4sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoXG4gICAgICAgICAgICAgICAgPFNlY3RvclxuICAgICAgICAgICAgICAgICAgc2VjdG9yTmFtZT17cG9pbnQuZ3JvdXAuc2VjdG9yX25hbWV9XG4gICAgICAgICAgICAgICAgICBzZWN0b3JJY29uTmFtZT17cG9pbnQuZ3JvdXAuc2VjdG9yX2ljb25fbmFtZX1cbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMzdcIlxuICAgICAgICAgICAgICAgIC8+LFxuICAgICAgICAgICAgICAgIHNlY3RvcixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICQoJyNmaXJzdC1zZWVuLXBvcHVwJykuYXBwZW5kKGZpcnN0U2Vlbik7XG4gICAgICAgICAgICAgICQoJyNsYXN0LXNlZW4tcG9wdXAnKS5hcHBlbmQobGFzdFNlZW4pO1xuICAgICAgICAgICAgICAkKCcjc2VjdG9yJykuYXBwZW5kKHNlY3Rvcik7XG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBhdHRhY2hDbGlja0V2ZW50ID0gKHNlbGVjdG9yOiBzdHJpbmcsIG9ic2VydmF0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywgc2VsZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2goY2xvc2VGbG9hdGluZ0dyYXBoKCkpO1xuICAgICAgICAgICAgICBkaXNwYXRjaChvcGVuRmxvYXRpbmdHcmFwaCh0cnVlLCBvYnNlcnZhdGlvbiwgcG9pbnQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAob2JzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRhY2hDbGlja0V2ZW50KCcucG9wdXAtZ3JhcGgtaWNvbi0nICsgb2JzLmlkLCBvYnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdHRhY2hDbGlja0V2ZW50KCcucG9wdXAtZ3JhcGgtaWNvbi0nICsgcG9pbnQuaWQsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxheWVyc1twcm9wZXJ0eV0ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGxheWVyc1twcm9wZXJ0eV0ub3BlblBvcHVwKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBjdXN0b21JY29uRm9yUG9pbnRzSWZQYXJ0T2ZQYXRoQW5kTW9uaXRvcmVkID0gKG1hcmtlckxvY2F0aW9uKSA9PiB7XG4gICAgaWYgKGNlbnRlcmVkRXZlbnQpIHtcbiAgICAgIGxldCBlZGdlc0lkczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNlbnRlcmVkRXZlbnQucGF0aC5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIGVkZ2VzSWRzLnB1c2gocGFydC5lZGdlX2lkKTtcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgcmVsZXZhbnRFZGdlcyA9IGVkZ2VzX2RhdGEuaXRlbXMuZmlsdGVyKChlZGdlKSA9PlxuICAgICAgICBlZGdlc0lkcy5pbmNsdWRlcyhlZGdlLmlkKSxcbiAgICAgICk7XG5cbiAgICAgIGxldCByZWxldmFudFBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgICAgIHJlbGV2YW50RWRnZXMuZm9yRWFjaCgoZWRnZSkgPT4ge1xuICAgICAgICByZWxldmFudFBvaW50cy5wdXNoKGVkZ2Uuc291cmNlX3BvaW50X2lkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVsZXZhbnRQb2ludHMuaW5jbHVkZXMocG9pbnQuaWQpKSB7XG4gICAgICAgIGNyZWF0ZU1hbmhvbGVQb2ludChtYXJrZXJMb2NhdGlvbik7XG4gICAgICAgIGNyZWF0ZUN1c3RvbUljb25Qb2ludChtYXJrZXJMb2NhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZVNhbXBsaW5nSWNvbnMgPSAobWFya2VyTG9jYXRpb246IG51bWJlcltdKSA9PiB7XG4gICAgaWYgKGZvY3VzZWRFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNhbXBsZWRQb2ludElkcyA9IGZvY3VzZWRFdmVudC5zYW1wbGluZ3MubWFwKChzKSA9PiBzLnBvaW50X2lkKTtcbiAgICAgIGlmIChcbiAgICAgICAgZm9jdXNlZEV2ZW50ICE9PSBudWxsICYmXG4gICAgICAgIGZvY3VzZWRFdmVudC5zYW1wbGluZ3MubGVuZ3RoICE9PSAwICYmXG4gICAgICAgIHNhbXBsZWRQb2ludElkcy5pbmNsdWRlcyhwb2ludC5pZClcbiAgICAgICkge1xuICAgICAgICBjcmVhdGVTYW1wbGluZ0ljb25Qb2ludChcbiAgICAgICAgICBtYXJrZXJMb2NhdGlvbixcbiAgICAgICAgICBtYXRjaEljb25Ub1BvaW50KHBvaW50KSAhPT0gbnVsbCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTG9naWMgPSAoKSA9PiB7XG4gICAgbGV0IG1hcmtlckxvY2F0aW9uID0gW3BvaW50WydsYXRpdHVkZSddLCBwb2ludFsnbG9uZ2l0dWRlJ11dO1xuICAgIGN1c3RvbUljb25Gb3JQb2ludHNJZlBhcnRPZlBhdGhBbmRNb25pdG9yZWQobWFya2VyTG9jYXRpb24pO1xuICAgIGlmICghcG9pbnQuZXZlbnRzVmlld0hvdmVyZWQpIGNyZWF0ZU1hbmhvbGVQb2ludChtYXJrZXJMb2NhdGlvbik7XG4gICAgaWYgKG1hcmtlckxvY2F0aW9uWzBdICE9PSBudWxsKSB7XG4gICAgICBjcmVhdGVTYW1wbGluZ0ljb25zKG1hcmtlckxvY2F0aW9uKTtcbiAgICAgIGlmIChwb2ludC5wYXJ0X29mX21vbml0b3JlZF9wYXRoICYmICFwb2ludC5oYXNfZGV2aWNlKSByZXR1cm47XG4gICAgICBpZiAoXG4gICAgICAgIG1hdGNoSWNvblRvUG9pbnQocG9pbnQpICE9PSBudWxsICYmXG4gICAgICAgIChjZW50ZXJlZEV2ZW50ID09PSBudWxsIHx8XG4gICAgICAgICAgKGNlbnRlcmVkRXZlbnQgIT09IG51bGwgJiYgcG9pbnRJc09ic2VydmF0aW9uKCkpIHx8XG4gICAgICAgICAgcG9pbnQuZ3JvdXAudHlwZSA9PT0gJ0dyb3Vwczo6V2FzdGV3YXRlclRyZWF0bWVudFBsYW50JylcbiAgICAgICkge1xuICAgICAgICBpZiAocG9pbnQuZXZlbnRzVmlld0hvdmVyZWQpIGNyZWF0ZU1hbmhvbGVQb2ludChtYXJrZXJMb2NhdGlvbik7XG4gICAgICAgIGNyZWF0ZUN1c3RvbUljb25Qb2ludChtYXJrZXJMb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb2N1c2VkRXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IGhhc1ByaW1hcnlJY29uID0gbWF0Y2hJY29uVG9Qb2ludChwb2ludCkgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKHBvaW50SXNPYnNlcnZhdGlvbigpKSB7XG4gICAgICAgICAgY3JlYXRlT2JzZXJ2YXRpb25JY29uUG9pbnQobWFya2VyTG9jYXRpb24sIGhhc1ByaW1hcnlJY29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2VudGVyZWRFdmVudCAhPT0gbnVsbCAmJiBwb2ludEJlbG9uZ3NUb0V2ZW50KCkpIHtcbiAgICAgICAgbGV0IG9icyA9IGNlbnRlcmVkRXZlbnQub2JzZXJ2YXRpb25zLmZpbHRlcihcbiAgICAgICAgICAob2JzKSA9PiBvYnMucG9pbnRfaWQgPT09IHBvaW50LmlkLFxuICAgICAgICApWzBdO1xuICAgICAgICBiaW5kUG9wdXBUb1BvaW50KG9icyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVuZGVyTG9naWMoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgLy8gVU5CSU5EIFBPUFVQXG4gICAgICByZW1vdmVGcm9tTWFwKG1hcCwgcG9pbnQsICdPYnNlcnZhdGlvbicpO1xuICAgICAgcmVtb3ZlRnJvbU1hcChtYXAsIHBvaW50LCAnUG9pbnQnKTtcbiAgICAgIHJlbW92ZUZyb21NYXAobWFwLCBwb2ludCwgJ1NhbXBsaW5nJyk7XG4gICAgICByZW1vdmVGcm9tTWFwKG1hcCwgcG9pbnQsICdJY29uTnVtYmVyJyk7XG4gICAgfTtcbiAgfSwgW2NlbnRlcmVkRXZlbnRdKTtcblxuICByZXR1cm4gPGRpdj48L2Rpdj47XG59O1xuXG5jb25zdCBjb25uZWN0b3IgPSBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcyk7XG5leHBvcnQgZGVmYXVsdCBjb25uZWN0b3IoXG4gIFJlYWN0Lm1lbW8oUG9pbnRNYXJrZXIsIChwcmV2UHJvcHMsIG5leHRQcm9wcykgPT4ge1xuICAgIGlmIChcbiAgICAgIHByZXZQcm9wcy5ldmVudHNfZGF0YS5mb2N1c2VkRXZlbnQgIT09IG5leHRQcm9wcy5ldmVudHNfZGF0YS5mb2N1c2VkRXZlbnRcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSksXG4pO1xuIl19