@kando-env/kando-ui 1.2.251 → 1.2.253

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 (51) hide show
  1. package/lib/Widgets/Map/Map.js +100 -23
  2. package/lib/Widgets/Map/Map.scss +67 -0
  3. package/lib/Widgets/Map/MapUtils.js +27 -12
  4. package/lib/Widgets/Map/areas/AreaPolygons.js +3 -3
  5. package/lib/Widgets/Map/edges/Edge.js +2 -2
  6. package/lib/Widgets/Map/edges/Edge.scss +7 -2
  7. package/lib/Widgets/Map/edges/Edges.js +14 -2
  8. package/lib/Widgets/Map/events/EventIndicator.js +2 -2
  9. package/lib/Widgets/Map/events/EventPath.js +1 -1
  10. package/lib/Widgets/Map/events/EventUtils.js +23 -17
  11. package/lib/Widgets/Map/events/NetworkForSpecificEvent.js +6 -2
  12. package/lib/Widgets/Map/events/PointOfEvent.js +10 -7
  13. package/lib/Widgets/Map/points/PointIcon.js +44 -0
  14. package/lib/Widgets/Map/points/PointIcon.scss +230 -0
  15. package/lib/Widgets/Map/points/PointMarker.js +22 -19
  16. package/lib/Widgets/Map/points/PointMarkers.js +62 -13
  17. package/lib/Widgets/Map/points/PointUtils.js +83 -33
  18. package/lib/assets/icons/pin/pin-matash-white.svg +8 -42
  19. package/lib/assets/icons/plus_v.svg +13 -0
  20. package/lib/assets/icons/water_reuse.svg +27 -0
  21. package/lib/assets/map/pin-matash-clicked.svg +12 -0
  22. package/lib/assets/map/pin-matash-white.svg +8 -28
  23. package/lib/assets/map/pin-plant-clicked.svg +10 -0
  24. package/lib/assets/map/pin-plant-white.svg +6 -28
  25. package/lib/assets/map/pin-suction-clicked.svg +10 -0
  26. package/lib/assets/map/pin-suction.svg +6 -23
  27. package/lib/assets/map/pin-water-clicked.svg +11 -0
  28. package/lib/assets/map/pin-water.svg +7 -17
  29. package/lib/assets/point_icons/WWTP-icon.svg +8 -21
  30. package/lib/assets/point_icons/factory-icon.svg +6 -21
  31. package/lib/assets/point_icons/pump-station-icon.svg +6 -16
  32. package/lib/components/Header/InfoBar/InfoBar.js +7 -1
  33. package/lib/hooks/useMap.js +4 -14
  34. package/lib/i18n/en.json +8 -7
  35. package/lib/i18n/he.json +3 -0
  36. package/lib/index.js +9 -1
  37. package/lib/macros/getVersion.js +1 -1
  38. package/lib/pages/EventsPage/EventsMapContainer/EventsMapContainer.js +20 -4
  39. package/lib/pages/EventsPage/EventsMapContainer/EventsMapContainerHelpers.js +4 -4
  40. package/lib/pages/EventsPage/events/event_info/EventInfo.js +3 -2
  41. package/lib/pages/EventsPage/events/events_list/EventsList.js +16 -9
  42. package/lib/pages/EventsPage/events/events_list/Filter/FilterContainer.js +5 -1
  43. package/lib/pages/NotificationsPageV2/components/NotificationsForm/NotificationsFormContent.js +7 -5
  44. package/lib/pages/UtilityDashboardPage/UtilityDashboardMapContainer/UtilityDashboardMapContainer.js +4 -2
  45. package/lib/store/global/models/IGlobalState.js +1 -1
  46. package/lib/store/points/models/IGroup.js +1 -1
  47. package/lib/store/points/models/IPoint.js +1 -1
  48. package/lib/utilities/edgesMath.js +5 -3
  49. package/lib/utilities/map/icons.js +19 -7
  50. package/lib/utilities/polylinedecorator.js +383 -0
  51. package/package.json +9 -4
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.computeSegmentHeading = exports.asRatioToPathLength = void 0;
8
+ exports.parseRelativeOrAbsoluteValue = parseRelativeOrAbsoluteValue;
9
+ exports.projectPatternOnPointPath = projectPatternOnPointPath;
10
+ var _leaflet = _interopRequireDefault(require("leaflet"));
11
+ require("leaflet-rotatedmarker");
12
+ // enable rotationAngle and rotationOrigin support on L.Marker
13
+
14
+ /**
15
+ * Defines several classes of symbol factories,
16
+ * to be used with L.PolylineDecorator
17
+ */
18
+
19
+ _leaflet.default.Symbol = _leaflet.default.Symbol || {};
20
+
21
+ /**
22
+ * A simple dash symbol, drawn as a Polyline.
23
+ * Can also be used for dots, if 'pixelSize' option is given the 0 value.
24
+ */
25
+ _leaflet.default.Symbol.Dash = _leaflet.default.Class.extend({
26
+ options: {
27
+ pixelSize: 10,
28
+ pathOptions: {}
29
+ },
30
+ initialize: function initialize(options) {
31
+ _leaflet.default.Util.setOptions(this, options);
32
+ this.options.pathOptions.clickable = false;
33
+ },
34
+ buildSymbol: function buildSymbol(dirPoint, latLngs, map, index, total) {
35
+ var opts = this.options;
36
+ var d2r = Math.PI / 180;
37
+
38
+ // for a dot, nothing more to compute
39
+ if (opts.pixelSize <= 1) {
40
+ return _leaflet.default.polyline([dirPoint.latLng, dirPoint.latLng], opts.pathOptions);
41
+ }
42
+ var midPoint = map.project(dirPoint.latLng);
43
+ var angle = -(dirPoint.heading - 90) * d2r;
44
+ var a = _leaflet.default.point(midPoint.x + opts.pixelSize * Math.cos(angle + Math.PI) / 2, midPoint.y + opts.pixelSize * Math.sin(angle) / 2);
45
+ // compute second point by central symmetry to avoid unecessary cos/sin
46
+ var b = midPoint.add(midPoint.subtract(a));
47
+ return _leaflet.default.polyline([map.unproject(a), map.unproject(b)], opts.pathOptions);
48
+ }
49
+ });
50
+ _leaflet.default.Symbol.dash = function (options) {
51
+ return new _leaflet.default.Symbol.Dash(options);
52
+ };
53
+ _leaflet.default.Symbol.ArrowHead = _leaflet.default.Class.extend({
54
+ options: {
55
+ polygon: true,
56
+ pixelSize: 10,
57
+ headAngle: 60,
58
+ pathOptions: {
59
+ stroke: false,
60
+ weight: 2
61
+ }
62
+ },
63
+ initialize: function initialize(options) {
64
+ _leaflet.default.Util.setOptions(this, options);
65
+ this.options.pathOptions.clickable = false;
66
+ },
67
+ buildSymbol: function buildSymbol(dirPoint, latLngs, map, index, total) {
68
+ return this.options.polygon ? _leaflet.default.polygon(this._buildArrowPath(dirPoint, map), this.options.pathOptions) : _leaflet.default.polyline(this._buildArrowPath(dirPoint, map), this.options.pathOptions);
69
+ },
70
+ _buildArrowPath: function _buildArrowPath(dirPoint, map) {
71
+ var d2r = Math.PI / 180;
72
+ var tipPoint = map.project(dirPoint.latLng);
73
+ var direction = -(dirPoint.heading - 90) * d2r;
74
+ var radianArrowAngle = this.options.headAngle / 2 * d2r;
75
+ var headAngle1 = direction + radianArrowAngle;
76
+ var headAngle2 = direction - radianArrowAngle;
77
+ var arrowHead1 = _leaflet.default.point(tipPoint.x - this.options.pixelSize * Math.cos(headAngle1), tipPoint.y + this.options.pixelSize * Math.sin(headAngle1));
78
+ var arrowHead2 = _leaflet.default.point(tipPoint.x - this.options.pixelSize * Math.cos(headAngle2), tipPoint.y + this.options.pixelSize * Math.sin(headAngle2));
79
+ return [map.unproject(arrowHead1), dirPoint.latLng, map.unproject(arrowHead2)];
80
+ }
81
+ });
82
+ _leaflet.default.Symbol.arrowHead = function (options) {
83
+ return new _leaflet.default.Symbol.ArrowHead(options);
84
+ };
85
+ _leaflet.default.Symbol.Marker = _leaflet.default.Class.extend({
86
+ options: {
87
+ markerOptions: {},
88
+ rotate: false
89
+ },
90
+ initialize: function initialize(options) {
91
+ _leaflet.default.Util.setOptions(this, options);
92
+ this.options.markerOptions.clickable = false;
93
+ this.options.markerOptions.draggable = false;
94
+ },
95
+ buildSymbol: function buildSymbol(directionPoint, latLngs, map, index, total) {
96
+ if (this.options.rotate) {
97
+ this.options.markerOptions.rotationAngle = directionPoint.heading + (this.options.angleCorrection || 0);
98
+ }
99
+ return _leaflet.default.marker(directionPoint.latLng, this.options.markerOptions);
100
+ }
101
+ });
102
+ _leaflet.default.Symbol.marker = function (options) {
103
+ return new _leaflet.default.Symbol.Marker(options);
104
+ };
105
+ var isCoord = function isCoord(c) {
106
+ return c instanceof _leaflet.default.LatLng || Array.isArray(c) && c.length === 2 && typeof c[0] === 'number';
107
+ };
108
+ var isCoordArray = function isCoordArray(ll) {
109
+ return Array.isArray(ll) && isCoord(ll[0]);
110
+ };
111
+ _leaflet.default.PolylineDecorator = _leaflet.default.FeatureGroup.extend({
112
+ options: {
113
+ patterns: []
114
+ },
115
+ initialize: function initialize(paths, options) {
116
+ _leaflet.default.FeatureGroup.prototype.initialize.call(this);
117
+ _leaflet.default.Util.setOptions(this, options);
118
+ this._map = null;
119
+ this._paths = this._initPaths(paths);
120
+ this._bounds = this._initBounds();
121
+ this._patterns = this._initPatterns(this.options.patterns);
122
+ },
123
+ /**
124
+ * Deals with all the different cases. input can be one of these types:
125
+ * array of LatLng, array of 2-number arrays, Polyline, Polygon,
126
+ * array of one of the previous.
127
+ */
128
+ _initPaths: function _initPaths(input, isPolygon) {
129
+ var _this = this;
130
+ if (isCoordArray(input)) {
131
+ // Leaflet Polygons don't need the first point to be repeated, but we do
132
+ var coords = isPolygon ? input.concat([input[0]]) : input;
133
+ return [coords];
134
+ }
135
+ if (input instanceof _leaflet.default.Polyline) {
136
+ // we need some recursivity to support multi-poly*
137
+ return this._initPaths(input.getLatLngs(), input instanceof _leaflet.default.Polygon);
138
+ }
139
+ if (Array.isArray(input)) {
140
+ // flatten everything, we just need coordinate lists to apply patterns
141
+ return input.reduce(function (flatArray, p) {
142
+ return flatArray.concat(_this._initPaths(p, isPolygon));
143
+ }, []);
144
+ }
145
+ return [];
146
+ },
147
+ // parse pattern definitions and precompute some values
148
+ _initPatterns: function _initPatterns(patternDefs) {
149
+ return patternDefs.map(this._parsePatternDef);
150
+ },
151
+ /**
152
+ * Changes the patterns used by this decorator
153
+ * and redraws the new one.
154
+ */
155
+ setPatterns: function setPatterns(patterns) {
156
+ this.options.patterns = patterns;
157
+ this._patterns = this._initPatterns(this.options.patterns);
158
+ this.redraw();
159
+ },
160
+ /**
161
+ * Changes the patterns used by this decorator
162
+ * and redraws the new one.
163
+ */
164
+ setPaths: function setPaths(paths) {
165
+ this._paths = this._initPaths(paths);
166
+ this._bounds = this._initBounds();
167
+ this.redraw();
168
+ },
169
+ /**
170
+ * Parse the pattern definition
171
+ */
172
+ _parsePatternDef: function _parsePatternDef(patternDef, latLngs) {
173
+ return {
174
+ symbolFactory: patternDef.symbol,
175
+ // Parse offset and repeat values, managing the two cases:
176
+ // absolute (in pixels) or relative (in percentage of the polyline length)
177
+ offset: parseRelativeOrAbsoluteValue(patternDef.offset),
178
+ endOffset: parseRelativeOrAbsoluteValue(patternDef.endOffset),
179
+ repeat: parseRelativeOrAbsoluteValue(patternDef.repeat)
180
+ };
181
+ },
182
+ onAdd: function onAdd(map) {
183
+ this._map = map;
184
+ this._draw();
185
+ this._map.on('moveend', this.redraw, this);
186
+ },
187
+ onRemove: function onRemove(map) {
188
+ this._map.off('moveend', this.redraw, this);
189
+ this._map = null;
190
+ _leaflet.default.FeatureGroup.prototype.onRemove.call(this, map);
191
+ },
192
+ /**
193
+ * As real pattern bounds depends on map zoom and bounds,
194
+ * we just compute the total bounds of all paths decorated by this instance.
195
+ */
196
+ _initBounds: function _initBounds() {
197
+ var allPathCoords = this._paths.reduce(function (acc, path) {
198
+ return acc.concat(path);
199
+ }, []);
200
+ return _leaflet.default.latLngBounds(allPathCoords);
201
+ },
202
+ getBounds: function getBounds() {
203
+ return this._bounds;
204
+ },
205
+ /**
206
+ * Returns an array of ILayers object
207
+ */
208
+ _buildSymbols: function _buildSymbols(latLngs, symbolFactory, directionPoints) {
209
+ var _this2 = this;
210
+ return directionPoints.map(function (directionPoint, i) {
211
+ return symbolFactory.buildSymbol(directionPoint, latLngs, _this2._map, i, directionPoints.length);
212
+ });
213
+ },
214
+ /**
215
+ * Compute pairs of LatLng and heading angle,
216
+ * that define positions and directions of the symbols on the path
217
+ */
218
+ _getDirectionPoints: function _getDirectionPoints(latLngs, pattern) {
219
+ var _this3 = this;
220
+ if (latLngs.length < 2) {
221
+ return [];
222
+ }
223
+ var pathAsPoints = latLngs.map(function (latLng) {
224
+ return _this3._map.project(latLng);
225
+ });
226
+ return projectPatternOnPointPath(pathAsPoints, pattern).map(function (point) {
227
+ return {
228
+ latLng: _this3._map.unproject(_leaflet.default.point(point.pt)),
229
+ heading: point.heading
230
+ };
231
+ });
232
+ },
233
+ redraw: function redraw() {
234
+ if (!this._map) {
235
+ return;
236
+ }
237
+ this.clearLayers();
238
+ this._draw();
239
+ },
240
+ /**
241
+ * Returns all symbols for a given pattern as an array of FeatureGroup
242
+ */
243
+ _getPatternLayers: function _getPatternLayers(pattern) {
244
+ var _this4 = this;
245
+ var mapBounds = this._map.getBounds().pad(0.1);
246
+ return this._paths.map(function (path) {
247
+ var directionPoints = _this4._getDirectionPoints(path, pattern)
248
+ // filter out invisible points
249
+ .filter(function (point) {
250
+ return mapBounds.contains(point.latLng);
251
+ });
252
+ return _leaflet.default.featureGroup(_this4._buildSymbols(path, pattern.symbolFactory, directionPoints));
253
+ });
254
+ },
255
+ /**
256
+ * Draw all patterns
257
+ */
258
+ _draw: function _draw() {
259
+ var _this5 = this;
260
+ this._patterns.map(function (pattern) {
261
+ return _this5._getPatternLayers(pattern);
262
+ }).forEach(function (layers) {
263
+ _this5.addLayer(_leaflet.default.featureGroup(layers));
264
+ });
265
+ }
266
+ });
267
+ /*
268
+ * Allows compact syntax to be used
269
+ */
270
+ _leaflet.default.polylineDecorator = function (paths, options) {
271
+ return new _leaflet.default.PolylineDecorator(paths, options);
272
+ };
273
+
274
+ // functional re-impl of L.Point.distanceTo,
275
+ // with no dependency on Leaflet for easier testing
276
+ function pointDistance(ptA, ptB) {
277
+ var x = ptB.x - ptA.x;
278
+ var y = ptB.y - ptA.y;
279
+ return Math.sqrt(x * x + y * y);
280
+ }
281
+ var computeSegmentHeading = function computeSegmentHeading(a, b) {
282
+ return (Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI + 90 + 360) % 360;
283
+ };
284
+ exports.computeSegmentHeading = computeSegmentHeading;
285
+ var asRatioToPathLength = function asRatioToPathLength(_ref, totalPathLength) {
286
+ var value = _ref.value,
287
+ isInPixels = _ref.isInPixels;
288
+ return isInPixels ? value / totalPathLength : value;
289
+ };
290
+ exports.asRatioToPathLength = asRatioToPathLength;
291
+ function parseRelativeOrAbsoluteValue(value) {
292
+ if (typeof value === 'string' && value.indexOf('%') !== -1) {
293
+ return {
294
+ value: parseFloat(value) / 100,
295
+ isInPixels: false
296
+ };
297
+ }
298
+ var parsedValue = value ? parseFloat(value) : 0;
299
+ return {
300
+ value: parsedValue,
301
+ isInPixels: parsedValue > 0
302
+ };
303
+ }
304
+ var pointsEqual = function pointsEqual(a, b) {
305
+ return a.x === b.x && a.y === b.y;
306
+ };
307
+ function pointsToSegments(pts) {
308
+ return pts.reduce(function (segments, b, idx, points) {
309
+ // this test skips same adjacent points
310
+ if (idx > 0 && !pointsEqual(b, points[idx - 1])) {
311
+ var a = points[idx - 1];
312
+ var distA = segments.length > 0 ? segments[segments.length - 1].distB : 0;
313
+ var distAB = pointDistance(a, b);
314
+ segments.push({
315
+ a: a,
316
+ b: b,
317
+ distA: distA,
318
+ distB: distA + distAB,
319
+ heading: computeSegmentHeading(a, b)
320
+ });
321
+ }
322
+ return segments;
323
+ }, []);
324
+ }
325
+ function projectPatternOnPointPath(pts, pattern) {
326
+ // 1. split the path into segment infos
327
+ var segments = pointsToSegments(pts);
328
+ var nbSegments = segments.length;
329
+ if (nbSegments === 0) {
330
+ return [];
331
+ }
332
+ var totalPathLength = segments[nbSegments - 1].distB;
333
+ var offset = asRatioToPathLength(pattern.offset, totalPathLength);
334
+ var endOffset = asRatioToPathLength(pattern.endOffset, totalPathLength);
335
+ var repeat = asRatioToPathLength(pattern.repeat, totalPathLength);
336
+ var repeatIntervalPixels = totalPathLength * repeat;
337
+ var startOffsetPixels = offset > 0 ? totalPathLength * offset : 0;
338
+ var endOffsetPixels = endOffset > 0 ? totalPathLength * endOffset : 0;
339
+
340
+ // 2. generate the positions of the pattern as offsets from the path start
341
+ var positionOffsets = [];
342
+ var positionOffset = startOffsetPixels;
343
+ do {
344
+ positionOffsets.push(positionOffset);
345
+ positionOffset += repeatIntervalPixels;
346
+ } while (repeatIntervalPixels > 0 && positionOffset < totalPathLength - endOffsetPixels);
347
+
348
+ // 3. projects offsets to segments
349
+ var segmentIndex = 0;
350
+ var segment = segments[0];
351
+ return positionOffsets.map(function (positionOffset) {
352
+ // find the segment matching the offset,
353
+ // starting from the previous one as offsets are ordered
354
+ while (positionOffset > segment.distB && segmentIndex < nbSegments - 1) {
355
+ segmentIndex++;
356
+ segment = segments[segmentIndex];
357
+ }
358
+ var segmentRatio = (positionOffset - segment.distA) / (segment.distB - segment.distA);
359
+ return {
360
+ pt: interpolateBetweenPoints(segment.a, segment.b, segmentRatio),
361
+ heading: segment.heading
362
+ };
363
+ });
364
+ }
365
+
366
+ /**
367
+ * Finds the point which lies on the segment defined by points A and B,
368
+ * at the given ratio of the distance from A to B, by linear interpolation.
369
+ */
370
+ function interpolateBetweenPoints(ptA, ptB, ratio) {
371
+ if (ptB.x !== ptA.x) {
372
+ return {
373
+ x: ptA.x + ratio * (ptB.x - ptA.x),
374
+ y: ptA.y + ratio * (ptB.y - ptA.y)
375
+ };
376
+ }
377
+ // special case where points lie on the same vertical axis
378
+ return {
379
+ x: ptA.x,
380
+ y: ptA.y + (ptB.y - ptA.y) * ratio
381
+ };
382
+ }
383
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGVhZmxldCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiTCIsIlN5bWJvbCIsIkRhc2giLCJDbGFzcyIsImV4dGVuZCIsIm9wdGlvbnMiLCJwaXhlbFNpemUiLCJwYXRoT3B0aW9ucyIsImluaXRpYWxpemUiLCJVdGlsIiwic2V0T3B0aW9ucyIsImNsaWNrYWJsZSIsImJ1aWxkU3ltYm9sIiwiZGlyUG9pbnQiLCJsYXRMbmdzIiwibWFwIiwiaW5kZXgiLCJ0b3RhbCIsIm9wdHMiLCJkMnIiLCJNYXRoIiwiUEkiLCJwb2x5bGluZSIsImxhdExuZyIsIm1pZFBvaW50IiwicHJvamVjdCIsImFuZ2xlIiwiaGVhZGluZyIsImEiLCJwb2ludCIsIngiLCJjb3MiLCJ5Iiwic2luIiwiYiIsImFkZCIsInN1YnRyYWN0IiwidW5wcm9qZWN0IiwiZGFzaCIsIkFycm93SGVhZCIsInBvbHlnb24iLCJoZWFkQW5nbGUiLCJzdHJva2UiLCJ3ZWlnaHQiLCJfYnVpbGRBcnJvd1BhdGgiLCJ0aXBQb2ludCIsImRpcmVjdGlvbiIsInJhZGlhbkFycm93QW5nbGUiLCJoZWFkQW5nbGUxIiwiaGVhZEFuZ2xlMiIsImFycm93SGVhZDEiLCJhcnJvd0hlYWQyIiwiYXJyb3dIZWFkIiwiTWFya2VyIiwibWFya2VyT3B0aW9ucyIsInJvdGF0ZSIsImRyYWdnYWJsZSIsImRpcmVjdGlvblBvaW50Iiwicm90YXRpb25BbmdsZSIsImFuZ2xlQ29ycmVjdGlvbiIsIm1hcmtlciIsImlzQ29vcmQiLCJjIiwiTGF0TG5nIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaXNDb29yZEFycmF5IiwibGwiLCJQb2x5bGluZURlY29yYXRvciIsIkZlYXR1cmVHcm91cCIsInBhdHRlcm5zIiwicGF0aHMiLCJwcm90b3R5cGUiLCJjYWxsIiwiX21hcCIsIl9wYXRocyIsIl9pbml0UGF0aHMiLCJfYm91bmRzIiwiX2luaXRCb3VuZHMiLCJfcGF0dGVybnMiLCJfaW5pdFBhdHRlcm5zIiwiaW5wdXQiLCJpc1BvbHlnb24iLCJfdGhpcyIsImNvb3JkcyIsImNvbmNhdCIsIlBvbHlsaW5lIiwiZ2V0TGF0TG5ncyIsIlBvbHlnb24iLCJyZWR1Y2UiLCJmbGF0QXJyYXkiLCJwIiwicGF0dGVybkRlZnMiLCJfcGFyc2VQYXR0ZXJuRGVmIiwic2V0UGF0dGVybnMiLCJyZWRyYXciLCJzZXRQYXRocyIsInBhdHRlcm5EZWYiLCJzeW1ib2xGYWN0b3J5Iiwic3ltYm9sIiwib2Zmc2V0IiwicGFyc2VSZWxhdGl2ZU9yQWJzb2x1dGVWYWx1ZSIsImVuZE9mZnNldCIsInJlcGVhdCIsIm9uQWRkIiwiX2RyYXciLCJvbiIsIm9uUmVtb3ZlIiwib2ZmIiwiYWxsUGF0aENvb3JkcyIsImFjYyIsInBhdGgiLCJsYXRMbmdCb3VuZHMiLCJnZXRCb3VuZHMiLCJfYnVpbGRTeW1ib2xzIiwiZGlyZWN0aW9uUG9pbnRzIiwiX3RoaXMyIiwiaSIsIl9nZXREaXJlY3Rpb25Qb2ludHMiLCJwYXR0ZXJuIiwiX3RoaXMzIiwicGF0aEFzUG9pbnRzIiwicHJvamVjdFBhdHRlcm5PblBvaW50UGF0aCIsInB0IiwiY2xlYXJMYXllcnMiLCJfZ2V0UGF0dGVybkxheWVycyIsIl90aGlzNCIsIm1hcEJvdW5kcyIsInBhZCIsImZpbHRlciIsImNvbnRhaW5zIiwiZmVhdHVyZUdyb3VwIiwiX3RoaXM1IiwiZm9yRWFjaCIsImxheWVycyIsImFkZExheWVyIiwicG9seWxpbmVEZWNvcmF0b3IiLCJwb2ludERpc3RhbmNlIiwicHRBIiwicHRCIiwic3FydCIsImNvbXB1dGVTZWdtZW50SGVhZGluZyIsImF0YW4yIiwiZXhwb3J0cyIsImFzUmF0aW9Ub1BhdGhMZW5ndGgiLCJfcmVmIiwidG90YWxQYXRoTGVuZ3RoIiwidmFsdWUiLCJpc0luUGl4ZWxzIiwiaW5kZXhPZiIsInBhcnNlRmxvYXQiLCJwYXJzZWRWYWx1ZSIsInBvaW50c0VxdWFsIiwicG9pbnRzVG9TZWdtZW50cyIsInB0cyIsInNlZ21lbnRzIiwiaWR4IiwicG9pbnRzIiwiZGlzdEEiLCJkaXN0QiIsImRpc3RBQiIsInB1c2giLCJuYlNlZ21lbnRzIiwicmVwZWF0SW50ZXJ2YWxQaXhlbHMiLCJzdGFydE9mZnNldFBpeGVscyIsImVuZE9mZnNldFBpeGVscyIsInBvc2l0aW9uT2Zmc2V0cyIsInBvc2l0aW9uT2Zmc2V0Iiwic2VnbWVudEluZGV4Iiwic2VnbWVudCIsInNlZ21lbnRSYXRpbyIsImludGVycG9sYXRlQmV0d2VlblBvaW50cyIsInJhdGlvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxpdGllcy9wb2x5bGluZWRlY29yYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTCBmcm9tICdsZWFmbGV0Jztcbi8vIGVuYWJsZSByb3RhdGlvbkFuZ2xlIGFuZCByb3RhdGlvbk9yaWdpbiBzdXBwb3J0IG9uIEwuTWFya2VyXG5pbXBvcnQgJ2xlYWZsZXQtcm90YXRlZG1hcmtlcic7XG5cbi8qKlxuICogRGVmaW5lcyBzZXZlcmFsIGNsYXNzZXMgb2Ygc3ltYm9sIGZhY3RvcmllcyxcbiAqIHRvIGJlIHVzZWQgd2l0aCBMLlBvbHlsaW5lRGVjb3JhdG9yXG4gKi9cblxuTC5TeW1ib2wgPSBMLlN5bWJvbCB8fCB7fTtcblxuLyoqXG4gKiBBIHNpbXBsZSBkYXNoIHN5bWJvbCwgZHJhd24gYXMgYSBQb2x5bGluZS5cbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGRvdHMsIGlmICdwaXhlbFNpemUnIG9wdGlvbiBpcyBnaXZlbiB0aGUgMCB2YWx1ZS5cbiAqL1xuTC5TeW1ib2wuRGFzaCA9IEwuQ2xhc3MuZXh0ZW5kKHtcbiAgb3B0aW9uczoge1xuICAgIHBpeGVsU2l6ZTogMTAsXG4gICAgcGF0aE9wdGlvbnM6IHt9LFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLnBhdGhPcHRpb25zLmNsaWNrYWJsZSA9IGZhbHNlO1xuICB9LFxuXG4gIGJ1aWxkU3ltYm9sOiBmdW5jdGlvbiAoZGlyUG9pbnQsIGxhdExuZ3MsIG1hcCwgaW5kZXgsIHRvdGFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBkMnIgPSBNYXRoLlBJIC8gMTgwO1xuXG4gICAgLy8gZm9yIGEgZG90LCBub3RoaW5nIG1vcmUgdG8gY29tcHV0ZVxuICAgIGlmIChvcHRzLnBpeGVsU2l6ZSA8PSAxKSB7XG4gICAgICByZXR1cm4gTC5wb2x5bGluZShbZGlyUG9pbnQubGF0TG5nLCBkaXJQb2ludC5sYXRMbmddLCBvcHRzLnBhdGhPcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaWRQb2ludCA9IG1hcC5wcm9qZWN0KGRpclBvaW50LmxhdExuZyk7XG4gICAgY29uc3QgYW5nbGUgPSAtKGRpclBvaW50LmhlYWRpbmcgLSA5MCkgKiBkMnI7XG4gICAgY29uc3QgYSA9IEwucG9pbnQoXG4gICAgICBtaWRQb2ludC54ICsgKG9wdHMucGl4ZWxTaXplICogTWF0aC5jb3MoYW5nbGUgKyBNYXRoLlBJKSkgLyAyLFxuICAgICAgbWlkUG9pbnQueSArIChvcHRzLnBpeGVsU2l6ZSAqIE1hdGguc2luKGFuZ2xlKSkgLyAyLFxuICAgICk7XG4gICAgLy8gY29tcHV0ZSBzZWNvbmQgcG9pbnQgYnkgY2VudHJhbCBzeW1tZXRyeSB0byBhdm9pZCB1bmVjZXNzYXJ5IGNvcy9zaW5cbiAgICBjb25zdCBiID0gbWlkUG9pbnQuYWRkKG1pZFBvaW50LnN1YnRyYWN0KGEpKTtcbiAgICByZXR1cm4gTC5wb2x5bGluZShbbWFwLnVucHJvamVjdChhKSwgbWFwLnVucHJvamVjdChiKV0sIG9wdHMucGF0aE9wdGlvbnMpO1xuICB9LFxufSk7XG5cbkwuU3ltYm9sLmRhc2ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEwuU3ltYm9sLkRhc2gob3B0aW9ucyk7XG59O1xuXG5MLlN5bWJvbC5BcnJvd0hlYWQgPSBMLkNsYXNzLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBwb2x5Z29uOiB0cnVlLFxuICAgIHBpeGVsU2l6ZTogMTAsXG4gICAgaGVhZEFuZ2xlOiA2MCxcbiAgICBwYXRoT3B0aW9uczoge1xuICAgICAgc3Ryb2tlOiBmYWxzZSxcbiAgICAgIHdlaWdodDogMixcbiAgICB9LFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLnBhdGhPcHRpb25zLmNsaWNrYWJsZSA9IGZhbHNlO1xuICB9LFxuXG4gIGJ1aWxkU3ltYm9sOiBmdW5jdGlvbiAoZGlyUG9pbnQsIGxhdExuZ3MsIG1hcCwgaW5kZXgsIHRvdGFsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb2x5Z29uXG4gICAgICA/IEwucG9seWdvbih0aGlzLl9idWlsZEFycm93UGF0aChkaXJQb2ludCwgbWFwKSwgdGhpcy5vcHRpb25zLnBhdGhPcHRpb25zKVxuICAgICAgOiBMLnBvbHlsaW5lKFxuICAgICAgICAgIHRoaXMuX2J1aWxkQXJyb3dQYXRoKGRpclBvaW50LCBtYXApLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wYXRoT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgfSxcblxuICBfYnVpbGRBcnJvd1BhdGg6IGZ1bmN0aW9uIChkaXJQb2ludCwgbWFwKSB7XG4gICAgY29uc3QgZDJyID0gTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCB0aXBQb2ludCA9IG1hcC5wcm9qZWN0KGRpclBvaW50LmxhdExuZyk7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gLShkaXJQb2ludC5oZWFkaW5nIC0gOTApICogZDJyO1xuICAgIGNvbnN0IHJhZGlhbkFycm93QW5nbGUgPSAodGhpcy5vcHRpb25zLmhlYWRBbmdsZSAvIDIpICogZDJyO1xuXG4gICAgY29uc3QgaGVhZEFuZ2xlMSA9IGRpcmVjdGlvbiArIHJhZGlhbkFycm93QW5nbGU7XG4gICAgY29uc3QgaGVhZEFuZ2xlMiA9IGRpcmVjdGlvbiAtIHJhZGlhbkFycm93QW5nbGU7XG4gICAgY29uc3QgYXJyb3dIZWFkMSA9IEwucG9pbnQoXG4gICAgICB0aXBQb2ludC54IC0gdGhpcy5vcHRpb25zLnBpeGVsU2l6ZSAqIE1hdGguY29zKGhlYWRBbmdsZTEpLFxuICAgICAgdGlwUG9pbnQueSArIHRoaXMub3B0aW9ucy5waXhlbFNpemUgKiBNYXRoLnNpbihoZWFkQW5nbGUxKSxcbiAgICApO1xuICAgIGNvbnN0IGFycm93SGVhZDIgPSBMLnBvaW50KFxuICAgICAgdGlwUG9pbnQueCAtIHRoaXMub3B0aW9ucy5waXhlbFNpemUgKiBNYXRoLmNvcyhoZWFkQW5nbGUyKSxcbiAgICAgIHRpcFBvaW50LnkgKyB0aGlzLm9wdGlvbnMucGl4ZWxTaXplICogTWF0aC5zaW4oaGVhZEFuZ2xlMiksXG4gICAgKTtcblxuICAgIHJldHVybiBbXG4gICAgICBtYXAudW5wcm9qZWN0KGFycm93SGVhZDEpLFxuICAgICAgZGlyUG9pbnQubGF0TG5nLFxuICAgICAgbWFwLnVucHJvamVjdChhcnJvd0hlYWQyKSxcbiAgICBdO1xuICB9LFxufSk7XG5cbkwuU3ltYm9sLmFycm93SGVhZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTC5TeW1ib2wuQXJyb3dIZWFkKG9wdGlvbnMpO1xufTtcblxuTC5TeW1ib2wuTWFya2VyID0gTC5DbGFzcy5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgbWFya2VyT3B0aW9uczoge30sXG4gICAgcm90YXRlOiBmYWxzZSxcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMub3B0aW9ucy5tYXJrZXJPcHRpb25zLmNsaWNrYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy5tYXJrZXJPcHRpb25zLmRyYWdnYWJsZSA9IGZhbHNlO1xuICB9LFxuXG4gIGJ1aWxkU3ltYm9sOiBmdW5jdGlvbiAoZGlyZWN0aW9uUG9pbnQsIGxhdExuZ3MsIG1hcCwgaW5kZXgsIHRvdGFsKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yb3RhdGUpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5tYXJrZXJPcHRpb25zLnJvdGF0aW9uQW5nbGUgPVxuICAgICAgICBkaXJlY3Rpb25Qb2ludC5oZWFkaW5nICsgKHRoaXMub3B0aW9ucy5hbmdsZUNvcnJlY3Rpb24gfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiBMLm1hcmtlcihkaXJlY3Rpb25Qb2ludC5sYXRMbmcsIHRoaXMub3B0aW9ucy5tYXJrZXJPcHRpb25zKTtcbiAgfSxcbn0pO1xuXG5MLlN5bWJvbC5tYXJrZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEwuU3ltYm9sLk1hcmtlcihvcHRpb25zKTtcbn07XG5cbmNvbnN0IGlzQ29vcmQgPSAoYykgPT5cbiAgYyBpbnN0YW5jZW9mIEwuTGF0TG5nIHx8XG4gIChBcnJheS5pc0FycmF5KGMpICYmIGMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBjWzBdID09PSAnbnVtYmVyJyk7XG5cbmNvbnN0IGlzQ29vcmRBcnJheSA9IChsbCkgPT4gQXJyYXkuaXNBcnJheShsbCkgJiYgaXNDb29yZChsbFswXSk7XG5cbkwuUG9seWxpbmVEZWNvcmF0b3IgPSBMLkZlYXR1cmVHcm91cC5leHRlbmQoe1xuICBvcHRpb25zOiB7XG4gICAgcGF0dGVybnM6IFtdLFxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChwYXRocywgb3B0aW9ucykge1xuICAgIEwuRmVhdHVyZUdyb3VwLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG4gICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fbWFwID0gbnVsbDtcbiAgICB0aGlzLl9wYXRocyA9IHRoaXMuX2luaXRQYXRocyhwYXRocyk7XG4gICAgdGhpcy5fYm91bmRzID0gdGhpcy5faW5pdEJvdW5kcygpO1xuICAgIHRoaXMuX3BhdHRlcm5zID0gdGhpcy5faW5pdFBhdHRlcm5zKHRoaXMub3B0aW9ucy5wYXR0ZXJucyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlYWxzIHdpdGggYWxsIHRoZSBkaWZmZXJlbnQgY2FzZXMuIGlucHV0IGNhbiBiZSBvbmUgb2YgdGhlc2UgdHlwZXM6XG4gICAqIGFycmF5IG9mIExhdExuZywgYXJyYXkgb2YgMi1udW1iZXIgYXJyYXlzLCBQb2x5bGluZSwgUG9seWdvbixcbiAgICogYXJyYXkgb2Ygb25lIG9mIHRoZSBwcmV2aW91cy5cbiAgICovXG4gIF9pbml0UGF0aHM6IGZ1bmN0aW9uIChpbnB1dCwgaXNQb2x5Z29uKSB7XG4gICAgaWYgKGlzQ29vcmRBcnJheShpbnB1dCkpIHtcbiAgICAgIC8vIExlYWZsZXQgUG9seWdvbnMgZG9uJ3QgbmVlZCB0aGUgZmlyc3QgcG9pbnQgdG8gYmUgcmVwZWF0ZWQsIGJ1dCB3ZSBkb1xuICAgICAgY29uc3QgY29vcmRzID0gaXNQb2x5Z29uID8gaW5wdXQuY29uY2F0KFtpbnB1dFswXV0pIDogaW5wdXQ7XG4gICAgICByZXR1cm4gW2Nvb3Jkc107XG4gICAgfVxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEwuUG9seWxpbmUpIHtcbiAgICAgIC8vIHdlIG5lZWQgc29tZSByZWN1cnNpdml0eSB0byBzdXBwb3J0IG11bHRpLXBvbHkqXG4gICAgICByZXR1cm4gdGhpcy5faW5pdFBhdGhzKGlucHV0LmdldExhdExuZ3MoKSwgaW5wdXQgaW5zdGFuY2VvZiBMLlBvbHlnb24pO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgIC8vIGZsYXR0ZW4gZXZlcnl0aGluZywgd2UganVzdCBuZWVkIGNvb3JkaW5hdGUgbGlzdHMgdG8gYXBwbHkgcGF0dGVybnNcbiAgICAgIHJldHVybiBpbnB1dC5yZWR1Y2UoXG4gICAgICAgIChmbGF0QXJyYXksIHApID0+IGZsYXRBcnJheS5jb25jYXQodGhpcy5faW5pdFBhdGhzKHAsIGlzUG9seWdvbikpLFxuICAgICAgICBbXSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSxcblxuICAvLyBwYXJzZSBwYXR0ZXJuIGRlZmluaXRpb25zIGFuZCBwcmVjb21wdXRlIHNvbWUgdmFsdWVzXG4gIF9pbml0UGF0dGVybnM6IGZ1bmN0aW9uIChwYXR0ZXJuRGVmcykge1xuICAgIHJldHVybiBwYXR0ZXJuRGVmcy5tYXAodGhpcy5fcGFyc2VQYXR0ZXJuRGVmKTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgcGF0dGVybnMgdXNlZCBieSB0aGlzIGRlY29yYXRvclxuICAgKiBhbmQgcmVkcmF3cyB0aGUgbmV3IG9uZS5cbiAgICovXG4gIHNldFBhdHRlcm5zOiBmdW5jdGlvbiAocGF0dGVybnMpIHtcbiAgICB0aGlzLm9wdGlvbnMucGF0dGVybnMgPSBwYXR0ZXJucztcbiAgICB0aGlzLl9wYXR0ZXJucyA9IHRoaXMuX2luaXRQYXR0ZXJucyh0aGlzLm9wdGlvbnMucGF0dGVybnMpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHBhdHRlcm5zIHVzZWQgYnkgdGhpcyBkZWNvcmF0b3JcbiAgICogYW5kIHJlZHJhd3MgdGhlIG5ldyBvbmUuXG4gICAqL1xuICBzZXRQYXRoczogZnVuY3Rpb24gKHBhdGhzKSB7XG4gICAgdGhpcy5fcGF0aHMgPSB0aGlzLl9pbml0UGF0aHMocGF0aHMpO1xuICAgIHRoaXMuX2JvdW5kcyA9IHRoaXMuX2luaXRCb3VuZHMoKTtcbiAgICB0aGlzLnJlZHJhdygpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcGF0dGVybiBkZWZpbml0aW9uXG4gICAqL1xuICBfcGFyc2VQYXR0ZXJuRGVmOiBmdW5jdGlvbiAocGF0dGVybkRlZiwgbGF0TG5ncykge1xuICAgIHJldHVybiB7XG4gICAgICBzeW1ib2xGYWN0b3J5OiBwYXR0ZXJuRGVmLnN5bWJvbCxcbiAgICAgIC8vIFBhcnNlIG9mZnNldCBhbmQgcmVwZWF0IHZhbHVlcywgbWFuYWdpbmcgdGhlIHR3byBjYXNlczpcbiAgICAgIC8vIGFic29sdXRlIChpbiBwaXhlbHMpIG9yIHJlbGF0aXZlIChpbiBwZXJjZW50YWdlIG9mIHRoZSBwb2x5bGluZSBsZW5ndGgpXG4gICAgICBvZmZzZXQ6IHBhcnNlUmVsYXRpdmVPckFic29sdXRlVmFsdWUocGF0dGVybkRlZi5vZmZzZXQpLFxuICAgICAgZW5kT2Zmc2V0OiBwYXJzZVJlbGF0aXZlT3JBYnNvbHV0ZVZhbHVlKHBhdHRlcm5EZWYuZW5kT2Zmc2V0KSxcbiAgICAgIHJlcGVhdDogcGFyc2VSZWxhdGl2ZU9yQWJzb2x1dGVWYWx1ZShwYXR0ZXJuRGVmLnJlcGVhdCksXG4gICAgfTtcbiAgfSxcblxuICBvbkFkZDogZnVuY3Rpb24gKG1hcCkge1xuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl9kcmF3KCk7XG4gICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5yZWRyYXcsIHRoaXMpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMucmVkcmF3LCB0aGlzKTtcbiAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgIEwuRmVhdHVyZUdyb3VwLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFzIHJlYWwgcGF0dGVybiBib3VuZHMgZGVwZW5kcyBvbiBtYXAgem9vbSBhbmQgYm91bmRzLFxuICAgKiB3ZSBqdXN0IGNvbXB1dGUgdGhlIHRvdGFsIGJvdW5kcyBvZiBhbGwgcGF0aHMgZGVjb3JhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuXG4gICAqL1xuICBfaW5pdEJvdW5kczogZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFsbFBhdGhDb29yZHMgPSB0aGlzLl9wYXRocy5yZWR1Y2UoXG4gICAgICAoYWNjLCBwYXRoKSA9PiBhY2MuY29uY2F0KHBhdGgpLFxuICAgICAgW10sXG4gICAgKTtcbiAgICByZXR1cm4gTC5sYXRMbmdCb3VuZHMoYWxsUGF0aENvb3Jkcyk7XG4gIH0sXG5cbiAgZ2V0Qm91bmRzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JvdW5kcztcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBJTGF5ZXJzIG9iamVjdFxuICAgKi9cbiAgX2J1aWxkU3ltYm9sczogZnVuY3Rpb24gKGxhdExuZ3MsIHN5bWJvbEZhY3RvcnksIGRpcmVjdGlvblBvaW50cykge1xuICAgIHJldHVybiBkaXJlY3Rpb25Qb2ludHMubWFwKChkaXJlY3Rpb25Qb2ludCwgaSkgPT5cbiAgICAgIHN5bWJvbEZhY3RvcnkuYnVpbGRTeW1ib2woXG4gICAgICAgIGRpcmVjdGlvblBvaW50LFxuICAgICAgICBsYXRMbmdzLFxuICAgICAgICB0aGlzLl9tYXAsXG4gICAgICAgIGksXG4gICAgICAgIGRpcmVjdGlvblBvaW50cy5sZW5ndGgsXG4gICAgICApLFxuICAgICk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXB1dGUgcGFpcnMgb2YgTGF0TG5nIGFuZCBoZWFkaW5nIGFuZ2xlLFxuICAgKiB0aGF0IGRlZmluZSBwb3NpdGlvbnMgYW5kIGRpcmVjdGlvbnMgb2YgdGhlIHN5bWJvbHMgb24gdGhlIHBhdGhcbiAgICovXG4gIF9nZXREaXJlY3Rpb25Qb2ludHM6IGZ1bmN0aW9uIChsYXRMbmdzLCBwYXR0ZXJuKSB7XG4gICAgaWYgKGxhdExuZ3MubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwYXRoQXNQb2ludHMgPSBsYXRMbmdzLm1hcCgobGF0TG5nKSA9PiB0aGlzLl9tYXAucHJvamVjdChsYXRMbmcpKTtcbiAgICByZXR1cm4gcHJvamVjdFBhdHRlcm5PblBvaW50UGF0aChwYXRoQXNQb2ludHMsIHBhdHRlcm4pLm1hcCgocG9pbnQpID0+ICh7XG4gICAgICBsYXRMbmc6IHRoaXMuX21hcC51bnByb2plY3QoTC5wb2ludChwb2ludC5wdCkpLFxuICAgICAgaGVhZGluZzogcG9pbnQuaGVhZGluZyxcbiAgICB9KSk7XG4gIH0sXG5cbiAgcmVkcmF3OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbGVhckxheWVycygpO1xuICAgIHRoaXMuX2RyYXcoKTtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgc3ltYm9scyBmb3IgYSBnaXZlbiBwYXR0ZXJuIGFzIGFuIGFycmF5IG9mIEZlYXR1cmVHcm91cFxuICAgKi9cbiAgX2dldFBhdHRlcm5MYXllcnM6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgY29uc3QgbWFwQm91bmRzID0gdGhpcy5fbWFwLmdldEJvdW5kcygpLnBhZCgwLjEpO1xuICAgIHJldHVybiB0aGlzLl9wYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvblBvaW50cyA9IHRoaXMuX2dldERpcmVjdGlvblBvaW50cyhwYXRoLCBwYXR0ZXJuKVxuICAgICAgICAvLyBmaWx0ZXIgb3V0IGludmlzaWJsZSBwb2ludHNcbiAgICAgICAgLmZpbHRlcigocG9pbnQpID0+IG1hcEJvdW5kcy5jb250YWlucyhwb2ludC5sYXRMbmcpKTtcbiAgICAgIHJldHVybiBMLmZlYXR1cmVHcm91cChcbiAgICAgICAgdGhpcy5fYnVpbGRTeW1ib2xzKHBhdGgsIHBhdHRlcm4uc3ltYm9sRmFjdG9yeSwgZGlyZWN0aW9uUG9pbnRzKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERyYXcgYWxsIHBhdHRlcm5zXG4gICAqL1xuICBfZHJhdzogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3BhdHRlcm5zXG4gICAgICAubWFwKChwYXR0ZXJuKSA9PiB0aGlzLl9nZXRQYXR0ZXJuTGF5ZXJzKHBhdHRlcm4pKVxuICAgICAgLmZvckVhY2goKGxheWVycykgPT4ge1xuICAgICAgICB0aGlzLmFkZExheWVyKEwuZmVhdHVyZUdyb3VwKGxheWVycykpO1xuICAgICAgfSk7XG4gIH0sXG59KTtcbi8qXG4gKiBBbGxvd3MgY29tcGFjdCBzeW50YXggdG8gYmUgdXNlZFxuICovXG5MLnBvbHlsaW5lRGVjb3JhdG9yID0gZnVuY3Rpb24gKHBhdGhzLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgTC5Qb2x5bGluZURlY29yYXRvcihwYXRocywgb3B0aW9ucyk7XG59O1xuXG4vLyBmdW5jdGlvbmFsIHJlLWltcGwgb2YgTC5Qb2ludC5kaXN0YW5jZVRvLFxuLy8gd2l0aCBubyBkZXBlbmRlbmN5IG9uIExlYWZsZXQgZm9yIGVhc2llciB0ZXN0aW5nXG5mdW5jdGlvbiBwb2ludERpc3RhbmNlKHB0QSwgcHRCKSB7XG4gIGNvbnN0IHggPSBwdEIueCAtIHB0QS54O1xuICBjb25zdCB5ID0gcHRCLnkgLSBwdEEueTtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn1cblxuY29uc3QgY29tcHV0ZVNlZ21lbnRIZWFkaW5nID0gKGEsIGIpID0+XG4gICgoTWF0aC5hdGFuMihiLnkgLSBhLnksIGIueCAtIGEueCkgKiAxODApIC8gTWF0aC5QSSArIDkwICsgMzYwKSAlIDM2MDtcblxuY29uc3QgYXNSYXRpb1RvUGF0aExlbmd0aCA9ICh7IHZhbHVlLCBpc0luUGl4ZWxzIH0sIHRvdGFsUGF0aExlbmd0aCkgPT5cbiAgaXNJblBpeGVscyA/IHZhbHVlIC8gdG90YWxQYXRoTGVuZ3RoIDogdmFsdWU7XG5cbmZ1bmN0aW9uIHBhcnNlUmVsYXRpdmVPckFic29sdXRlVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuaW5kZXhPZignJScpICE9PSAtMSkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogcGFyc2VGbG9hdCh2YWx1ZSkgLyAxMDAsXG4gICAgICBpc0luUGl4ZWxzOiBmYWxzZSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBhcnNlZFZhbHVlID0gdmFsdWUgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IDA7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHBhcnNlZFZhbHVlLFxuICAgIGlzSW5QaXhlbHM6IHBhcnNlZFZhbHVlID4gMCxcbiAgfTtcbn1cblxuY29uc3QgcG9pbnRzRXF1YWwgPSAoYSwgYikgPT4gYS54ID09PSBiLnggJiYgYS55ID09PSBiLnk7XG5cbmZ1bmN0aW9uIHBvaW50c1RvU2VnbWVudHMocHRzKSB7XG4gIHJldHVybiBwdHMucmVkdWNlKChzZWdtZW50cywgYiwgaWR4LCBwb2ludHMpID0+IHtcbiAgICAvLyB0aGlzIHRlc3Qgc2tpcHMgc2FtZSBhZGphY2VudCBwb2ludHNcbiAgICBpZiAoaWR4ID4gMCAmJiAhcG9pbnRzRXF1YWwoYiwgcG9pbnRzW2lkeCAtIDFdKSkge1xuICAgICAgY29uc3QgYSA9IHBvaW50c1tpZHggLSAxXTtcbiAgICAgIGNvbnN0IGRpc3RBID1cbiAgICAgICAgc2VnbWVudHMubGVuZ3RoID4gMCA/IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdLmRpc3RCIDogMDtcbiAgICAgIGNvbnN0IGRpc3RBQiA9IHBvaW50RGlzdGFuY2UoYSwgYik7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgYSxcbiAgICAgICAgYixcbiAgICAgICAgZGlzdEEsXG4gICAgICAgIGRpc3RCOiBkaXN0QSArIGRpc3RBQixcbiAgICAgICAgaGVhZGluZzogY29tcHV0ZVNlZ21lbnRIZWFkaW5nKGEsIGIpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZWdtZW50cztcbiAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UGF0dGVybk9uUG9pbnRQYXRoKHB0cywgcGF0dGVybikge1xuICAvLyAxLiBzcGxpdCB0aGUgcGF0aCBpbnRvIHNlZ21lbnQgaW5mb3NcbiAgY29uc3Qgc2VnbWVudHMgPSBwb2ludHNUb1NlZ21lbnRzKHB0cyk7XG4gIGNvbnN0IG5iU2VnbWVudHMgPSBzZWdtZW50cy5sZW5ndGg7XG4gIGlmIChuYlNlZ21lbnRzID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdG90YWxQYXRoTGVuZ3RoID0gc2VnbWVudHNbbmJTZWdtZW50cyAtIDFdLmRpc3RCO1xuXG4gIGNvbnN0IG9mZnNldCA9IGFzUmF0aW9Ub1BhdGhMZW5ndGgocGF0dGVybi5vZmZzZXQsIHRvdGFsUGF0aExlbmd0aCk7XG4gIGNvbnN0IGVuZE9mZnNldCA9IGFzUmF0aW9Ub1BhdGhMZW5ndGgocGF0dGVybi5lbmRPZmZzZXQsIHRvdGFsUGF0aExlbmd0aCk7XG4gIGNvbnN0IHJlcGVhdCA9IGFzUmF0aW9Ub1BhdGhMZW5ndGgocGF0dGVybi5yZXBlYXQsIHRvdGFsUGF0aExlbmd0aCk7XG5cbiAgY29uc3QgcmVwZWF0SW50ZXJ2YWxQaXhlbHMgPSB0b3RhbFBhdGhMZW5ndGggKiByZXBlYXQ7XG4gIGNvbnN0IHN0YXJ0T2Zmc2V0UGl4ZWxzID0gb2Zmc2V0ID4gMCA/IHRvdGFsUGF0aExlbmd0aCAqIG9mZnNldCA6IDA7XG4gIGNvbnN0IGVuZE9mZnNldFBpeGVscyA9IGVuZE9mZnNldCA+IDAgPyB0b3RhbFBhdGhMZW5ndGggKiBlbmRPZmZzZXQgOiAwO1xuXG4gIC8vIDIuIGdlbmVyYXRlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHBhdHRlcm4gYXMgb2Zmc2V0cyBmcm9tIHRoZSBwYXRoIHN0YXJ0XG4gIGNvbnN0IHBvc2l0aW9uT2Zmc2V0cyA9IFtdO1xuICBsZXQgcG9zaXRpb25PZmZzZXQgPSBzdGFydE9mZnNldFBpeGVscztcbiAgZG8ge1xuICAgIHBvc2l0aW9uT2Zmc2V0cy5wdXNoKHBvc2l0aW9uT2Zmc2V0KTtcbiAgICBwb3NpdGlvbk9mZnNldCArPSByZXBlYXRJbnRlcnZhbFBpeGVscztcbiAgfSB3aGlsZSAoXG4gICAgcmVwZWF0SW50ZXJ2YWxQaXhlbHMgPiAwICYmXG4gICAgcG9zaXRpb25PZmZzZXQgPCB0b3RhbFBhdGhMZW5ndGggLSBlbmRPZmZzZXRQaXhlbHNcbiAgKTtcblxuICAvLyAzLiBwcm9qZWN0cyBvZmZzZXRzIHRvIHNlZ21lbnRzXG4gIGxldCBzZWdtZW50SW5kZXggPSAwO1xuICBsZXQgc2VnbWVudCA9IHNlZ21lbnRzWzBdO1xuICByZXR1cm4gcG9zaXRpb25PZmZzZXRzLm1hcCgocG9zaXRpb25PZmZzZXQpID0+IHtcbiAgICAvLyBmaW5kIHRoZSBzZWdtZW50IG1hdGNoaW5nIHRoZSBvZmZzZXQsXG4gICAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgcHJldmlvdXMgb25lIGFzIG9mZnNldHMgYXJlIG9yZGVyZWRcbiAgICB3aGlsZSAocG9zaXRpb25PZmZzZXQgPiBzZWdtZW50LmRpc3RCICYmIHNlZ21lbnRJbmRleCA8IG5iU2VnbWVudHMgLSAxKSB7XG4gICAgICBzZWdtZW50SW5kZXgrKztcbiAgICAgIHNlZ21lbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZ21lbnRSYXRpbyA9XG4gICAgICAocG9zaXRpb25PZmZzZXQgLSBzZWdtZW50LmRpc3RBKSAvIChzZWdtZW50LmRpc3RCIC0gc2VnbWVudC5kaXN0QSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB0OiBpbnRlcnBvbGF0ZUJldHdlZW5Qb2ludHMoc2VnbWVudC5hLCBzZWdtZW50LmIsIHNlZ21lbnRSYXRpbyksXG4gICAgICBoZWFkaW5nOiBzZWdtZW50LmhlYWRpbmcsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHBvaW50IHdoaWNoIGxpZXMgb24gdGhlIHNlZ21lbnQgZGVmaW5lZCBieSBwb2ludHMgQSBhbmQgQixcbiAqIGF0IHRoZSBnaXZlbiByYXRpbyBvZiB0aGUgZGlzdGFuY2UgZnJvbSBBIHRvIEIsIGJ5IGxpbmVhciBpbnRlcnBvbGF0aW9uLlxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUJldHdlZW5Qb2ludHMocHRBLCBwdEIsIHJhdGlvKSB7XG4gIGlmIChwdEIueCAhPT0gcHRBLngpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcHRBLnggKyByYXRpbyAqIChwdEIueCAtIHB0QS54KSxcbiAgICAgIHk6IHB0QS55ICsgcmF0aW8gKiAocHRCLnkgLSBwdEEueSksXG4gICAgfTtcbiAgfVxuICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgcG9pbnRzIGxpZSBvbiB0aGUgc2FtZSB2ZXJ0aWNhbCBheGlzXG4gIHJldHVybiB7XG4gICAgeDogcHRBLngsXG4gICAgeTogcHRBLnkgKyAocHRCLnkgLSBwdEEueSkgKiByYXRpbyxcbiAgfTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvamVjdFBhdHRlcm5PblBvaW50UGF0aCxcbiAgcGFyc2VSZWxhdGl2ZU9yQWJzb2x1dGVWYWx1ZSxcbiAgLy8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcmUgZXhwb3J0ZWQgb25seSBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VcbiAgY29tcHV0ZVNlZ21lbnRIZWFkaW5nLFxuICBhc1JhdGlvVG9QYXRoTGVuZ3RoLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUFBLE9BQUE7QUFEQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUMsZ0JBQUMsQ0FBQ0MsTUFBTSxHQUFHRCxnQkFBQyxDQUFDQyxNQUFNLElBQUksQ0FBQyxDQUFDOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBRCxnQkFBQyxDQUFDQyxNQUFNLENBQUNDLElBQUksR0FBR0YsZ0JBQUMsQ0FBQ0csS0FBSyxDQUFDQyxNQUFNLENBQUM7RUFDN0JDLE9BQU8sRUFBRTtJQUNQQyxTQUFTLEVBQUUsRUFBRTtJQUNiQyxXQUFXLEVBQUUsQ0FBQztFQUNoQixDQUFDO0VBRURDLFVBQVUsRUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kando-env/kando-ui",
3
- "version": "1.2.251",
3
+ "version": "1.2.253",
4
4
  "main": "lib/index.js",
