@carto/kepler.gl 0.0.88 → 0.0.89

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 (53) hide show
  1. package/dist/components/common/animation-control/playback-controls.js +11 -21
  2. package/dist/components/common/info-helper.js +3 -5
  3. package/dist/components/common/styled-components.d.ts +3 -2
  4. package/dist/components/common/styled-components.js +13 -14
  5. package/dist/components/editor/editor.js +2 -2
  6. package/dist/components/editor/feature-styles.js +2 -2
  7. package/dist/components/editor/handle-style.js +2 -2
  8. package/dist/components/map/layer-selector-panel.js +2 -3
  9. package/dist/components/map/map-control-tooltip.js +2 -3
  10. package/dist/components/side-panel/common/dataset-tag.js +4 -7
  11. package/dist/components/side-panel/common/dataset-title.js +5 -9
  12. package/dist/components/side-panel/layer-panel/color-range-selector.js +3 -7
  13. package/dist/components/side-panel/layer-panel/layer-config-group.js +2 -4
  14. package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +2 -4
  15. package/dist/components/side-panel/panel-header-action.d.ts +2 -2
  16. package/dist/components/side-panel/panel-header-action.js +3 -5
  17. package/dist/components/side-panel/panel-header.js +3 -5
  18. package/dist/components/side-panel/panel-tab.js +2 -4
  19. package/dist/constants/default-settings.js +3 -3
  20. package/dist/vendor/react-map-gl-draw/constants.js +55 -0
  21. package/dist/vendor/react-map-gl-draw/editor.js +1122 -0
  22. package/dist/vendor/react-map-gl-draw/feature.js +191 -0
  23. package/dist/vendor/react-map-gl-draw/index.js +33 -0
  24. package/dist/vendor/react-map-gl-draw/style.js +93 -0
  25. package/dist/vendor/react-map-gl-draw/utils.js +51 -0
  26. package/package.json +5 -4
  27. package/src/components/common/animation-control/playback-controls.tsx +11 -16
  28. package/src/components/common/info-helper.tsx +2 -3
  29. package/src/components/common/styled-components.tsx +17 -31
  30. package/src/components/editor/editor.tsx +1 -1
  31. package/src/components/editor/feature-styles.ts +1 -1
  32. package/src/components/editor/handle-style.ts +1 -1
  33. package/src/components/map/layer-selector-panel.tsx +1 -2
  34. package/src/components/map/map-control-tooltip.tsx +1 -1
  35. package/src/components/side-panel/common/dataset-tag.tsx +3 -5
  36. package/src/components/side-panel/common/dataset-title.tsx +4 -8
  37. package/src/components/side-panel/layer-panel/color-range-selector.tsx +4 -6
  38. package/src/components/side-panel/layer-panel/layer-config-group.tsx +2 -2
  39. package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +2 -3
  40. package/src/components/side-panel/panel-header-action.tsx +4 -5
  41. package/src/components/side-panel/panel-header.tsx +2 -2
  42. package/src/components/side-panel/panel-tab.tsx +2 -2
  43. package/src/constants/default-settings.ts +1 -1
  44. package/src/vendor/react-map-gl-draw/LICENSE +9 -0
  45. package/src/vendor/react-map-gl-draw/constants.js +70 -0
  46. package/src/vendor/react-map-gl-draw/editor.js +1207 -0
  47. package/src/vendor/react-map-gl-draw/feature.js +171 -0
  48. package/src/vendor/react-map-gl-draw/index.js +7 -0
  49. package/src/vendor/react-map-gl-draw/style.js +153 -0
  50. package/src/vendor/react-map-gl-draw/utils.js +55 -0
  51. package/CHANGELOG.md +0 -1015
  52. package/src/.DS_Store +0 -0
  53. package/src/reducers/trips-to-geojson.mjs +0 -8