5
5
  "author": "Nadav(Private) <nadavk72@gmail.com>",
6
6
  "scripts": {
@@ -33,9 +33,11 @@
33
33
  "@fortawesome/fontawesome-svg-core": "^1.2.30",
34
34
  "@fortawesome/free-solid-svg-icons": "^5.14.0",
35
35
  "@fortawesome/react-fontawesome": "^0.1.11",
36
+ "@kando-env/kando-ui": "1.2.228-alpha.78",
36
37
  "@kenshooui/react-multi-select": "^1.1.6",
37
38
  "@reduxjs/toolkit": "^1.6.1",
38
39
  "@svgr/webpack": "^5.5.0",
40
+ "@types/leaflet-polylinedecorator": "^1.6.2",
39
41
  "actioncable": "^5.2.6",
40
42
  "array-to-tree": "^3.3.2",
41
43
  "axios": "^0.21.1",
@@ -52,15 +54,18 @@
52
54
  "i18next-http-backend": "^1.4.0",
53
55
  "immer": "^8.0.1",
54
56
  "jquery": "^3.5.1",
55
- "leaflet": "^1.6.0",
57
+ "leaflet": "^1.9.4",
56
58
  "leaflet-geometryutil": "^0.9.3",
57
59
  "leaflet-polylinedecorator": "^1.6.0",
60
+ "leaflet.featuregroup.subgroup": "^1.0.2",
61
+ "leaflet.markercluster": "^1.5.3",
58
62
  "lodash": "^4.17.20",
59
63
  "moment": "^2.27.0",
60
64
  "moment-timezone": "^0.5.33",
61
65
  "msw": "^0.33.3",
62
66
  "password-validator": "^5.3.0",
63
67
  "pev2": "^0.23.0",
68
+ "polished": "^4.0.5",
64
69
  "prop-types": "^15.7.2",
65
70
  "react": "^16.13.0",
66
71
  "react-beautiful-dnd": "^13.1.0",
@@ -92,8 +97,7 @@
92
97
  "styled-components": "^5.3.0",
93
98
  "uuid": "^8.3.2",
94
99
  "xml2js": "^0.4.23",
95
- "yup": "^0.32.11",
96
- "polished": "^4.0.5"
100
+ "yup": "^0.32.11"
97
101
  },
98
102
  "browserslist": {
99
103
  "production": [
@@ -125,6 +129,7 @@
125
129
  "@types/jest": "^24.9.1",
126
130
  "@types/jquery": "^3.5.5",
127
131
  "@types/leaflet": "^1.7.3",
132
+ "@types/leaflet.markercluster": "^1.5.2",
128
133
  "@types/lodash": "^4.14.168",
129
134
  "@types/moment-timezone": "^0.5.30",
130
135
  "@types/node": "^12.12.30",