@@ -0,0 +1,1122 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+ var _react = _interopRequireWildcard(require("react"));
18
+ var _reactMapGl = require("react-map-gl");
19
+ var _uuid = require("uuid");
20
+ var _feature2 = _interopRequireDefault(require("./feature"));
21
+ var _style = require("./style");
22
+ var _constants = require("./constants");
23
+ var _utils = require("./utils");
24
+ var _excluded = ["radius"];
25
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
26
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
27
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
28
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
29
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
30
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // Vendored from react-map-gl-draw@0.14.8 (MIT, Copyright (c) 2018 Uber Technologies, Inc.), see ./LICENSE
31
+ /* eslint-disable complexity, max-statements */
32
+ var defaultProps = {
33
+ mode: _constants.MODES.READ_ONLY,
34
+ clickRadius: 0,
35
+ getEditHandleStyle: _style.getEditHandleStyle,
36
+ getFeatureStyle: _style.getFeatureStyle,
37
+ getFeatureShape: 'circle',
38
+ getEditHandleShape: 'circle',
39
+ onSelect: function onSelect() {}
40
+ };
41
+ var UNCOMMITTED_ID = 'uncommitted';
42
+ var Editor = exports["default"] = /*#__PURE__*/function (_PureComponent) {
43
+ function Editor(props) {
44
+ var _this;
45
+ (0, _classCallCheck2["default"])(this, Editor);
46
+ _this = _callSuper(this, Editor, [props]);
47
+ (0, _defineProperty2["default"])(_this, "_containerRef", void 0);
48
+ (0, _defineProperty2["default"])(_this, "_events", void 0);
49
+ (0, _defineProperty2["default"])(_this, "_context", void 0);
50
+ /* FEATURE OPERATIONS */
51
+ (0, _defineProperty2["default"])(_this, "_update", function (features) {
52
+ if (features) {
53
+ _this.props.onUpdate(features.map(function (f) {
54
+ return f.toFeature();
55
+ }));
56
+ }
57
+ });
58
+ (0, _defineProperty2["default"])(_this, "_updateRectangle", function (feature, options) {
59
+ var vertexIndex = options.vertexIndex,
60
+ lngLat = options.lngLat;
61
+ /*
62
+ * p0.x, p0.y ---------- diagonal.x, p0.y
63
+ * | |
64
+ * | |
65
+ * p0.x, diagonal.y ----- diagonal.x, diagonal.y
66
+ */
67
+ var diagonal = vertexIndex;
68
+ var p0 = feature.points[(diagonal + 2) % 4];
69
+ feature.replacePoint(diagonal, [lngLat[0], lngLat[1]]);
70
+ feature.replacePoint((diagonal + 1) % 4, [lngLat[0], p0[1]]);
71
+ feature.replacePoint((diagonal + 3) % 4, [p0[0], lngLat[1]]);
72
+ _this._update(_this.state.features);
73
+ });
74
+ (0, _defineProperty2["default"])(_this, "_updateFeature", function (feature, mode, options) {
75
+ switch (mode) {
76
+ case 'vertex':
77
+ if (feature.renderType === _constants.RENDER_TYPE.RECTANGLE) {
78
+ _this._updateRectangle(feature, options);
79
+ } else {
80
+ feature.replacePoint(options.vertexIndex, [options.lngLat[0], options.lngLat[1]]);
81
+ _this._update(_this.state.features);
82
+ }
83
+ break;
84
+ case 'feature':
85
+ var dx = options.dx,
86
+ dy = options.dy;
87
+ feature.points = feature.points.map(function (lngLat) {
88
+ var pixels = _this._project(lngLat);
89
+ if (pixels) {
90
+ pixels[0] += dx;
91
+ pixels[1] += dy;
92
+ return _this._unproject(pixels);
93
+ }
94
+ return null;
95
+ }).filter(Boolean);
96
+ _this._update(_this.state.features);
97
+ break;
98
+ case 'Rectangle':
99
+ _this._updateRectangle(feature, options);
100
+ break;
101
+ default:
102
+ }
103
+ });
104
+ (0, _defineProperty2["default"])(_this, "_addPoint", function (x, y, feature) {
105
+ var isNew = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
106
+ feature = feature || _this._getSelectedFeature();
107
+ if (!feature) {
108
+ return;
109
+ }
110
+ var lngLat = _this._unproject([x, y]);
111
+ if (!lngLat) {
112
+ return;
113
+ }
114
+ feature.addPoint([lngLat[0], lngLat[1]]);
115
+ var features = _this.state.features || [];
116
+ if (isNew) {
117
+ features.push(feature);
118
+ }
119
+ var validPath = feature.points && feature.points.length >= 2;
120
+ var _this$props = _this.props,
121
+ mode = _this$props.mode,
122
+ onSelect = _this$props.onSelect;
123
+ if (mode === _constants.MODES.DRAW_POINT || mode === _constants.MODES.DRAW_PATH && validPath) {
124
+ _this._update(features);
125
+ onSelect({
126
+ selectedFeatureId: feature && feature.id
127
+ });
128
+ } else {
129
+ _this.setState({
130
+ features: (0, _toConsumableArray2["default"])(features),
131
+ selectedFeatureId: feature && feature.id
132
+ });
133
+ }
134
+ });
135
+ (0, _defineProperty2["default"])(_this, "_clearCache", function () {
136
+ _this.setState({
137
+ selectedFeatureId: null,
138
+ uncommittedLngLat: null,
139
+ hoveredFeatureId: null,
140
+ hoveredLngLat: null,
141
+ hoveredVertexIndex: -1,
142
+ draggingVertexIndex: -1,
143
+ startDragPos: null,
144
+ isDragging: false,
145
+ didDrag: false
146
+ });
147
+ });
148
+ (0, _defineProperty2["default"])(_this, "_closePath", function () {
149
+ var selectedFeature = _this._getSelectedFeature();
150
+ if (selectedFeature) {
151
+ selectedFeature.closePath();
152
+ _this._update(_this.state.features);
153
+ }
154
+ });
155
+ (0, _defineProperty2["default"])(_this, "_addFeature", function (mode, point) {
156
+ var type = _constants.MODE_TO_GEOJSON_TYPE[mode];
157
+ var renderType = _constants.MODE_TO_RENDER_TYPE[mode];
158
+ var feature = new _feature2["default"]({
159
+ id: (0, _uuid.v4)(),
160
+ type: type,
161
+ renderType: renderType
162
+ });
163
+ _this._addPoint(point.x, point.y, feature, true);
164
+ if (mode === _constants.MODES.DRAW_RECTANGLE) {
165
+ for (var i = 0; i < 3; i++) {
166
+ _this._addPoint(point.x, point.y, feature, false);
167
+ }
168
+ }
169
+ });
170
+ (0, _defineProperty2["default"])(_this, "_onEvent", function (handler, evt, stopPropagation) {
171
+ var mode = _this.props.mode;
172
+ if (mode === _constants.MODES.READ_ONLY) {
173
+ return;
174
+ }
175
+ for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
176
+ args[_key - 3] = arguments[_key];
177
+ }
178
+ handler.apply(void 0, [evt].concat(args));
179
+ if (stopPropagation) {
180
+ evt.stopImmediatePropagation();
181
+ }
182
+ });
183
+ (0, _defineProperty2["default"])(_this, "_onMouseUp", function (evt) {
184
+ _this.setState({
185
+ isDragging: false,
186
+ didDrag: false
187
+ });
188
+ var draggingVertexIndex = _this.state.draggingVertexIndex;
189
+ if (Number(draggingVertexIndex) >= 0) {
190
+ _this.setState({
191
+ draggingVertexIndex: -1
192
+ });
193
+ }
194
+ });
195
+ (0, _defineProperty2["default"])(_this, "_onMouseDown", function (evt) {
196
+ var _this$_getEventPositi = _this._getEventPosition(evt),
197
+ x = _this$_getEventPositi.x,
198
+ y = _this$_getEventPositi.y;
199
+ var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
200
+
201
+ // click segment
202
+ if (attributes && attributes.type === _constants.ELEMENT_TYPE.VERTEX) {
203
+ var vertexIndex = attributes.vertexIndex;
204
+ _this.setState({
205
+ draggingVertexIndex: vertexIndex,
206
+ startDragPos: {
207
+ x: x,
208
+ y: y
209
+ },
210
+ isDragging: true
211
+ });
212
+
213
+ // click selected feature
214
+ } else if (_this._matchesFeature(attributes, _this._getSelectedFeature())) {
215
+ _this.setState({
216
+ startDragPos: {
217
+ x: x,
218
+ y: y
219
+ },
220
+ isDragging: true
221
+ });
222
+ }
223
+ });
224
+ /* eslint-disable max-depth */
225
+ (0, _defineProperty2["default"])(_this, "_onMouseMove", function (evt) {
226
+ var attributes = (0, _utils.parseElemDataAttributes)(evt.target) || {};
227
+ var vertexIndex = attributes.vertexIndex,
228
+ featureIndex = attributes.featureIndex,
229
+ type = attributes.type;
230
+ var _this$state = _this.state,
231
+ startDragPos = _this$state.startDragPos,
232
+ isDragging = _this$state.isDragging,
233
+ didDrag = _this$state.didDrag;
234
+ var mode = _this.props.mode;
235
+ var _this$_getEventPositi2 = _this._getEventPosition(evt),
236
+ x = _this$_getEventPositi2.x,
237
+ y = _this$_getEventPositi2.y;
238
+ var lngLat = _this._unproject([x, y]);
239
+ if (isDragging && !didDrag && startDragPos) {
240
+ var dx = x - startDragPos.x;
241
+ var dy = y - startDragPos.y;
242
+ if (dx * dx + dy * dy > 5) {
243
+ _this.setState({
244
+ didDrag: true
245
+ });
246
+ }
247
+ }
248
+ var selectedFeature = _this._getSelectedFeature();
249
+ var isDrawing = _constants.DRAWING_MODES.indexOf(mode) !== -1;
250
+ var isEditing = mode === _constants.MODES.EDIT_VERTEX;
251
+ if (selectedFeature) {
252
+ // dragging
253
+ if (didDrag && startDragPos) {
254
+ var draggingVertexIndex = Number(_this.state.draggingVertexIndex);
255
+ if (draggingVertexIndex >= 0) {
256
+ // dragging vertex
257
+ _this._updateFeature(selectedFeature, 'vertex', {
258
+ vertexIndex: draggingVertexIndex,
259
+ lngLat: lngLat
260
+ });
261
+ } else {
262
+ // dragging feature
263
+ var _dx = x - startDragPos.x;
264
+ var _dy = y - startDragPos.y;
265
+ _this.setState({
266
+ startDragPos: {
267
+ x: x,
268
+ y: y
269
+ }
270
+ });
271
+ _this._updateFeature(selectedFeature, 'feature', {
272
+ dx: _dx,
273
+ dy: _dy
274
+ });
275
+ }
276
+ } else if (mode === _constants.MODES.DRAW_RECTANGLE) {
277
+ // drawing rectangle
278
+ _this._updateFeature(selectedFeature, 'Rectangle', {
279
+ vertexIndex: 2,
280
+ lngLat: lngLat
281
+ });
282
+ } else if (isDrawing) {
283
+ // drawing other shapes
284
+ _this.setState({
285
+ uncommittedLngLat: lngLat
286
+ });
287
+ } else if (isEditing) {
288
+ if ((selectedFeature.renderType === _constants.RENDER_TYPE.LINE_STRING || selectedFeature.renderType === _constants.RENDER_TYPE.POLYGON) && type === _constants.ELEMENT_TYPE.SEGMENT) {
289
+ // segmentId is start vertexIndex
290
+ var uncommittedLngLat = null;
291
+ if (lngLat && typeof vertexIndex === 'number') {
292
+ uncommittedLngLat = _this._getClosestPositionOnSegment(vertexIndex, lngLat, selectedFeature);
293
+ }
294
+ _this.setState({
295
+ uncommittedLngLat: uncommittedLngLat
296
+ });
297
+ } else {
298
+ _this.setState({
299
+ uncommittedLngLat: null
300
+ });
301
+ }
302
+ }
303
+ }
304
+ var _this$state2 = _this.state,
305
+ features = _this$state2.features,
306
+ selectedFeatureId = _this$state2.selectedFeatureId;
307
+ if (selectedFeatureId && type === _constants.ELEMENT_TYPE.VERTEX && typeof featureIndex === 'number') {
308
+ var feature = features && features[featureIndex];
309
+ if (selectedFeatureId === (feature && feature.id)) {
310
+ _this.setState({
311
+ hoveredVertexIndex: vertexIndex
312
+ });
313
+ }
314
+ } else if (type !== _constants.ELEMENT_TYPE.VERTEX) {
315
+ _this.setState({
316
+ hoveredVertexIndex: null
317
+ });
318
+ }
319
+ if (type === _constants.ELEMENT_TYPE.FEATURE && typeof featureIndex === 'number') {
320
+ var _feature = features && features[featureIndex];
321
+ _this.setState({
322
+ hoveredFeatureId: _feature && _feature.id
323
+ });
324
+ } else {
325
+ _this.setState({
326
+ hoveredFeatureId: null
327
+ });
328
+ }
329
+ });
330
+ /* eslint-enable max-depth */
331
+ (0, _defineProperty2["default"])(_this, "_onClickFeature", function (evt, attributes) {
332
+ var featureIndex = attributes.featureIndex;
333
+ var features = _this.state.features;
334
+ var selectedFeature = features && typeof featureIndex === 'number' && features[featureIndex];
335
+ if (selectedFeature) {
336
+ _this.props.onSelect({
337
+ selectedFeatureId: selectedFeature.id,
338
+ sourceEvent: evt
339
+ });
340
+ }
341
+ });
342
+ (0, _defineProperty2["default"])(_this, "_onClickVertex", function (evt, attributes) {
343
+ var mode = _this.props.mode;
344
+ var operation = attributes.operation;
345
+ if (operation === _constants.OPERATIONS.INTERSECT || operation === _constants.OPERATIONS.SET && mode === _constants.MODES.DRAW_RECTANGLE) {
346
+ _this._closePath();
347
+ _this._clearCache();
348
+ }
349
+ });
350
+ (0, _defineProperty2["default"])(_this, "_onClickSegment", function (evt, attributes) {
351
+ var feature = _this._getSelectedFeature();
352
+ if (feature && (feature.renderType === _constants.RENDER_TYPE.POLYGON || feature.renderType === _constants.RENDER_TYPE.LINE_STRING) && attributes) {
353
+ var vertexIndex = attributes.vertexIndex;
354
+ var uncommittedLngLat = _this.state.uncommittedLngLat;
355
+ var lngLat = uncommittedLngLat;
356
+ if (!lngLat && typeof vertexIndex === 'number') {
357
+ var _this$_getEventPositi3 = _this._getEventPosition(evt),
358
+ x = _this$_getEventPositi3.x,
359
+ y = _this$_getEventPositi3.y;
360
+ lngLat = _this._unproject([x, y]);
361
+ lngLat = _this._getClosestPositionOnSegment(vertexIndex, lngLat, feature);
362
+ }
363
+ if (lngLat) {
364
+ var insertPosition = (vertexIndex + 1) % feature.points.length;
365
+ feature.insertPoint(lngLat, insertPosition);
366
+ _this._update(_this.state.features);
367
+ }
368
+ _this.setState({
369
+ uncommittedLngLat: null,
370
+ hoveredLngLat: null
371
+ });
372
+ }
373
+ });
374
+ (0, _defineProperty2["default"])(_this, "_onClick", function (evt) {
375
+ var mode = _this.props.mode;
376
+ var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
377
+ if (attributes && attributes.type === _constants.ELEMENT_TYPE.VERTEX) {
378
+ _this._onClickVertex(evt, attributes);
379
+ return;
380
+ }
381
+ if (mode === _constants.MODES.EDIT_VERTEX && attributes && attributes.type === _constants.ELEMENT_TYPE.SEGMENT) {
382
+ _this._onClickSegment(evt, attributes);
383
+ return;
384
+ }
385
+ if ((mode === _constants.MODES.SELECT_FEATURE || mode === _constants.MODES.EDIT_VERTEX) && attributes && attributes.type === _constants.ELEMENT_TYPE.FEATURE) {
386
+ _this._onClickFeature(evt, attributes);
387
+ return;
388
+ }
389
+ var selectedFeature = _this._getSelectedFeature();
390
+ var _this$_getEventPositi4 = _this._getEventPosition(evt),
391
+ x = _this$_getEventPositi4.x,
392
+ y = _this$_getEventPositi4.y;
393
+ switch (mode) {
394
+ case _constants.MODES.EDIT_VERTEX:
395
+ if (selectedFeature) {
396
+ _this.props.onSelect({
397
+ selectedFeatureId: null,
398
+ sourceEvent: evt
399
+ });
400
+ }
401
+ break;
402
+ case _constants.MODES.DRAW_POINT:
403
+ _this._addFeature(mode, {
404
+ x: x,
405
+ y: y
406
+ });
407
+ break;
408
+ case _constants.MODES.DRAW_PATH:
409
+ case _constants.MODES.DRAW_POLYGON:
410
+ if (selectedFeature && selectedFeature.isClosed) {
411
+ // clicked outside
412
+ _this._clearCache();
413
+ } else if (selectedFeature) {
414
+ _this._addPoint(x, y, selectedFeature);
415
+ } else {
416
+ _this._addFeature(mode, {
417
+ x: x,
418
+ y: y
419
+ });
420
+ }
421
+ break;
422
+ case _constants.MODES.DRAW_RECTANGLE:
423
+ if (selectedFeature && selectedFeature.isClosed) {
424
+ // clicked outside
425
+ _this._clearCache();
426
+ _this.props.onSelect({
427
+ selectedFeatureId: null,
428
+ sourceEvent: evt
429
+ });
430
+ } else {
431
+ _this._addFeature(mode, {
432
+ x: x,
433
+ y: y
434
+ });
435
+ }
436
+ break;
437
+ default:
438
+ }
439
+ });
440
+ // don't forward pan events to the underlying map when:
441
+ // - the pan target is a vertex/line/the currently selected feature
442
+ // - the user is dragging something around
443
+ // - there is currently an uncommitted position
444
+ // (i.e. the user is creating a feature/vertex/line)
445
+ (0, _defineProperty2["default"])(_this, "_onPan", function (evt) {
446
+ var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
447
+ var type = attributes && attributes.type;
448
+ if (type === _constants.ELEMENT_TYPE.VERTEX || type === _constants.ELEMENT_TYPE.SEGMENT || _this.state.isDragging || _this.state.uncommittedLngLat !== null) {
449
+ evt.stopImmediatePropagation();
450
+ }
451
+ });
452
+ /* HELPERS */
453
+ // lngLat to pixels
454
+ (0, _defineProperty2["default"])(_this, "_project", function (pt) {
455
+ return _this._context && _this._context.viewport && _this._context.viewport.project(pt);
456
+ });
457
+ // pixels to lngLat
458
+ (0, _defineProperty2["default"])(_this, "_unproject", function (pt) {
459
+ return _this._context && _this._context.viewport && _this._context.viewport.unproject(pt);
460
+ });
461
+ (0, _defineProperty2["default"])(_this, "_matchesFeature", function (attributes, feature) {
462
+ if (!attributes || attributes.type !== _constants.ELEMENT_TYPE.FEATURE || !feature) {
463
+ return false;
464
+ }
465
+ var featureIndex = attributes.featureIndex;
466
+ var features = _this.props.features;
467
+ var elemFeature = features && features[featureIndex];
468
+ return elemFeature && feature.id === elemFeature.id;
469
+ });
470
+ (0, _defineProperty2["default"])(_this, "_getClosestPositionOnSegment", function (vertexIndex, pointLngLat, feature) {
471
+ var points = feature && feature.points;
472
+ if (!points || !points.length) {
473
+ return null;
474
+ }
475
+
476
+ // segmentId is start vertexIndex
477
+ var startPos = points[vertexIndex];
478
+ var endPos = points[(vertexIndex + 1) % points.length];
479
+ return (0, _utils.findClosestPointOnLineSegment)(startPos, endPos, pointLngLat);
480
+ });
481
+ (0, _defineProperty2["default"])(_this, "_getEventPosition", function (evt) {
482
+ var _evt$offsetCenter = evt.offsetCenter,
483
+ x = _evt$offsetCenter.x,
484
+ y = _evt$offsetCenter.y;
485
+ return {
486
+ x: Number(x),
487
+ y: Number(y)
488
+ };
489
+ });
490
+ (0, _defineProperty2["default"])(_this, "_getSelectedFeature", function () {
491
+ var _this$state3 = _this.state,
492
+ features = _this$state3.features,
493
+ selectedFeatureId = _this$state3.selectedFeatureId;
494
+ return features && features.find(function (f) {
495
+ return f.id === selectedFeatureId;
496
+ });
497
+ });
498
+ (0, _defineProperty2["default"])(_this, "_getEditHandleState", function (index, renderState) {
499
+ var mode = _this.props.mode;
500
+ var _this$state4 = _this.state,
501
+ draggingVertexIndex = _this$state4.draggingVertexIndex,
502
+ hoveredVertexIndex = _this$state4.hoveredVertexIndex;
503
+ var selectedFeature = _this._getSelectedFeature();
504
+ var isSelected = index === draggingVertexIndex || selectedFeature && selectedFeature.renderType === _constants.RENDER_TYPE.POINT;
505
+ var isClosing = mode === _constants.MODES.DRAW_POLYGON && hoveredVertexIndex === 0 && index === -1;
506
+ if (renderState) {
507
+ return renderState;
508
+ }
509
+ if (isClosing) {
510
+ return _constants.RENDER_STATE.CLOSING;
511
+ }
512
+ if (isSelected) {
513
+ return _constants.RENDER_STATE.SELECTED;
514
+ }
515
+ switch (index) {
516
+ case hoveredVertexIndex:
517
+ return _constants.RENDER_STATE.HOVERED;
518
+ case UNCOMMITTED_ID:
519
+ return _constants.RENDER_STATE.UNCOMMITTED;
520
+ default:
521
+ return _constants.RENDER_STATE.INACTIVE;
522
+ }
523
+ });
524
+ (0, _defineProperty2["default"])(_this, "_getFeatureRenderState", function (id, renderState) {
525
+ var _this$state5 = _this.state,
526
+ selectedFeatureId = _this$state5.selectedFeatureId,
527
+ hoveredFeatureId = _this$state5.hoveredFeatureId;
528
+ if (renderState) {
529
+ return renderState;
530
+ }
531
+ switch (id) {
532
+ case selectedFeatureId:
533
+ return _constants.RENDER_STATE.SELECTED;
534
+ case hoveredFeatureId:
535
+ return _constants.RENDER_STATE.HOVERED;
536
+ case UNCOMMITTED_ID:
537
+ return _constants.RENDER_STATE.UNCOMMITTED;
538
+ default:
539
+ return _constants.RENDER_STATE.INACTIVE;
540
+ }
541
+ });
542
+ /* RENDER */
543
+ /* eslint-disable max-params */
544
+ (0, _defineProperty2["default"])(_this, "_renderVertex", function (position, featureIndex, vertexIndex, operation, style, shape) {
545
+ /* eslint-enable max-params */
546
+ var p = _this._project(position);
547
+ if (!p) {
548
+ return null;
549
+ }
550
+ var clickRadius = _this.props.clickRadius;
551
+ var elemKey = "".concat(_constants.ELEMENT_TYPE.VERTEX, ".").concat(featureIndex, ".").concat(vertexIndex, ".").concat(operation);
552
+ // first <circle|rect> is to make path easily interacted with
553
+ switch (shape) {
554
+ case 'circle':
555
+ return /*#__PURE__*/_react["default"].createElement("g", {
556
+ key: elemKey,
557
+ transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
558
+ }, /*#__PURE__*/_react["default"].createElement("circle", {
559
+ "data-type": _constants.ELEMENT_TYPE.VERTEX,
560
+ "data-feature-index": featureIndex,
561
+ "data-vertex-index": vertexIndex,
562
+ "data-operation": operation,
563
+ key: "".concat(elemKey, ".hidden"),
564
+ style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
565
+ stroke: 'none'
566
+ }),
567
+ cx: 0,
568
+ cy: 0,
569
+ r: clickRadius
570
+ }), /*#__PURE__*/_react["default"].createElement("circle", {
571
+ "data-type": _constants.ELEMENT_TYPE.VERTEX,
572
+ "data-feature-index": featureIndex,
573
+ "data-vertex-index": vertexIndex,
574
+ "data-operation": operation,
575
+ key: elemKey,
576
+ style: style,
577
+ cx: 0,
578
+ cy: 0
579
+ }));
580
+ case 'rect':
581
+ return /*#__PURE__*/_react["default"].createElement("g", {
582
+ key: "vertex.".concat(vertexIndex),
583
+ transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
584
+ }, /*#__PURE__*/_react["default"].createElement("rect", {
585
+ "data-type": _constants.ELEMENT_TYPE.VERTEX,
586
+ "data-feature-index": featureIndex,
587
+ "data-vertex-index": vertexIndex,
588
+ "data-operation": operation,
589
+ key: "".concat(elemKey, ".hidden"),
590
+ style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
591
+ width: clickRadius,
592
+ height: clickRadius
593
+ })
594
+ }), /*#__PURE__*/_react["default"].createElement("rect", {
595
+ "data-type": _constants.ELEMENT_TYPE.VERTEX,
596
+ "data-feature-index": featureIndex,
597
+ "data-vertex-index": vertexIndex,
598
+ "data-operation": operation,
599
+ key: elemKey,
600
+ style: style
601
+ }));
602
+ default:
603
+ return null;
604
+ }
605
+ });
606
+ (0, _defineProperty2["default"])(_this, "_renderSegment", function (featureIndex, startVertexId, startPos, endPos) {
607
+ var style = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
608
+ var clickRadius = _this.props.clickRadius;
609
+ var projected = _this._getProjectedData([startPos, endPos], _constants.RENDER_TYPE.LINE_STRING);
610
+ var radius = style.radius,
611
+ others = (0, _objectWithoutProperties2["default"])(style, _excluded);
612
+ var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(startVertexId);
613
+ return /*#__PURE__*/_react["default"].createElement("g", {
614
+ key: elemKey
615
+ }, /*#__PURE__*/_react["default"].createElement("path", {
616
+ "data-type": _constants.ELEMENT_TYPE.SEGMENT,
617
+ "data-feature-index": featureIndex,
618
+ "data-vertex-index": startVertexId,
619
+ key: "".concat(elemKey, ".hidden"),
620
+ style: _objectSpread(_objectSpread({}, others), {}, {
621
+ strokeWidth: clickRadius || radius,
622
+ opacity: 0
623
+ }),
624
+ d: projected
625
+ }), /*#__PURE__*/_react["default"].createElement("path", {
626
+ "data-type": _constants.ELEMENT_TYPE.SEGMENT,
627
+ "data-feature-index": featureIndex,
628
+ "data-vertex-index": startVertexId,
629
+ key: elemKey,
630
+ style: others,
631
+ d: projected
632
+ }));
633
+ });
634
+ (0, _defineProperty2["default"])(_this, "_renderCommittedStroke", function (featureIndex, feature, style) {
635
+ var points = feature.points,
636
+ isClosed = feature.isClosed,
637
+ renderType = feature.renderType;
638
+ if (!points || points.length < 2 || renderType === _constants.RENDER_TYPE.RECTANGLE && !isClosed) {
639
+ return null;
640
+ }
641
+ var segments = [];
642
+ for (var i = 0; i < points.length - 1; i++) {
643
+ segments.push(_this._renderSegment(featureIndex, i, points[i], points[i + 1], style));
644
+ }
645
+ if (isClosed) {
646
+ var lastIndex = points.length - 1;
647
+ segments.push(_this._renderSegment(featureIndex, lastIndex, points[lastIndex], points[0], style));
648
+ }
649
+ return /*#__PURE__*/_react["default"].createElement("g", {
650
+ key: "committed group"
651
+ }, segments);
652
+ });
653
+ (0, _defineProperty2["default"])(_this, "_renderUncommittedStrokes", function (featureIndex, feature, style) {
654
+ var points = feature.points,
655
+ isClosed = feature.isClosed,
656
+ renderType = feature.renderType;
657
+ var mode = _this.props.mode;
658
+ var uncommittedLngLat = _this.state.uncommittedLngLat;
659
+ var isDrawing = _constants.DRAWING_MODES.find(function (m) {
660
+ return m === mode;
661
+ });
662
+ if (!points || isClosed || !isDrawing) {
663
+ return null;
664
+ }
665
+ var uncommittedSegments = [];
666
+ if (renderType === _constants.RENDER_TYPE.RECTANGLE) {
667
+ for (var i = 0; i < points.length - 1; i++) {
668
+ uncommittedSegments.push(_this._renderSegment(featureIndex, i, points[i], points[i + 1], style));
669
+ }
670
+ if (points.length === 4) {
671
+ uncommittedSegments.push(_this._renderSegment(featureIndex, 3, points[3], points[0], style));
672
+ }
673
+ }
674
+ if (!uncommittedLngLat) {
675
+ return uncommittedSegments.length ? uncommittedSegments : null;
676
+ }
677
+
678
+ /* eslint-disable no-inline-comments */
679
+ uncommittedSegments.push(_this._renderSegment(featureIndex, points.length - 1,
680
+ // id
681
+ points.slice(-1)[0],
682
+ // startPos
683
+ uncommittedLngLat,
684
+ // endPos
685
+ style));
686
+ /* eslint-enable no-inline-comments */
687
+
688
+ return uncommittedSegments.filter(Boolean);
689
+ });
690
+ (0, _defineProperty2["default"])(_this, "_renderClosingStroke", function (featureIndex, feature, style) {
691
+ var points = feature.points,
692
+ isClosed = feature.isClosed;
693
+ var mode = _this.props.mode;
694
+ var uncommittedLngLat = _this.state.uncommittedLngLat;
695
+ if (uncommittedLngLat && mode === _constants.MODES.DRAW_POLYGON && points.length > 2 && !isClosed) {
696
+ // from uncommitted position to the first point of the polygon
697
+ return _this._renderSegment(featureIndex, 'uncommitted-close', uncommittedLngLat, points[0], style);
698
+ }
699
+ return null;
700
+ });
701
+ (0, _defineProperty2["default"])(_this, "_renderFill", function (index, feature, style) {
702
+ var mode = _this.props.mode;
703
+ var isDrawing = _constants.DRAWING_MODES.find(function (m) {
704
+ return m === mode;
705
+ });
706
+ var points = feature.points,
707
+ renderType = feature.renderType,
708
+ isClosed = feature.isClosed;
709
+ if (renderType !== _constants.RENDER_TYPE.POLYGON && renderType !== _constants.RENDER_TYPE.RECTANGLE) {
710
+ return null;
711
+ }
712
+ var uncommittedLngLat = _this.state.uncommittedLngLat;
713
+ var fillPoints = points;
714
+ if (uncommittedLngLat && isDrawing) {
715
+ fillPoints = [].concat((0, _toConsumableArray2["default"])(points), [uncommittedLngLat]);
716
+ }
717
+ var fillPath = _this._getProjectedData(fillPoints, renderType, isClosed);
718
+ return /*#__PURE__*/_react["default"].createElement("path", {
719
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
720
+ "data-feature-index": index,
721
+ key: "".concat(_constants.ELEMENT_TYPE.FEATURE, ".").concat(index, ".fill"),
722
+ style: _objectSpread(_objectSpread({}, style), {}, {
723
+ stroke: 'none'
724
+ }),
725
+ d: fillPath
726
+ });
727
+ });
728
+ (0, _defineProperty2["default"])(_this, "_renderCurrentPath", function (feature, index) {
729
+ var points = feature.points,
730
+ renderType = feature.renderType;
731
+ if (!points || !points.length || renderType === _constants.RENDER_TYPE.POINT) {
732
+ return null;
733
+ }
734
+ var getFeatureStyle = _this.props.getFeatureStyle;
735
+ var geoJson = feature.toFeature();
736
+ var committedStyle = getFeatureStyle({
737
+ feature: geoJson,
738
+ state: _constants.RENDER_STATE.SELECTED
739
+ });
740
+ var uncommittedStyle = getFeatureStyle({
741
+ feature: geoJson,
742
+ state: _constants.RENDER_STATE.UNCOMMITTED
743
+ });
744
+ var closingStyle = getFeatureStyle({
745
+ feature: geoJson,
746
+ state: _constants.RENDER_STATE.CLOSING
747
+ });
748
+ var committedStroke = _this._renderCommittedStroke(index, feature, committedStyle);
749
+ var uncommittedStrokes = _this._renderUncommittedStrokes(index, feature, uncommittedStyle) || [];
750
+ var closingStroke = _this._renderClosingStroke(index, feature, closingStyle);
751
+ var fill = _this._renderFill(index, feature, uncommittedStyle);
752
+ return [fill, committedStroke].concat((0, _toConsumableArray2["default"])(uncommittedStrokes), [closingStroke]).filter(Boolean);
753
+ });
754
+ (0, _defineProperty2["default"])(_this, "_renderCommittedVertices", function (featureIndex, feature, geoJson) {
755
+ var _this$props2 = _this.props,
756
+ mode = _this$props2.mode,
757
+ getEditHandleStyle = _this$props2.getEditHandleStyle,
758
+ getEditHandleShape = _this$props2.getEditHandleShape;
759
+ var isClosed = feature.isClosed,
760
+ points = feature.points;
761
+ var committedVertices = [];
762
+ for (var i = 0; i < points.length; i++) {
763
+ var p = points[i];
764
+ var operation = _constants.OPERATIONS.SET;
765
+ var style = getEditHandleStyle({
766
+ feature: geoJson,
767
+ index: i,
768
+ state: _this._getEditHandleState(i)
769
+ });
770
+ var shape = typeof getEditHandleShape === 'function' ? getEditHandleShape({
771
+ feature: geoJson,
772
+ index: i,
773
+ state: _this._getEditHandleState(i)
774
+ }) : getEditHandleShape;
775
+ if (isClosed) {
776
+ committedVertices.push(_this._renderVertex(p, featureIndex, i, operation, style, shape));
777
+ } else {
778
+ if (mode === _constants.MODES.DRAW_POLYGON && i === 0 && points.length > 2) {
779
+ operation = _constants.OPERATIONS.INTERSECT;
780
+ }
781
+ committedVertices.push(_this._renderVertex(p, featureIndex, i, operation, style, shape));
782
+ }
783
+ }
784
+ return committedVertices;
785
+ });
786
+ (0, _defineProperty2["default"])(_this, "_renderUncommittedVertex", function (featureIndex, feature, geoJson) {
787
+ var _this$props3 = _this.props,
788
+ getEditHandleStyle = _this$props3.getEditHandleStyle,
789
+ getEditHandleShape = _this$props3.getEditHandleShape;
790
+ var _this$state6 = _this.state,
791
+ selectedFeatureId = _this$state6.selectedFeatureId,
792
+ uncommittedLngLat = _this$state6.uncommittedLngLat;
793
+ var id = feature.id;
794
+ var uncommittedVertex = null;
795
+ if (selectedFeatureId === id && uncommittedLngLat) {
796
+ var style = getEditHandleStyle({
797
+ feature: geoJson,
798
+ index: 'uncommitted',
799
+ state: _this._getEditHandleState(-1, _constants.RENDER_STATE.UNCOMMITTED)
800
+ });
801
+ var shape = typeof getEditHandleShape === 'function' ? getEditHandleShape({
802
+ feature: geoJson,
803
+ index: null,
804
+ state: _this._getEditHandleState(-1)
805
+ }) : getEditHandleShape;
806
+ uncommittedVertex = _this._renderVertex(uncommittedLngLat, featureIndex, 'uncommitted', _constants.OPERATIONS.INSERT, _objectSpread(_objectSpread({}, style), {}, {
807
+ pointerEvents: 'none'
808
+ }), shape);
809
+ }
810
+ return uncommittedVertex;
811
+ });
812
+ (0, _defineProperty2["default"])(_this, "_renderCurrentVertices", function (feature, featureIndex) {
813
+ var points = feature.points;
814
+ if (!points || !points.length) {
815
+ return null;
816
+ }
817
+ var geoJson = feature.toFeature();
818
+ var committedVertices = _this._renderCommittedVertices(featureIndex, feature, geoJson);
819
+ var uncommittedVertex = _this._renderUncommittedVertex(featureIndex, feature, geoJson);
820
+ return /*#__PURE__*/_react["default"].createElement("g", {
821
+ key: "edit-handles"
822
+ }, committedVertices, uncommittedVertex);
823
+ });
824
+ (0, _defineProperty2["default"])(_this, "_renderCurrent", function () {
825
+ var features = _this.state.features;
826
+ var feature = _this._getSelectedFeature();
827
+ if (!features || !feature || !feature.points) {
828
+ return null;
829
+ }
830
+ var mode = _this.props.mode;
831
+ var index = features.findIndex(function (f) {
832
+ return f.id === feature.id;
833
+ });
834
+ return /*#__PURE__*/_react["default"].createElement("g", {
835
+ key: "feature current",
836
+ style: mode === _constants.MODES.READ_ONLY || mode === _constants.MODES.SELECT_FEATURE ? _constants.STATIC_STYLE : null
837
+ }, _this._renderCurrentPath(feature, index), _this._renderCurrentVertices(feature, index));
838
+ });
839
+ (0, _defineProperty2["default"])(_this, "_renderFeature", function (feature, index) {
840
+ if (feature === _this._getSelectedFeature()) {
841
+ return null;
842
+ }
843
+ var clickRadius = _this.props.clickRadius;
844
+ var id = feature.id,
845
+ points = feature.points,
846
+ renderType = feature.renderType,
847
+ isClosed = feature.isClosed;
848
+ if (!points || !points.length) {
849
+ return null;
850
+ }
851
+ var projected = _this._getProjectedData(points, renderType, isClosed);
852
+ if (!projected) {
853
+ return null;
854
+ }
855
+ var geoJson = feature.toFeature();
856
+ var renderState = _this._getFeatureRenderState(id);
857
+ var _this$props4 = _this.props,
858
+ getFeatureStyle = _this$props4.getFeatureStyle,
859
+ getFeatureShape = _this$props4.getFeatureShape;
860
+ var style = getFeatureStyle({
861
+ feature: geoJson,
862
+ state: renderState
863
+ });
864
+ var shape = typeof getFeatureShape === 'function' ? getFeatureShape({
865
+ feature: geoJson,
866
+ state: renderState
867
+ }) : getFeatureShape;
868
+ var elemKey = "".concat(_constants.ELEMENT_TYPE.FEATURE, ".").concat(index);
869
+ switch (renderType) {
870
+ case _constants.RENDER_TYPE.POINT:
871
+ if (shape === 'rect') {
872
+ return /*#__PURE__*/_react["default"].createElement("g", {
873
+ key: elemKey,
874
+ transform: "translate(".concat(projected[0][0], ", ").concat(projected[0][1], ")")
875
+ }, /*#__PURE__*/_react["default"].createElement("rect", {
876
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
877
+ "data-feature-index": index,
878
+ key: "".concat(elemKey, ".hidden"),
879
+ style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
880
+ width: clickRadius,
881
+ height: clickRadius
882
+ })
883
+ }), /*#__PURE__*/_react["default"].createElement("rect", {
884
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
885
+ "data-feature-index": index,
886
+ key: elemKey,
887
+ style: style
888
+ }));
889
+ }
890
+ return /*#__PURE__*/_react["default"].createElement("g", {
891
+ key: elemKey,
892
+ transform: "translate(".concat(projected[0][0], ", ").concat(projected[0][1], ")")
893
+ }, /*#__PURE__*/_react["default"].createElement("circle", {
894
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
895
+ "data-feature-index": index,
896
+ key: "".concat(elemKey, ".hidden"),
897
+ style: _objectSpread(_objectSpread({}, style), {}, {
898
+ opacity: 0
899
+ }),
900
+ cx: 0,
901
+ cy: 0,
902
+ r: clickRadius
903
+ }), /*#__PURE__*/_react["default"].createElement("circle", {
904
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
905
+ "data-feature-index": index,
906
+ key: "feature.".concat(index),
907
+ style: style,
908
+ cx: 0,
909
+ cy: 0
910
+ }));
911
+
912
+ // first <path> is to make path easily interacted with
913
+ case _constants.RENDER_TYPE.LINE_STRING:
914
+ return /*#__PURE__*/_react["default"].createElement("g", {
915
+ key: elemKey
916
+ }, /*#__PURE__*/_react["default"].createElement("path", {
917
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
918
+ "data-feature-index": index,
919
+ key: "".concat(elemKey, ".hidden"),
920
+ style: _objectSpread(_objectSpread({}, style), {}, {
921
+ strokeWidth: clickRadius,
922
+ opacity: 0
923
+ }),
924
+ d: projected
925
+ }), /*#__PURE__*/_react["default"].createElement("path", {
926
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
927
+ "data-feature-index": index,
928
+ key: elemKey,
929
+ style: style,
930
+ d: projected
931
+ }));
932
+ case 'Polygon':
933
+ case 'Rectangle':
934
+ return /*#__PURE__*/_react["default"].createElement("path", {
935
+ "data-type": _constants.ELEMENT_TYPE.FEATURE,
936
+ "data-feature-index": index,
937
+ key: elemKey,
938
+ style: style,
939
+ d: projected
940
+ });
941
+ default:
942
+ return null;
943
+ }
944
+ });
945
+ (0, _defineProperty2["default"])(_this, "_renderFeatures", function () {
946
+ var features = _this.state.features;
947
+ return features && features.map(_this._renderFeature);
948
+ });
949
+ (0, _defineProperty2["default"])(_this, "_renderCanvas", function () {
950
+ var _this$state7 = _this.state,
951
+ selectedFeatureId = _this$state7.selectedFeatureId,
952
+ features = _this$state7.features;
953
+ return /*#__PURE__*/_react["default"].createElement("svg", {
954
+ key: "draw-canvas",
955
+ width: "100%",
956
+ height: "100%"
957
+ }, features && features.length > 0 && /*#__PURE__*/_react["default"].createElement("g", {
958
+ key: "feature-group"
959
+ }, _this._renderFeatures()), selectedFeatureId && _this._renderCurrent());
960
+ });
961
+ (0, _defineProperty2["default"])(_this, "_renderEditor", function () {
962
+ var viewport = _this._context && _this._context.viewport || {};
963
+ var style = _this.props.style;
964
+ var width = viewport.width,
965
+ height = viewport.height;
966
+ return /*#__PURE__*/_react["default"].createElement("div", {
967
+ id: "editor",
968
+ style: _objectSpread({
969
+ width: width,
970
+ height: height
971
+ }, style),
972
+ ref: function ref(_) {
973
+ _this._containerRef = _;
974
+ }
975
+ }, _this._renderCanvas());
976
+ });
977
+ _this.state = {
978
+ features: props.features ? props.features.map(function (f) {
979
+ return _feature2["default"].fromFeature(f);
980
+ }).filter(Boolean) : null,
981
+ selectedFeatureId: -1,
982
+ hoveredFeatureId: null,
983
+ hoveredLngLat: null,
984
+ hoveredVertexIndex: -1,
985
+ // intermediate mouse position when drawing
986
+ uncommittedLngLat: null,
987
+ draggingVertexIndex: -1,
988
+ startDragPos: null,
989
+ isDragging: false,
990
+ didDrag: false
991
+ };
992
+ _this._containerRef = null;
993
+ _this._events = {};
994
+ _this._context = null;
995
+ return _this;
996
+ }
997
+ (0, _inherits2["default"])(Editor, _PureComponent);
998
+ return (0, _createClass2["default"])(Editor, [{
999
+ key: "componentDidMount",
1000
+ value: function componentDidMount() {
1001
+ if (this.props.mode && this.props.mode !== _constants.MODES.READ_ONLY) {
1002
+ this._setupEvents();
1003
+ }
1004
+ }
1005
+ }, {
1006
+ key: "componentWillReceiveProps",
1007
+ value: function componentWillReceiveProps(nextProps) {
1008
+ if (this.props.mode !== nextProps.mode) {
1009
+ if (!nextProps.mode || nextProps.mode === _constants.MODES.READ_ONLY) {
1010
+ this._removeEvents();
1011
+ }
1012
+ if (!this.props.mode || this.props.mode === _constants.MODES.READ_ONLY) {
1013
+ this._setupEvents();
1014
+ }
1015
+ }
1016
+ if (this.props.mode !== nextProps.mode || this.props.features !== nextProps.features) {
1017
+ this.setState({
1018
+ features: nextProps.features && nextProps.features.map(function (f) {
1019
+ return _feature2["default"].fromFeature(f);
1020
+ }).filter(Boolean)
1021
+ });
1022
+ }
1023
+ if (this.props.mode !== nextProps.mode || this.props.selectedFeatureId !== nextProps.selectedFeatureId) {
1024
+ this._clearCache();
1025
+ this.setState({
1026
+ selectedFeatureId: nextProps.selectedFeatureId
1027
+ });
1028
+ }
1029
+ }
1030
+ }, {
1031
+ key: "componentWillUnmount",
1032
+ value: function componentWillUnmount() {
1033
+ this._removeEvents();
1034
+ }
1035
+ }, {
1036
+ key: "_setupEvents",
1037
+ value: /* EVENTS */
1038
+ function _setupEvents() {
1039
+ var _this2 = this;
1040
+ var ref = this._containerRef;
1041
+ if (!ref || !this._context || !this._context.eventManager) {
1042
+ return;
1043
+ }
1044
+ this._events = {
1045
+ anyclick: function anyclick(evt) {
1046
+ return _this2._onEvent(_this2._onClick, evt, true);
1047
+ },
1048
+ click: function click(evt) {
1049
+ return evt.stopImmediatePropagation();
1050
+ },
1051
+ pointermove: function pointermove(evt) {
1052
+ return _this2._onEvent(_this2._onMouseMove, evt, true);
1053
+ },
1054
+ pointerdown: function pointerdown(evt) {
1055
+ return _this2._onEvent(_this2._onMouseDown, evt, true);
1056
+ },
1057
+ pointerup: function pointerup(evt) {
1058
+ return _this2._onEvent(_this2._onMouseUp, evt, true);
1059
+ },
1060
+ panmove: function panmove(evt) {
1061
+ return _this2._onEvent(_this2._onPan, evt, false);
1062
+ },
1063
+ panstart: function panstart(evt) {
1064
+ return _this2._onEvent(_this2._onPan, evt, false);
1065
+ },
1066
+ panend: function panend(evt) {
1067
+ return _this2._onEvent(_this2._onPan, evt, false);
1068
+ }
1069
+ };
1070
+ this._context.eventManager.on(this._events, ref);
1071
+ }
1072
+ }, {
1073
+ key: "_removeEvents",
1074
+ value: function _removeEvents() {
1075
+ if (!this._context || !this._context.eventManager || !this._events) {
1076
+ return;
1077
+ }
1078
+ this._context.eventManager.off(this._events);
1079
+ this._events = null;
1080
+ }
1081
+ }, {
1082
+ key: "_getProjectedData",
1083
+ value: function _getProjectedData(points, renderType) {
1084
+ var _this3 = this;
1085
+ var isClosed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1086
+ if (points.length === 0) {
1087
+ return '';
1088
+ }
1089
+ var projected = points.map(function (p) {
1090
+ return _this3._project(p);
1091
+ });
1092
+ switch (renderType) {
1093
+ case _constants.RENDER_TYPE.POINT:
1094
+ return projected;
1095
+ case _constants.RENDER_TYPE.LINE_STRING:
1096
+ case _constants.RENDER_TYPE.POLYGON:
1097
+ case _constants.RENDER_TYPE.RECTANGLE:
1098
+ var pathString = projected.map(function (p) {
1099
+ return "".concat(p[0], ",").concat(p[1]);
1100
+ }).join('L');
1101
+ return "M ".concat(pathString, " ").concat(isClosed ? 'z' : '');
1102
+ default:
1103
+ return null;
1104
+ }
1105
+ }
1106
+ }, {
1107
+ key: "render",
1108
+ value: function render() {
1109
+ var _this4 = this;
1110
+ return /*#__PURE__*/_react["default"].createElement(_reactMapGl._MapContext.Consumer, null, function (context) {
1111
+ _this4._context = context;
1112
+ var viewport = context && context.viewport;
1113
+ if (!viewport || viewport.height <= 0 || viewport.width <= 0) {
1114
+ return null;
1115
+ }
1116
+ return _this4._renderEditor();
1117
+ });
1118
+ }
1119
+ }]);
1120
+ }(_react.PureComponent);
1121
+ (0, _defineProperty2["default"])(Editor, "defaultProps", defaultProps);
1122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RNYXBHbCIsIl91dWlkIiwiX2ZlYXR1cmUyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHlsZSIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImRlZmF1bHRQcm9wcyIsIm1vZGUiLCJNT0RFUyIsIlJFQURfT05MWSIsImNsaWNrUmFkaXVzIiwiZ2V0RWRpdEhhbmRsZVN0eWxlIiwiZGVmYXVsdEdldEVkaXRIYW5kbGVTdHlsZSIsImdldEZlYXR1cmVTdHlsZSIsImRlZmF1bHRHZXRGZWF0dXJlU3R5bGUiLCJnZXRGZWF0dXJlU2hhcGUiLCJnZXRFZGl0SGFuZGxlU2hhcGUiLCJvblNlbGVjdCIsIlVOQ09NTUlUVEVEX0lEIiwiRWRpdG9yIiwiZXhwb3J0cyIsIl9QdXJlQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJmZWF0dXJlcyIsIm9uVXBkYXRlIiwibWFwIiwiZiIsInRvRmVhdHVyZSIsImZlYXR1cmUiLCJvcHRpb25zIiwidmVydGV4SW5kZXgiLCJsbmdMYXQiLCJkaWFnb25hbCIsInAwIiwicG9pbnRzIiwicmVwbGFjZVBvaW50IiwiX3VwZGF0ZSIsInN0YXRlIiwicmVuZGVyVHlwZSIsIlJFTkRFUl9UWVBFIiwiUkVDVEFOR0xFIiwiX3VwZGF0ZVJlY3RhbmdsZSIsImR4IiwiZHkiLCJwaXhlbHMiLCJfcHJvamVjdCIsIl91bnByb2plY3QiLCJ4IiwieSIsImlzTmV3IiwidW5kZWZpbmVkIiwiX2dldFNlbGVjdGVkRmVhdHVyZSIsImFkZFBvaW50IiwidmFsaWRQYXRoIiwiX3RoaXMkcHJvcHMiLCJEUkFXX1BPSU5UIiwiRFJBV19QQVRIIiwic2VsZWN0ZWRGZWF0dXJlSWQiLCJpZCIsInNldFN0YXRlIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInVuY29tbWl0dGVkTG5nTGF0IiwiaG92ZXJlZEZlYXR1cmVJZCIsImhvdmVyZWRMbmdMYXQiLCJob3ZlcmVkVmVydGV4SW5kZXgiLCJkcmFnZ2luZ1ZlcnRleEluZGV4Iiwic3RhcnREcmFnUG9zIiwiaXNEcmFnZ2luZyIsImRpZERyYWciLCJzZWxlY3RlZEZlYXR1cmUiLCJjbG9zZVBhdGgiLCJwb2ludCIsInR5cGUiLCJNT0RFX1RPX0dFT0pTT05fVFlQRSIsIk1PREVfVE9fUkVOREVSX1RZUEUiLCJGZWF0dXJlIiwidXVpZCIsIl9hZGRQb2ludCIsIkRSQVdfUkVDVEFOR0xFIiwiaGFuZGxlciIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiTnVtYmVyIiwiX3RoaXMkX2dldEV2ZW50UG9zaXRpIiwiX2dldEV2ZW50UG9zaXRpb24iLCJhdHRyaWJ1dGVzIiwicGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMiLCJ0YXJnZXQiLCJFTEVNRU5UX1RZUEUiLCJWRVJURVgiLCJfbWF0Y2hlc0ZlYXR1cmUiLCJmZWF0dXJlSW5kZXgiLCJfdGhpcyRzdGF0ZSIsIl90aGlzJF9nZXRFdmVudFBvc2l0aTIiLCJpc0RyYXdpbmciLCJEUkFXSU5HX01PREVTIiwiaW5kZXhPZiIsImlzRWRpdGluZyIsIkVESVRfVkVSVEVYIiwiX3VwZGF0ZUZlYXR1cmUiLCJMSU5FX1NUUklORyIsIlBPTFlHT04iLCJTRUdNRU5UIiwiX2dldENsb3Nlc3RQb3NpdGlvbk9uU2VnbWVudCIsIl90aGlzJHN0YXRlMiIsIkZFQVRVUkUiLCJzb3VyY2VFdmVudCIsIm9wZXJhdGlvbiIsIk9QRVJBVElPTlMiLCJJTlRFUlNFQ1QiLCJTRVQiLCJfY2xvc2VQYXRoIiwiX2NsZWFyQ2FjaGUiLCJfdGhpcyRfZ2V0RXZlbnRQb3NpdGkzIiwiaW5zZXJ0UG9zaXRpb24iLCJpbnNlcnRQb2ludCIsIl9vbkNsaWNrVmVydGV4IiwiX29uQ2xpY2tTZWdtZW50IiwiU0VMRUNUX0ZFQVRVUkUiLCJfb25DbGlja0ZlYXR1cmUiLCJfdGhpcyRfZ2V0RXZlbnRQb3NpdGk0IiwiX2FkZEZlYXR1cmUiLCJEUkFXX1BPTFlHT04iLCJpc0Nsb3NlZCIsInB0IiwiX2NvbnRleHQiLCJ2aWV3cG9ydCIsInByb2plY3QiLCJ1bnByb2plY3QiLCJlbGVtRmVhdHVyZSIsInBvaW50TG5nTGF0Iiwic3RhcnRQb3MiLCJlbmRQb3MiLCJmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudCIsIl9ldnQkb2Zmc2V0Q2VudGVyIiwib2Zmc2V0Q2VudGVyIiwiX3RoaXMkc3RhdGUzIiwiZmluZCIsImluZGV4IiwicmVuZGVyU3RhdGUiLCJfdGhpcyRzdGF0ZTQiLCJpc1NlbGVjdGVkIiwiUE9JTlQiLCJpc0Nsb3NpbmciLCJSRU5ERVJfU1RBVEUiLCJDTE9TSU5HIiwiU0VMRUNURUQiLCJIT1ZFUkVEIiwiVU5DT01NSVRURUQiLCJJTkFDVElWRSIsIl90aGlzJHN0YXRlNSIsInBvc2l0aW9uIiwic3R5bGUiLCJzaGFwZSIsInAiLCJlbGVtS2V5IiwiY3JlYXRlRWxlbWVudCIsImtleSIsInRyYW5zZm9ybSIsIkhJRERFTl9DTElDS0FCTEVfU1RZTEUiLCJzdHJva2UiLCJjeCIsImN5Iiwid2lkdGgiLCJoZWlnaHQiLCJzdGFydFZlcnRleElkIiwicHJvamVjdGVkIiwiX2dldFByb2plY3RlZERhdGEiLCJyYWRpdXMiLCJvdGhlcnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwic3Ryb2tlV2lkdGgiLCJvcGFjaXR5IiwiZCIsInNlZ21lbnRzIiwiX3JlbmRlclNlZ21lbnQiLCJsYXN0SW5kZXgiLCJtIiwidW5jb21taXR0ZWRTZWdtZW50cyIsInNsaWNlIiwiZmlsbFBvaW50cyIsImZpbGxQYXRoIiwiZ2VvSnNvbiIsImNvbW1pdHRlZFN0eWxlIiwidW5jb21taXR0ZWRTdHlsZSIsImNsb3NpbmdTdHlsZSIsImNvbW1pdHRlZFN0cm9rZSIsIl9yZW5kZXJDb21taXR0ZWRTdHJva2UiLCJ1bmNvbW1pdHRlZFN0cm9rZXMiLCJfcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzIiwiY2xvc2luZ1N0cm9rZSIsIl9yZW5kZXJDbG9zaW5nU3Ryb2tlIiwiZmlsbCIsIl9yZW5kZXJGaWxsIiwiX3RoaXMkcHJvcHMyIiwiY29tbWl0dGVkVmVydGljZXMiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwiX3JlbmRlclZlcnRleCIsIl90aGlzJHByb3BzMyIsIl90aGlzJHN0YXRlNiIsInVuY29tbWl0dGVkVmVydGV4IiwiSU5TRVJUIiwicG9pbnRlckV2ZW50cyIsIl9yZW5kZXJDb21taXR0ZWRWZXJ0aWNlcyIsIl9yZW5kZXJVbmNvbW1pdHRlZFZlcnRleCIsImZpbmRJbmRleCIsIlNUQVRJQ19TVFlMRSIsIl9yZW5kZXJDdXJyZW50UGF0aCIsIl9yZW5kZXJDdXJyZW50VmVydGljZXMiLCJfZ2V0RmVhdHVyZVJlbmRlclN0YXRlIiwiX3RoaXMkcHJvcHM0IiwiX3JlbmRlckZlYXR1cmUiLCJfdGhpcyRzdGF0ZTciLCJfcmVuZGVyRmVhdHVyZXMiLCJfcmVuZGVyQ3VycmVudCIsInJlZiIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsImZyb21GZWF0dXJlIiwiX2V2ZW50cyIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwidmFsdWUiLCJjb21wb25lbnREaWRNb3VudCIsIl9zZXR1cEV2ZW50cyIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJuZXh0UHJvcHMiLCJfcmVtb3ZlRXZlbnRzIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJfdGhpczIiLCJldmVudE1hbmFnZXIiLCJhbnljbGljayIsIl9vbkV2ZW50IiwiX29uQ2xpY2siLCJjbGljayIsInBvaW50ZXJtb3ZlIiwiX29uTW91c2VNb3ZlIiwicG9pbnRlcmRvd24iLCJfb25Nb3VzZURvd24iLCJwb2ludGVydXAiLCJfb25Nb3VzZVVwIiwicGFubW92ZSIsIl9vblBhbiIsInBhbnN0YXJ0IiwicGFuZW5kIiwib24iLCJvZmYiLCJfdGhpczMiLCJwYXRoU3RyaW5nIiwiam9pbiIsInJlbmRlciIsIl90aGlzNCIsIl9NYXBDb250ZXh0IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwiX3JlbmRlckVkaXRvciIsIlB1cmVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmVuZG9yL3JlYWN0LW1hcC1nbC1kcmF3L2VkaXRvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBWZW5kb3JlZCBmcm9tIHJlYWN0LW1hcC1nbC1kcmF3QDAuMTQuOCAoTUlULCBDb3B5cmlnaHQgKGMpIDIwMTggVWJlciBUZWNobm9sb2dpZXMsIEluYy4pLCBzZWUgLi9MSUNFTlNFXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50cyAqL1xuaW1wb3J0IFJlYWN0LCB7UHVyZUNvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtfTWFwQ29udGV4dCBhcyBNYXBDb250ZXh0fSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IHt2NCBhcyB1dWlkfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IEZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcbmltcG9ydCB7XG4gIGdldEVkaXRIYW5kbGVTdHlsZSBhcyBkZWZhdWx0R2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRGZWF0dXJlU3R5bGUgYXMgZGVmYXVsdEdldEZlYXR1cmVTdHlsZSxcbiAgSElEREVOX0NMSUNLQUJMRV9TVFlMRVxufSBmcm9tICcuL3N0eWxlJztcblxuaW1wb3J0IHtcbiAgT1BFUkFUSU9OUyxcbiAgTU9ERVMsXG4gIERSQVdJTkdfTU9ERVMsXG4gIE1PREVfVE9fR0VPSlNPTl9UWVBFLFxuICBNT0RFX1RPX1JFTkRFUl9UWVBFLFxuICBSRU5ERVJfU1RBVEUsXG4gIFJFTkRFUl9UWVBFLFxuICBTVEFUSUNfU1RZTEUsXG4gIEVMRU1FTlRfVFlQRVxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge3BhcnNlRWxlbURhdGFBdHRyaWJ1dGVzLCBmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgbW9kZTogTU9ERVMuUkVBRF9PTkxZLFxuICBjbGlja1JhZGl1czogMCxcbiAgZ2V0RWRpdEhhbmRsZVN0eWxlOiBkZWZhdWx0R2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRGZWF0dXJlU3R5bGU6IGRlZmF1bHRHZXRGZWF0dXJlU3R5bGUsXG4gIGdldEZlYXR1cmVTaGFwZTogJ2NpcmNsZScsXG4gIGdldEVkaXRIYW5kbGVTaGFwZTogJ2NpcmNsZScsXG4gIG9uU2VsZWN0OiAoKSA9PiB7fVxufTtcblxuY29uc3QgVU5DT01NSVRURURfSUQgPSAndW5jb21taXR0ZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmVhdHVyZXM6IHByb3BzLmZlYXR1cmVzXG4gICAgICAgID8gcHJvcHMuZmVhdHVyZXMubWFwKGYgPT4gRmVhdHVyZS5mcm9tRmVhdHVyZShmKSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIDogbnVsbCxcblxuICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IC0xLFxuXG4gICAgICBob3ZlcmVkRmVhdHVyZUlkOiBudWxsLFxuICAgICAgaG92ZXJlZExuZ0xhdDogbnVsbCxcbiAgICAgIGhvdmVyZWRWZXJ0ZXhJbmRleDogLTEsXG5cbiAgICAgIC8vIGludGVybWVkaWF0ZSBtb3VzZSBwb3NpdGlvbiB3aGVuIGRyYXdpbmdcbiAgICAgIHVuY29tbWl0dGVkTG5nTGF0OiBudWxsLFxuXG4gICAgICBkcmFnZ2luZ1ZlcnRleEluZGV4OiAtMSxcbiAgICAgIHN0YXJ0RHJhZ1BvczogbnVsbCxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgZGlkRHJhZzogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGFpbmVyUmVmID0gbnVsbDtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLm1vZGUgJiYgdGhpcy5wcm9wcy5tb2RlICE9PSBNT0RFUy5SRUFEX09OTFkpIHtcbiAgICAgIHRoaXMuX3NldHVwRXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSkge1xuICAgICAgaWYgKCFuZXh0UHJvcHMubW9kZSB8fCBuZXh0UHJvcHMubW9kZSA9PT0gTU9ERVMuUkVBRF9PTkxZKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUV2ZW50cygpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnByb3BzLm1vZGUgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBNT0RFUy5SRUFEX09OTFkpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBFdmVudHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSB8fCB0aGlzLnByb3BzLmZlYXR1cmVzICE9PSBuZXh0UHJvcHMuZmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmZWF0dXJlczpcbiAgICAgICAgICBuZXh0UHJvcHMuZmVhdHVyZXMgJiYgbmV4dFByb3BzLmZlYXR1cmVzLm1hcChmID0+IEZlYXR1cmUuZnJvbUZlYXR1cmUoZikpLmZpbHRlcihCb29sZWFuKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSB8fFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RlZEZlYXR1cmVJZCAhPT0gbmV4dFByb3BzLnNlbGVjdGVkRmVhdHVyZUlkXG4gICAgKSB7XG4gICAgICB0aGlzLl9jbGVhckNhY2hlKCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IG5leHRQcm9wcy5zZWxlY3RlZEZlYXR1cmVJZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fcmVtb3ZlRXZlbnRzKCk7XG4gIH1cblxuICBfY29udGFpbmVyUmVmO1xuICBfZXZlbnRzO1xuICBfY29udGV4dDtcblxuICAvKiBGRUFUVVJFIE9QRVJBVElPTlMgKi9cbiAgX3VwZGF0ZSA9IGZlYXR1cmVzID0+IHtcbiAgICBpZiAoZmVhdHVyZXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25VcGRhdGUoZmVhdHVyZXMubWFwKGYgPT4gZi50b0ZlYXR1cmUoKSkpO1xuICAgIH1cbiAgfTtcblxuICBfdXBkYXRlUmVjdGFuZ2xlID0gKGZlYXR1cmUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7dmVydGV4SW5kZXgsIGxuZ0xhdH0gPSBvcHRpb25zO1xuICAgIC8qXG4gICAgICogICBwMC54LCBwMC55ICAgLS0tLS0tLS0tLSAgZGlhZ29uYWwueCwgcDAueVxuICAgICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogICBwMC54LCBkaWFnb25hbC55IC0tLS0tIGRpYWdvbmFsLngsIGRpYWdvbmFsLnlcbiAgICAgKi9cbiAgICBjb25zdCBkaWFnb25hbCA9IHZlcnRleEluZGV4O1xuICAgIGNvbnN0IHAwID0gZmVhdHVyZS5wb2ludHNbKGRpYWdvbmFsICsgMikgJSA0XTtcblxuICAgIGZlYXR1cmUucmVwbGFjZVBvaW50KGRpYWdvbmFsLCBbbG5nTGF0WzBdLCBsbmdMYXRbMV1dKTtcbiAgICBmZWF0dXJlLnJlcGxhY2VQb2ludCgoZGlhZ29uYWwgKyAxKSAlIDQsIFtsbmdMYXRbMF0sIHAwWzFdXSk7XG4gICAgZmVhdHVyZS5yZXBsYWNlUG9pbnQoKGRpYWdvbmFsICsgMykgJSA0LCBbcDBbMF0sIGxuZ0xhdFsxXV0pO1xuXG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICB9O1xuXG4gIF91cGRhdGVGZWF0dXJlID0gKGZlYXR1cmUsIG1vZGUsIG9wdGlvbnMpID0+IHtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgIGlmIChmZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlJFQ1RBTkdMRSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlY3RhbmdsZShmZWF0dXJlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlLnJlcGxhY2VQb2ludChvcHRpb25zLnZlcnRleEluZGV4LCBbb3B0aW9ucy5sbmdMYXRbMF0sIG9wdGlvbnMubG5nTGF0WzFdXSk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdmZWF0dXJlJzpcbiAgICAgICAgY29uc3Qge2R4LCBkeX0gPSBvcHRpb25zO1xuICAgICAgICBmZWF0dXJlLnBvaW50cyA9IGZlYXR1cmUucG9pbnRzXG4gICAgICAgICAgLm1hcChsbmdMYXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxzID0gdGhpcy5fcHJvamVjdChsbmdMYXQpO1xuICAgICAgICAgICAgaWYgKHBpeGVscykge1xuICAgICAgICAgICAgICBwaXhlbHNbMF0gKz0gZHg7XG4gICAgICAgICAgICAgIHBpeGVsc1sxXSArPSBkeTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucHJvamVjdChwaXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0aGlzLnN0YXRlLmZlYXR1cmVzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1JlY3RhbmdsZSc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlY3RhbmdsZShmZWF0dXJlLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIF9hZGRQb2ludCA9ICh4LCB5LCBmZWF0dXJlLCBpc05ldyA9IGZhbHNlKSA9PiB7XG4gICAgZmVhdHVyZSA9IGZlYXR1cmUgfHwgdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG5cbiAgICBpZiAoIWZlYXR1cmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsbmdMYXQgPSB0aGlzLl91bnByb2plY3QoW3gsIHldKTtcbiAgICBpZiAoIWxuZ0xhdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZlYXR1cmUuYWRkUG9pbnQoW2xuZ0xhdFswXSwgbG5nTGF0WzFdXSk7XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuc3RhdGUuZmVhdHVyZXMgfHwgW107XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUGF0aCA9IGZlYXR1cmUucG9pbnRzICYmIGZlYXR1cmUucG9pbnRzLmxlbmd0aCA+PSAyO1xuICAgIGNvbnN0IHttb2RlLCBvblNlbGVjdH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUE9JTlQgfHwgKG1vZGUgPT09IE1PREVTLkRSQVdfUEFUSCAmJiB2YWxpZFBhdGgpKSB7XG4gICAgICB0aGlzLl91cGRhdGUoZmVhdHVyZXMpO1xuICAgICAgb25TZWxlY3Qoe3NlbGVjdGVkRmVhdHVyZUlkOiBmZWF0dXJlICYmIGZlYXR1cmUuaWR9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZlYXR1cmVzOiBbLi4uZmVhdHVyZXNdLFxuICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogZmVhdHVyZSAmJiBmZWF0dXJlLmlkXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX2NsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgIHVuY29tbWl0dGVkTG5nTGF0OiBudWxsLFxuXG4gICAgICBob3ZlcmVkRmVhdHVyZUlkOiBudWxsLFxuICAgICAgaG92ZXJlZExuZ0xhdDogbnVsbCxcbiAgICAgIGhvdmVyZWRWZXJ0ZXhJbmRleDogLTEsXG5cbiAgICAgIGRyYWdnaW5nVmVydGV4SW5kZXg6IC0xLFxuICAgICAgc3RhcnREcmFnUG9zOiBudWxsLFxuICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICBkaWREcmFnOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIF9jbG9zZVBhdGggPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgc2VsZWN0ZWRGZWF0dXJlLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgIH1cbiAgfTtcblxuICBfYWRkRmVhdHVyZSA9IChtb2RlLCBwb2ludCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBNT0RFX1RPX0dFT0pTT05fVFlQRVttb2RlXTtcbiAgICBjb25zdCByZW5kZXJUeXBlID0gTU9ERV9UT19SRU5ERVJfVFlQRVttb2RlXTtcblxuICAgIGNvbnN0IGZlYXR1cmUgPSBuZXcgRmVhdHVyZSh7XG4gICAgICBpZDogdXVpZCgpLFxuICAgICAgdHlwZSxcbiAgICAgIHJlbmRlclR5cGVcbiAgICB9KTtcblxuICAgIHRoaXMuX2FkZFBvaW50KHBvaW50LngsIHBvaW50LnksIGZlYXR1cmUsIHRydWUpO1xuXG4gICAgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUkVDVEFOR0xFKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludC54LCBwb2ludC55LCBmZWF0dXJlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qIEVWRU5UUyAqL1xuICBfc2V0dXBFdmVudHMoKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5fY29udGFpbmVyUmVmO1xuXG4gICAgaWYgKCFyZWYgfHwgIXRoaXMuX2NvbnRleHQgfHwgIXRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZXZlbnRzID0ge1xuICAgICAgYW55Y2xpY2s6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uQ2xpY2ssIGV2dCwgdHJ1ZSksXG4gICAgICBjbGljazogZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxcbiAgICAgIHBvaW50ZXJtb3ZlOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vbk1vdXNlTW92ZSwgZXZ0LCB0cnVlKSxcbiAgICAgIHBvaW50ZXJkb3duOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vbk1vdXNlRG93biwgZXZ0LCB0cnVlKSxcbiAgICAgIHBvaW50ZXJ1cDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25Nb3VzZVVwLCBldnQsIHRydWUpLFxuICAgICAgcGFubW92ZTogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpLFxuICAgICAgcGFuc3RhcnQ6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUGFuLCBldnQsIGZhbHNlKSxcbiAgICAgIHBhbmVuZDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyLm9uKHRoaXMuX2V2ZW50cywgcmVmKTtcbiAgfVxuXG4gIF9yZW1vdmVFdmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLl9jb250ZXh0IHx8ICF0aGlzLl9jb250ZXh0LmV2ZW50TWFuYWdlciB8fCAhdGhpcy5fZXZlbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyLm9mZih0aGlzLl9ldmVudHMpO1xuICAgIHRoaXMuX2V2ZW50cyA9IG51bGw7XG4gIH1cblxuICBfb25FdmVudCA9IChoYW5kbGVyLCBldnQsIHN0b3BQcm9wYWdhdGlvbiwgLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG1vZGUgPT09IE1PREVTLlJFQURfT05MWSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZXIoZXZ0LCAuLi5hcmdzKTtcblxuICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgX29uTW91c2VVcCA9IGV2dCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRpZERyYWc6IGZhbHNlXG4gICAgfSk7XG4gICAgY29uc3Qge2RyYWdnaW5nVmVydGV4SW5kZXh9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChOdW1iZXIoZHJhZ2dpbmdWZXJ0ZXhJbmRleCkgPj0gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nVmVydGV4SW5kZXg6IC0xXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX29uTW91c2VEb3duID0gZXZ0ID0+IHtcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9nZXRFdmVudFBvc2l0aW9uKGV2dCk7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlRWxlbURhdGFBdHRyaWJ1dGVzKGV2dC50YXJnZXQpO1xuXG4gICAgLy8gY2xpY2sgc2VnbWVudFxuICAgIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMudHlwZSA9PT0gRUxFTUVOVF9UWVBFLlZFUlRFWCkge1xuICAgICAgY29uc3Qge3ZlcnRleEluZGV4fSA9IGF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdWZXJ0ZXhJbmRleDogdmVydGV4SW5kZXgsXG4gICAgICAgIHN0YXJ0RHJhZ1Bvczoge3gsIHl9LFxuICAgICAgICBpc0RyYWdnaW5nOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gY2xpY2sgc2VsZWN0ZWQgZmVhdHVyZVxuICAgIH0gZWxzZSBpZiAodGhpcy5fbWF0Y2hlc0ZlYXR1cmUoYXR0cmlidXRlcywgdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCkpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc3RhcnREcmFnUG9zOiB7eCwgeX0sXG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtZGVwdGggKi9cbiAgX29uTW91c2VNb3ZlID0gZXZ0ID0+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMoZXZ0LnRhcmdldCkgfHwge307XG4gICAgY29uc3Qge3ZlcnRleEluZGV4LCBmZWF0dXJlSW5kZXgsIHR5cGV9ID0gYXR0cmlidXRlcztcblxuICAgIGNvbnN0IHtzdGFydERyYWdQb3MsIGlzRHJhZ2dpbmcsIGRpZERyYWd9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7bW9kZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuX2dldEV2ZW50UG9zaXRpb24oZXZ0KTtcbiAgICBjb25zdCBsbmdMYXQgPSB0aGlzLl91bnByb2plY3QoW3gsIHldKTtcblxuICAgIGlmIChpc0RyYWdnaW5nICYmICFkaWREcmFnICYmIHN0YXJ0RHJhZ1Bvcykge1xuICAgICAgY29uc3QgZHggPSB4IC0gc3RhcnREcmFnUG9zLng7XG4gICAgICBjb25zdCBkeSA9IHkgLSBzdGFydERyYWdQb3MueTtcbiAgICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IDUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlkRHJhZzogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZSgpO1xuICAgIGNvbnN0IGlzRHJhd2luZyA9IERSQVdJTkdfTU9ERVMuaW5kZXhPZihtb2RlKSAhPT0gLTE7XG4gICAgY29uc3QgaXNFZGl0aW5nID0gbW9kZSA9PT0gTU9ERVMuRURJVF9WRVJURVg7XG5cbiAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICAvLyBkcmFnZ2luZ1xuICAgICAgaWYgKGRpZERyYWcgJiYgc3RhcnREcmFnUG9zKSB7XG4gICAgICAgIGNvbnN0IGRyYWdnaW5nVmVydGV4SW5kZXggPSBOdW1iZXIodGhpcy5zdGF0ZS5kcmFnZ2luZ1ZlcnRleEluZGV4KTtcblxuICAgICAgICBpZiAoZHJhZ2dpbmdWZXJ0ZXhJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gZHJhZ2dpbmcgdmVydGV4XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsICd2ZXJ0ZXgnLCB7XG4gICAgICAgICAgICB2ZXJ0ZXhJbmRleDogZHJhZ2dpbmdWZXJ0ZXhJbmRleCxcbiAgICAgICAgICAgIGxuZ0xhdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRyYWdnaW5nIGZlYXR1cmVcbiAgICAgICAgICBjb25zdCBkeCA9IHggLSBzdGFydERyYWdQb3MueDtcbiAgICAgICAgICBjb25zdCBkeSA9IHkgLSBzdGFydERyYWdQb3MueTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGFydERyYWdQb3M6IHt4LCB5fX0pO1xuXG4gICAgICAgICAgdGhpcy5fdXBkYXRlRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsICdmZWF0dXJlJywge2R4LCBkeX0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUkVDVEFOR0xFKSB7XG4gICAgICAgIC8vIGRyYXdpbmcgcmVjdGFuZ2xlXG4gICAgICAgIHRoaXMuX3VwZGF0ZUZlYXR1cmUoc2VsZWN0ZWRGZWF0dXJlLCAnUmVjdGFuZ2xlJywge3ZlcnRleEluZGV4OiAyLCBsbmdMYXR9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEcmF3aW5nKSB7XG4gICAgICAgIC8vIGRyYXdpbmcgb3RoZXIgc2hhcGVzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3VuY29tbWl0dGVkTG5nTGF0OiBsbmdMYXR9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoc2VsZWN0ZWRGZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLkxJTkVfU1RSSU5HIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmUucmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUE9MWUdPTikgJiZcbiAgICAgICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzZWdtZW50SWQgaXMgc3RhcnQgdmVydGV4SW5kZXhcbiAgICAgICAgICBsZXQgdW5jb21taXR0ZWRMbmdMYXQgPSBudWxsO1xuICAgICAgICAgIGlmIChsbmdMYXQgJiYgdHlwZW9mIHZlcnRleEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQgPSB0aGlzLl9nZXRDbG9zZXN0UG9zaXRpb25PblNlZ21lbnQoXG4gICAgICAgICAgICAgIHZlcnRleEluZGV4LFxuICAgICAgICAgICAgICBsbmdMYXQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHVuY29tbWl0dGVkTG5nTGF0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge2ZlYXR1cmVzLCBzZWxlY3RlZEZlYXR1cmVJZH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChzZWxlY3RlZEZlYXR1cmVJZCAmJiB0eXBlID09PSBFTEVNRU5UX1RZUEUuVkVSVEVYICYmIHR5cGVvZiBmZWF0dXJlSW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMgJiYgZmVhdHVyZXNbZmVhdHVyZUluZGV4XTtcbiAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmVJZCA9PT0gKGZlYXR1cmUgJiYgZmVhdHVyZS5pZCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaG92ZXJlZFZlcnRleEluZGV4OiB2ZXJ0ZXhJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IEVMRU1FTlRfVFlQRS5WRVJURVgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBob3ZlcmVkVmVydGV4SW5kZXg6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBFTEVNRU5UX1RZUEUuRkVBVFVSRSAmJiB0eXBlb2YgZmVhdHVyZUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzICYmIGZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaG92ZXJlZEZlYXR1cmVJZDogZmVhdHVyZSAmJiBmZWF0dXJlLmlkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGhvdmVyZWRGZWF0dXJlSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyogZXNsaW50LWVuYWJsZSBtYXgtZGVwdGggKi9cblxuICBfb25DbGlja0ZlYXR1cmUgPSAoZXZ0LCBhdHRyaWJ1dGVzKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVJbmRleH0gPSBhdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHtmZWF0dXJlc30gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IGZlYXR1cmVzICYmIHR5cGVvZiBmZWF0dXJlSW5kZXggPT09ICdudW1iZXInICYmIGZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG5cbiAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHtcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IHNlbGVjdGVkRmVhdHVyZS5pZCxcbiAgICAgICAgc291cmNlRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkNsaWNrVmVydGV4ID0gKGV2dCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gYXR0cmlidXRlcy5vcGVyYXRpb247XG4gICAgaWYgKFxuICAgICAgb3BlcmF0aW9uID09PSBPUEVSQVRJT05TLklOVEVSU0VDVCB8fFxuICAgICAgKG9wZXJhdGlvbiA9PT0gT1BFUkFUSU9OUy5TRVQgJiYgbW9kZSA9PT0gTU9ERVMuRFJBV19SRUNUQU5HTEUpXG4gICAgKSB7XG4gICAgICB0aGlzLl9jbG9zZVBhdGgoKTtcbiAgICAgIHRoaXMuX2NsZWFyQ2FjaGUoKTtcbiAgICB9XG4gIH07XG5cbiAgX29uQ2xpY2tTZWdtZW50ID0gKGV2dCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKTtcblxuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIChmZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gfHxcbiAgICAgICAgZmVhdHVyZS5yZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORykgJiZcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIGNvbnN0IHt2ZXJ0ZXhJbmRleH0gPSBhdHRyaWJ1dGVzO1xuXG4gICAgICBjb25zdCB7dW5jb21taXR0ZWRMbmdMYXR9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgbGV0IGxuZ0xhdCA9IHVuY29tbWl0dGVkTG5nTGF0O1xuICAgICAgaWYgKCFsbmdMYXQgJiYgdHlwZW9mIHZlcnRleEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9nZXRFdmVudFBvc2l0aW9uKGV2dCk7XG4gICAgICAgIGxuZ0xhdCA9IHRoaXMuX3VucHJvamVjdChbeCwgeV0pO1xuICAgICAgICBsbmdMYXQgPSB0aGlzLl9nZXRDbG9zZXN0UG9zaXRpb25PblNlZ21lbnQodmVydGV4SW5kZXgsIGxuZ0xhdCwgZmVhdHVyZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsbmdMYXQpIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSAodmVydGV4SW5kZXggKyAxKSAlIGZlYXR1cmUucG9pbnRzLmxlbmd0aDtcbiAgICAgICAgZmVhdHVyZS5pbnNlcnRQb2ludChsbmdMYXQsIGluc2VydFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQ6IG51bGwsXG4gICAgICAgIGhvdmVyZWRMbmdMYXQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfb25DbGljayA9IGV2dCA9PiB7XG4gICAgY29uc3Qge21vZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMoZXZ0LnRhcmdldCk7XG5cbiAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5WRVJURVgpIHtcbiAgICAgIHRoaXMuX29uQ2xpY2tWZXJ0ZXgoZXZ0LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gTU9ERVMuRURJVF9WRVJURVggJiYgYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5TRUdNRU5UKSB7XG4gICAgICB0aGlzLl9vbkNsaWNrU2VnbWVudChldnQsIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChtb2RlID09PSBNT0RFUy5TRUxFQ1RfRkVBVFVSRSB8fCBtb2RlID09PSBNT0RFUy5FRElUX1ZFUlRFWCkgJiZcbiAgICAgIGF0dHJpYnV0ZXMgJiZcbiAgICAgIGF0dHJpYnV0ZXMudHlwZSA9PT0gRUxFTUVOVF9UWVBFLkZFQVRVUkVcbiAgICApIHtcbiAgICAgIHRoaXMuX29uQ2xpY2tGZWF0dXJlKGV2dCwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgY29uc3Qge3gsIHl9ID0gdGhpcy5fZ2V0RXZlbnRQb3NpdGlvbihldnQpO1xuXG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIE1PREVTLkVESVRfVkVSVEVYOlxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh7XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNT0RFUy5EUkFXX1BPSU5UOlxuICAgICAgICB0aGlzLl9hZGRGZWF0dXJlKG1vZGUsIHt4LCB5fSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1PREVTLkRSQVdfUEFUSDpcbiAgICAgIGNhc2UgTU9ERVMuRFJBV19QT0xZR09OOlxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlICYmIHNlbGVjdGVkRmVhdHVyZS5pc0Nsb3NlZCkge1xuICAgICAgICAgIC8vIGNsaWNrZWQgb3V0c2lkZVxuICAgICAgICAgIHRoaXMuX2NsZWFyQ2FjaGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICAgICAgICB0aGlzLl9hZGRQb2ludCh4LCB5LCBzZWxlY3RlZEZlYXR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FkZEZlYXR1cmUobW9kZSwge3gsIHl9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNT0RFUy5EUkFXX1JFQ1RBTkdMRTpcbiAgICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZSAmJiBzZWxlY3RlZEZlYXR1cmUuaXNDbG9zZWQpIHtcbiAgICAgICAgICAvLyBjbGlja2VkIG91dHNpZGVcbiAgICAgICAgICB0aGlzLl9jbGVhckNhY2hlKCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh7XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hZGRGZWF0dXJlKG1vZGUsIHt4LCB5fSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH07XG5cbiAgLy8gZG9uJ3QgZm9yd2FyZCBwYW4gZXZlbnRzIHRvIHRoZSB1bmRlcmx5aW5nIG1hcCB3aGVuOlxuICAvLyAtIHRoZSBwYW4gdGFyZ2V0IGlzIGEgdmVydGV4L2xpbmUvdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gIC8vIC0gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgc29tZXRoaW5nIGFyb3VuZFxuICAvLyAtIHRoZXJlIGlzIGN1cnJlbnRseSBhbiB1bmNvbW1pdHRlZCBwb3NpdGlvblxuICAvLyAoaS5lLiB0aGUgdXNlciBpcyBjcmVhdGluZyBhIGZlYXR1cmUvdmVydGV4L2xpbmUpXG4gIF9vblBhbiA9IGV2dCA9PiB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlRWxlbURhdGFBdHRyaWJ1dGVzKGV2dC50YXJnZXQpO1xuICAgIGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMudHlwZTtcbiAgICBpZiAoXG4gICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuVkVSVEVYIHx8XG4gICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVCB8fFxuICAgICAgdGhpcy5zdGF0ZS5pc0RyYWdnaW5nIHx8XG4gICAgICB0aGlzLnN0YXRlLnVuY29tbWl0dGVkTG5nTGF0ICE9PSBudWxsXG4gICAgKSB7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qIEhFTFBFUlMgKi9cbiAgLy8gbG5nTGF0IHRvIHBpeGVsc1xuICBfcHJvamVjdCA9IHB0ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LnZpZXdwb3J0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQucHJvamVjdChwdCk7XG4gIH07XG5cbiAgLy8gcGl4ZWxzIHRvIGxuZ0xhdFxuICBfdW5wcm9qZWN0ID0gcHQgPT4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQgJiYgdGhpcy5fY29udGV4dC52aWV3cG9ydC51bnByb2plY3QocHQpO1xuICB9O1xuXG4gIF9tYXRjaGVzRmVhdHVyZSA9IChhdHRyaWJ1dGVzLCBmZWF0dXJlKSA9PiB7XG4gICAgaWYgKCFhdHRyaWJ1dGVzIHx8IGF0dHJpYnV0ZXMudHlwZSAhPT0gRUxFTUVOVF9UWVBFLkZFQVRVUkUgfHwgIWZlYXR1cmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7ZmVhdHVyZUluZGV4fSA9IGF0dHJpYnV0ZXM7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZWxlbUZlYXR1cmUgPSBmZWF0dXJlcyAmJiBmZWF0dXJlc1tmZWF0dXJlSW5kZXhdO1xuICAgIHJldHVybiBlbGVtRmVhdHVyZSAmJiBmZWF0dXJlLmlkID09PSBlbGVtRmVhdHVyZS5pZDtcbiAgfTtcblxuICBfZ2V0Q2xvc2VzdFBvc2l0aW9uT25TZWdtZW50ID0gKHZlcnRleEluZGV4LCBwb2ludExuZ0xhdCwgZmVhdHVyZSkgPT4ge1xuICAgIGNvbnN0IHBvaW50cyA9IGZlYXR1cmUgJiYgZmVhdHVyZS5wb2ludHM7XG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNlZ21lbnRJZCBpcyBzdGFydCB2ZXJ0ZXhJbmRleFxuICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9pbnRzW3ZlcnRleEluZGV4XTtcbiAgICBjb25zdCBlbmRQb3MgPSBwb2ludHNbKHZlcnRleEluZGV4ICsgMSkgJSBwb2ludHMubGVuZ3RoXTtcbiAgICByZXR1cm4gZmluZENsb3Nlc3RQb2ludE9uTGluZVNlZ21lbnQoc3RhcnRQb3MsIGVuZFBvcywgcG9pbnRMbmdMYXQpO1xuICB9O1xuXG4gIF9nZXRFdmVudFBvc2l0aW9uID0gZXZ0ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvZmZzZXRDZW50ZXI6IHt4LCB5fVxuICAgIH0gPSBldnQ7XG4gICAgcmV0dXJuIHt4OiBOdW1iZXIoeCksIHk6IE51bWJlcih5KX07XG4gIH07XG5cbiAgX2dldFByb2plY3RlZERhdGEocG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCA9IGZhbHNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwb2ludHMubWFwKHAgPT4gdGhpcy5fcHJvamVjdChwKSk7XG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gcHJvamVjdGVkO1xuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORzpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUE9MWUdPTjpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUkVDVEFOR0xFOlxuICAgICAgICBjb25zdCBwYXRoU3RyaW5nID0gcHJvamVjdGVkXG4gICAgICAgICAgLm1hcChwID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwWzBdfSwke3BbMV19YDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5qb2luKCdMJyk7XG4gICAgICAgIHJldHVybiBgTSAke3BhdGhTdHJpbmd9ICR7aXNDbG9zZWQgPyAneicgOiAnJ31gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldFNlbGVjdGVkRmVhdHVyZSA9ICgpID0+IHtcbiAgICBjb25zdCB7ZmVhdHVyZXMsIHNlbGVjdGVkRmVhdHVyZUlkfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIGZlYXR1cmVzICYmIGZlYXR1cmVzLmZpbmQoZiA9PiBmLmlkID09PSBzZWxlY3RlZEZlYXR1cmVJZCk7XG4gIH07XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChpbmRleCwgcmVuZGVyU3RhdGUpID0+IHtcbiAgICBjb25zdCB7bW9kZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtkcmFnZ2luZ1ZlcnRleEluZGV4LCBob3ZlcmVkVmVydGV4SW5kZXh9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID1cbiAgICAgIGluZGV4ID09PSBkcmFnZ2luZ1ZlcnRleEluZGV4IHx8XG4gICAgICAoc2VsZWN0ZWRGZWF0dXJlICYmIHNlbGVjdGVkRmVhdHVyZS5yZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5QT0lOVCk7XG4gICAgY29uc3QgaXNDbG9zaW5nID0gbW9kZSA9PT0gTU9ERVMuRFJBV19QT0xZR09OICYmIGhvdmVyZWRWZXJ0ZXhJbmRleCA9PT0gMCAmJiBpbmRleCA9PT0gLTE7XG5cbiAgICBpZiAocmVuZGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiByZW5kZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNDbG9zaW5nKSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkNMT1NJTkc7XG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuU0VMRUNURUQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgY2FzZSBob3ZlcmVkVmVydGV4SW5kZXg6XG4gICAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuSE9WRVJFRDtcbiAgICAgIGNhc2UgVU5DT01NSVRURURfSUQ6XG4gICAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuVU5DT01NSVRURUQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLklOQUNUSVZFO1xuICAgIH1cbiAgfTtcblxuICBfZ2V0RmVhdHVyZVJlbmRlclN0YXRlID0gKGlkLCByZW5kZXJTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgaG92ZXJlZEZlYXR1cmVJZH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICBjYXNlIHNlbGVjdGVkRmVhdHVyZUlkOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlNFTEVDVEVEO1xuICAgICAgY2FzZSBob3ZlcmVkRmVhdHVyZUlkOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICBjYXNlIFVOQ09NTUlUVEVEX0lEOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlVOQ09NTUlUVEVEO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5JTkFDVElWRTtcbiAgICB9XG4gIH07XG5cbiAgLyogUkVOREVSICovXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiAgX3JlbmRlclZlcnRleCA9IChwb3NpdGlvbiwgZmVhdHVyZUluZGV4LCB2ZXJ0ZXhJbmRleCwgb3BlcmF0aW9uLCBzdHlsZSwgc2hhcGUpID0+IHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG1heC1wYXJhbXMgKi9cbiAgICBjb25zdCBwID0gdGhpcy5fcHJvamVjdChwb3NpdGlvbik7XG4gICAgaWYgKCFwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7Y2xpY2tSYWRpdXN9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuVkVSVEVYfS4ke2ZlYXR1cmVJbmRleH0uJHt2ZXJ0ZXhJbmRleH0uJHtvcGVyYXRpb259YDtcbiAgICAvLyBmaXJzdCA8Y2lyY2xlfHJlY3Q+IGlzIHRvIG1ha2UgcGF0aCBlYXNpbHkgaW50ZXJhY3RlZCB3aXRoXG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BbMF19LCAke3BbMV19KWB9PlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5WRVJURVh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17dmVydGV4SW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtb3BlcmF0aW9uPXtvcGVyYXRpb259XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5zdHlsZSwgLi4uSElEREVOX0NMSUNLQUJMRV9TVFlMRSwgc3Ryb2tlOiAnbm9uZSd9fVxuICAgICAgICAgICAgICBjeD17MH1cbiAgICAgICAgICAgICAgY3k9ezB9XG4gICAgICAgICAgICAgIHI9e2NsaWNrUmFkaXVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuVkVSVEVYfVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS12ZXJ0ZXgtaW5kZXg9e3ZlcnRleEluZGV4fVxuICAgICAgICAgICAgICBkYXRhLW9wZXJhdGlvbj17b3BlcmF0aW9ufVxuICAgICAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgICAgY3g9ezB9XG4gICAgICAgICAgICAgIGN5PXswfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2B2ZXJ0ZXguJHt2ZXJ0ZXhJbmRleH1gfSB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHtwWzBdfSwgJHtwWzFdfSlgfT5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLlZFUlRFWH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtdmVydGV4LWluZGV4PXt2ZXJ0ZXhJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1vcGVyYXRpb249e29wZXJhdGlvbn1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICAgIC4uLkhJRERFTl9DTElDS0FCTEVfU1RZTEUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogY2xpY2tSYWRpdXNcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5WRVJURVh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17dmVydGV4SW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtb3BlcmF0aW9uPXtvcGVyYXRpb259XG4gICAgICAgICAgICAgIGtleT17ZWxlbUtleX1cbiAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyU2VnbWVudCA9IChmZWF0dXJlSW5kZXgsIHN0YXJ0VmVydGV4SWQsIHN0YXJ0UG9zLCBlbmRQb3MsIHN0eWxlID0ge30pID0+IHtcbiAgICBjb25zdCB7Y2xpY2tSYWRpdXN9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwcm9qZWN0ZWQgPSB0aGlzLl9nZXRQcm9qZWN0ZWREYXRhKFtzdGFydFBvcywgZW5kUG9zXSwgUkVOREVSX1RZUEUuTElORV9TVFJJTkcpO1xuICAgIGNvbnN0IHtyYWRpdXMsIC4uLm90aGVyc30gPSBzdHlsZTtcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuU0VHTUVOVH0uJHtmZWF0dXJlSW5kZXh9LiR7c3RhcnRWZXJ0ZXhJZH1gO1xuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLlNFR01FTlR9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgZGF0YS12ZXJ0ZXgtaW5kZXg9e3N0YXJ0VmVydGV4SWR9XG4gICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgIHN0eWxlPXt7Li4ub3RoZXJzLCBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMgfHwgcmFkaXVzLCBvcGFjaXR5OiAwfX1cbiAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuU0VHTUVOVH1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17c3RhcnRWZXJ0ZXhJZH1cbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgc3R5bGU9e290aGVyc31cbiAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyQ29tbWl0dGVkU3Ryb2tlID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZCwgcmVuZGVyVHlwZX0gPSBmZWF0dXJlO1xuICAgIGlmICghcG9pbnRzIHx8IHBvaW50cy5sZW5ndGggPCAyIHx8IChyZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5SRUNUQU5HTEUgJiYgIWlzQ2xvc2VkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIHNlZ21lbnRzLnB1c2godGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGksIHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSwgc3R5bGUpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDbG9zZWQpIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHBvaW50cy5sZW5ndGggLSAxO1xuICAgICAgc2VnbWVudHMucHVzaChcbiAgICAgICAgdGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGxhc3RJbmRleCwgcG9pbnRzW2xhc3RJbmRleF0sIHBvaW50c1swXSwgc3R5bGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiA8ZyBrZXk9XCJjb21taXR0ZWQgZ3JvdXBcIj57c2VnbWVudHN9PC9nPjtcbiAgfTtcblxuICBfcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZCwgcmVuZGVyVHlwZX0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNEcmF3aW5nID0gRFJBV0lOR19NT0RFUy5maW5kKG0gPT4gbSA9PT0gbW9kZSk7XG5cbiAgICBpZiAoIXBvaW50cyB8fCBpc0Nsb3NlZCB8fCAhaXNEcmF3aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB1bmNvbW1pdHRlZFNlZ21lbnRzID0gW107XG5cbiAgICBpZiAocmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUkVDVEFOR0xFKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdW5jb21taXR0ZWRTZWdtZW50cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX3JlbmRlclNlZ21lbnQoZmVhdHVyZUluZGV4LCBpLCBwb2ludHNbaV0sIHBvaW50c1tpICsgMV0sIHN0eWxlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgdW5jb21taXR0ZWRTZWdtZW50cy5wdXNoKHRoaXMuX3JlbmRlclNlZ21lbnQoZmVhdHVyZUluZGV4LCAzLCBwb2ludHNbM10sIHBvaW50c1swXSwgc3R5bGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXVuY29tbWl0dGVkTG5nTGF0KSB7XG4gICAgICByZXR1cm4gdW5jb21taXR0ZWRTZWdtZW50cy5sZW5ndGggPyB1bmNvbW1pdHRlZFNlZ21lbnRzIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbiAgICB1bmNvbW1pdHRlZFNlZ21lbnRzLnB1c2goXG4gICAgICB0aGlzLl9yZW5kZXJTZWdtZW50KFxuICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgIHBvaW50cy5sZW5ndGggLSAxLCAvLyBpZFxuICAgICAgICBwb2ludHMuc2xpY2UoLTEpWzBdLCAvLyBzdGFydFBvc1xuICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdCwgLy8gZW5kUG9zXG4gICAgICAgIHN0eWxlXG4gICAgICApXG4gICAgKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuXG4gICAgcmV0dXJuIHVuY29tbWl0dGVkU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pO1xuICB9O1xuXG4gIF9yZW5kZXJDbG9zaW5nU3Ryb2tlID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZH0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKHVuY29tbWl0dGVkTG5nTGF0ICYmIG1vZGUgPT09IE1PREVTLkRSQVdfUE9MWUdPTiAmJiBwb2ludHMubGVuZ3RoID4gMiAmJiAhaXNDbG9zZWQpIHtcbiAgICAgIC8vIGZyb20gdW5jb21taXR0ZWQgcG9zaXRpb24gdG8gdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBwb2x5Z29uXG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICAndW5jb21taXR0ZWQtY2xvc2UnLFxuICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdCxcbiAgICAgICAgcG9pbnRzWzBdLFxuICAgICAgICBzdHlsZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3JlbmRlckZpbGwgPSAoaW5kZXgsIGZlYXR1cmUsIHN0eWxlKSA9PiB7XG4gICAgY29uc3Qge21vZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpc0RyYXdpbmcgPSBEUkFXSU5HX01PREVTLmZpbmQobSA9PiBtID09PSBtb2RlKTtcbiAgICBjb25zdCB7cG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZH0gPSBmZWF0dXJlO1xuICAgIGlmIChyZW5kZXJUeXBlICE9PSBSRU5ERVJfVFlQRS5QT0xZR09OICYmIHJlbmRlclR5cGUgIT09IFJFTkRFUl9UWVBFLlJFQ1RBTkdMRSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG5cbiAgICBsZXQgZmlsbFBvaW50cyA9IHBvaW50cztcbiAgICBpZiAodW5jb21taXR0ZWRMbmdMYXQgJiYgaXNEcmF3aW5nKSB7XG4gICAgICBmaWxsUG9pbnRzID0gWy4uLnBvaW50cywgdW5jb21taXR0ZWRMbmdMYXRdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGxQYXRoID0gdGhpcy5fZ2V0UHJvamVjdGVkRGF0YShmaWxsUG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxwYXRoXG4gICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgIGtleT17YCR7RUxFTUVOVF9UWVBFLkZFQVRVUkV9LiR7aW5kZXh9LmZpbGxgfVxuICAgICAgICBzdHlsZT17ey4uLnN0eWxlLCBzdHJva2U6ICdub25lJ319XG4gICAgICAgIGQ9e2ZpbGxQYXRofVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJDdXJyZW50UGF0aCA9IChmZWF0dXJlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHtwb2ludHMsIHJlbmRlclR5cGV9ID0gZmVhdHVyZTtcbiAgICBpZiAoIXBvaW50cyB8fCAhcG9pbnRzLmxlbmd0aCB8fCByZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5QT0lOVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge2dldEZlYXR1cmVTdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGdlb0pzb24gPSBmZWF0dXJlLnRvRmVhdHVyZSgpO1xuICAgIGNvbnN0IGNvbW1pdHRlZFN0eWxlID0gZ2V0RmVhdHVyZVN0eWxlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogUkVOREVSX1NUQVRFLlNFTEVDVEVEfSk7XG4gICAgY29uc3QgdW5jb21taXR0ZWRTdHlsZSA9IGdldEZlYXR1cmVTdHlsZSh7ZmVhdHVyZTogZ2VvSnNvbiwgc3RhdGU6IFJFTkRFUl9TVEFURS5VTkNPTU1JVFRFRH0pO1xuICAgIGNvbnN0IGNsb3NpbmdTdHlsZSA9IGdldEZlYXR1cmVTdHlsZSh7ZmVhdHVyZTogZ2VvSnNvbiwgc3RhdGU6IFJFTkRFUl9TVEFURS5DTE9TSU5HfSk7XG5cbiAgICBjb25zdCBjb21taXR0ZWRTdHJva2UgPSB0aGlzLl9yZW5kZXJDb21taXR0ZWRTdHJva2UoaW5kZXgsIGZlYXR1cmUsIGNvbW1pdHRlZFN0eWxlKTtcbiAgICBjb25zdCB1bmNvbW1pdHRlZFN0cm9rZXMgPVxuICAgICAgdGhpcy5fcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzKGluZGV4LCBmZWF0dXJlLCB1bmNvbW1pdHRlZFN0eWxlKSB8fCBbXTtcbiAgICBjb25zdCBjbG9zaW5nU3Ryb2tlID0gdGhpcy5fcmVuZGVyQ2xvc2luZ1N0cm9rZShpbmRleCwgZmVhdHVyZSwgY2xvc2luZ1N0eWxlKTtcbiAgICBjb25zdCBmaWxsID0gdGhpcy5fcmVuZGVyRmlsbChpbmRleCwgZmVhdHVyZSwgdW5jb21taXR0ZWRTdHlsZSk7XG5cbiAgICByZXR1cm4gW2ZpbGwsIGNvbW1pdHRlZFN0cm9rZSwgLi4udW5jb21taXR0ZWRTdHJva2VzLCBjbG9zaW5nU3Ryb2tlXS5maWx0ZXIoQm9vbGVhbik7XG4gIH07XG5cbiAgX3JlbmRlckNvbW1pdHRlZFZlcnRpY2VzID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbikgPT4ge1xuICAgIGNvbnN0IHttb2RlLCBnZXRFZGl0SGFuZGxlU3R5bGUsIGdldEVkaXRIYW5kbGVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtpc0Nsb3NlZCwgcG9pbnRzfSA9IGZlYXR1cmU7XG5cbiAgICBjb25zdCBjb21taXR0ZWRWZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgbGV0IG9wZXJhdGlvbiA9IE9QRVJBVElPTlMuU0VUO1xuXG4gICAgICBjb25zdCBzdHlsZSA9IGdldEVkaXRIYW5kbGVTdHlsZSh7XG4gICAgICAgIGZlYXR1cmU6IGdlb0pzb24sXG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgICBzdGF0ZTogdGhpcy5fZ2V0RWRpdEhhbmRsZVN0YXRlKGkpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgdHlwZW9mIGdldEVkaXRIYW5kbGVTaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gZ2V0RWRpdEhhbmRsZVNoYXBlKHtcbiAgICAgICAgICAgICAgZmVhdHVyZTogZ2VvSnNvbixcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9nZXRFZGl0SGFuZGxlU3RhdGUoaSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBnZXRFZGl0SGFuZGxlU2hhcGU7XG5cbiAgICAgIGlmIChpc0Nsb3NlZCkge1xuICAgICAgICBjb21taXR0ZWRWZXJ0aWNlcy5wdXNoKHRoaXMuX3JlbmRlclZlcnRleChwLCBmZWF0dXJlSW5kZXgsIGksIG9wZXJhdGlvbiwgc3R5bGUsIHNoYXBlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZSA9PT0gTU9ERVMuRFJBV19QT0xZR09OICYmIGkgPT09IDAgJiYgcG9pbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBvcGVyYXRpb24gPSBPUEVSQVRJT05TLklOVEVSU0VDVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdHRlZFZlcnRpY2VzLnB1c2godGhpcy5fcmVuZGVyVmVydGV4KHAsIGZlYXR1cmVJbmRleCwgaSwgb3BlcmF0aW9uLCBzdHlsZSwgc2hhcGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWl0dGVkVmVydGljZXM7XG4gIH07XG5cbiAgX3JlbmRlclVuY29tbWl0dGVkVmVydGV4ID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbikgPT4ge1xuICAgIGNvbnN0IHtnZXRFZGl0SGFuZGxlU3R5bGUsIGdldEVkaXRIYW5kbGVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgdW5jb21taXR0ZWRMbmdMYXR9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7aWR9ID0gZmVhdHVyZTtcblxuICAgIGxldCB1bmNvbW1pdHRlZFZlcnRleCA9IG51bGw7XG4gICAgaWYgKHNlbGVjdGVkRmVhdHVyZUlkID09PSBpZCAmJiB1bmNvbW1pdHRlZExuZ0xhdCkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBnZXRFZGl0SGFuZGxlU3R5bGUoe1xuICAgICAgICBmZWF0dXJlOiBnZW9Kc29uLFxuICAgICAgICBpbmRleDogJ3VuY29tbWl0dGVkJyxcbiAgICAgICAgc3RhdGU6IHRoaXMuX2dldEVkaXRIYW5kbGVTdGF0ZSgtMSwgUkVOREVSX1NUQVRFLlVOQ09NTUlUVEVEKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgdHlwZW9mIGdldEVkaXRIYW5kbGVTaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gZ2V0RWRpdEhhbmRsZVNoYXBlKHtcbiAgICAgICAgICAgICAgZmVhdHVyZTogZ2VvSnNvbixcbiAgICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9nZXRFZGl0SGFuZGxlU3RhdGUoLTEpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogZ2V0RWRpdEhhbmRsZVNoYXBlO1xuXG4gICAgICB1bmNvbW1pdHRlZFZlcnRleCA9IHRoaXMuX3JlbmRlclZlcnRleChcbiAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQsXG4gICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgJ3VuY29tbWl0dGVkJyxcbiAgICAgICAgT1BFUkFUSU9OUy5JTlNFUlQsXG4gICAgICAgIHsuLi5zdHlsZSwgcG9pbnRlckV2ZW50czogJ25vbmUnfSxcbiAgICAgICAgc2hhcGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuY29tbWl0dGVkVmVydGV4O1xuICB9O1xuXG4gIF9yZW5kZXJDdXJyZW50VmVydGljZXMgPSAoZmVhdHVyZSwgZmVhdHVyZUluZGV4KSA9PiB7XG4gICAgY29uc3Qge3BvaW50c30gPSBmZWF0dXJlO1xuXG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGdlb0pzb24gPSBmZWF0dXJlLnRvRmVhdHVyZSgpO1xuICAgIGNvbnN0IGNvbW1pdHRlZFZlcnRpY2VzID0gdGhpcy5fcmVuZGVyQ29tbWl0dGVkVmVydGljZXMoZmVhdHVyZUluZGV4LCBmZWF0dXJlLCBnZW9Kc29uKTtcbiAgICBjb25zdCB1bmNvbW1pdHRlZFZlcnRleCA9IHRoaXMuX3JlbmRlclVuY29tbWl0dGVkVmVydGV4KGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbik7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PVwiZWRpdC1oYW5kbGVzXCI+XG4gICAgICAgIHtjb21taXR0ZWRWZXJ0aWNlc31cbiAgICAgICAge3VuY29tbWl0dGVkVmVydGV4fVxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlckN1cnJlbnQgPSAoKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZSgpO1xuXG4gICAgaWYgKCFmZWF0dXJlcyB8fCAhZmVhdHVyZSB8fCAhZmVhdHVyZS5wb2ludHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaW5kZXggPSBmZWF0dXJlcy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmZWF0dXJlLmlkKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Z1xuICAgICAgICBrZXk9XCJmZWF0dXJlIGN1cnJlbnRcIlxuICAgICAgICBzdHlsZT17bW9kZSA9PT0gTU9ERVMuUkVBRF9PTkxZIHx8IG1vZGUgPT09IE1PREVTLlNFTEVDVF9GRUFUVVJFID8gU1RBVElDX1NUWUxFIDogbnVsbH1cbiAgICAgID5cbiAgICAgICAge3RoaXMuX3JlbmRlckN1cnJlbnRQYXRoKGZlYXR1cmUsIGluZGV4KX1cbiAgICAgICAge3RoaXMuX3JlbmRlckN1cnJlbnRWZXJ0aWNlcyhmZWF0dXJlLCBpbmRleCl9XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZSA9IChmZWF0dXJlLCBpbmRleCkgPT4ge1xuICAgIGlmIChmZWF0dXJlID09PSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge2NsaWNrUmFkaXVzfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2lkLCBwb2ludHMsIHJlbmRlclR5cGUsIGlzQ2xvc2VkfSA9IGZlYXR1cmU7XG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMuX2dldFByb2plY3RlZERhdGEocG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCk7XG5cbiAgICBpZiAoIXByb2plY3RlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvSnNvbiA9IGZlYXR1cmUudG9GZWF0dXJlKCk7XG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSB0aGlzLl9nZXRGZWF0dXJlUmVuZGVyU3RhdGUoaWQpO1xuICAgIGNvbnN0IHtnZXRGZWF0dXJlU3R5bGUsIGdldEZlYXR1cmVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0RmVhdHVyZVN0eWxlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogcmVuZGVyU3RhdGV9KTtcbiAgICBjb25zdCBzaGFwZSA9XG4gICAgICB0eXBlb2YgZ2V0RmVhdHVyZVNoYXBlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gZ2V0RmVhdHVyZVNoYXBlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogcmVuZGVyU3RhdGV9KVxuICAgICAgICA6IGdldEZlYXR1cmVTaGFwZTtcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuRkVBVFVSRX0uJHtpbmRleH1gO1xuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICBpZiAoc2hhcGUgPT09ICdyZWN0Jykge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3Byb2plY3RlZFswXVswXX0sICR7cHJvamVjdGVkWzBdWzFdfSlgfT5cbiAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICAgIC4uLkhJRERFTl9DTElDS0FCTEVfU1RZTEUsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsaWNrUmFkaXVzXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3Byb2plY3RlZFswXVswXX0sICR7cHJvamVjdGVkWzBdWzFdfSlgfT5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY3g9ezB9XG4gICAgICAgICAgICAgIGN5PXswfVxuICAgICAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YGZlYXR1cmUuJHtpbmRleH1gfVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGN4PXswfVxuICAgICAgICAgICAgICBjeT17MH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICAvLyBmaXJzdCA8cGF0aD4gaXMgdG8gbWFrZSBwYXRoIGVhc2lseSBpbnRlcmFjdGVkIHdpdGhcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuTElORV9TVFJJTkc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGcga2V5PXtlbGVtS2V5fT5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGQ9e3Byb2plY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgIGNhc2UgJ1JlY3RhbmdsZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgZD17cHJvamVjdGVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZXMgPSAoKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIGZlYXR1cmVzICYmIGZlYXR1cmVzLm1hcCh0aGlzLl9yZW5kZXJGZWF0dXJlKTtcbiAgfTtcblxuICBfcmVuZGVyQ2FudmFzID0gKCkgPT4ge1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgZmVhdHVyZXN9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8c3ZnIGtleT1cImRyYXctY2FudmFzXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICB7ZmVhdHVyZXMgJiYgZmVhdHVyZXMubGVuZ3RoID4gMCAmJiA8ZyBrZXk9XCJmZWF0dXJlLWdyb3VwXCI+e3RoaXMuX3JlbmRlckZlYXR1cmVzKCl9PC9nPn1cbiAgICAgICAge3NlbGVjdGVkRmVhdHVyZUlkICYmIHRoaXMuX3JlbmRlckN1cnJlbnQoKX1cbiAgICAgIDwvc3ZnPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlckVkaXRvciA9ICgpID0+IHtcbiAgICBjb25zdCB2aWV3cG9ydCA9ICh0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQpIHx8IHt9O1xuICAgIGNvbnN0IHtzdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgaWQ9XCJlZGl0b3JcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAuLi5zdHlsZVxuICAgICAgICB9fVxuICAgICAgICByZWY9e18gPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclJlZiA9IF87XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHt0aGlzLl9yZW5kZXJDYW52YXMoKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8TWFwQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge2NvbnRleHQgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29udGV4dCAmJiBjb250ZXh0LnZpZXdwb3J0O1xuXG4gICAgICAgICAgaWYgKCF2aWV3cG9ydCB8fCB2aWV3cG9ydC5oZWlnaHQgPD0gMCB8fCB2aWV3cG9ydC53aWR0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRWRpdG9yKCk7XG4gICAgICAgIH19XG4gICAgICA8L01hcENvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsU0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBTUEsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBV0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBQStFLElBQUFRLFNBQUE7QUFBQSxTQUFBQyx5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