1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports["default"] = void 0;
|
7 |
|
8 | var _react = _interopRequireDefault(require("react"));
|
9 |
|
10 | var _constants = require("./constants");
|
11 |
|
12 | var _modeHandler = _interopRequireDefault(require("./mode-handler"));
|
13 |
|
14 | var _utils = require("./edit-modes/utils");
|
15 |
|
16 | var _style = require("./style");
|
17 |
|
18 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
19 |
|
20 | function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
21 |
|
22 | function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
23 |
|
24 | function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
25 |
|
26 | function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
|
27 |
|
28 | function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
|
29 |
|
30 | function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
31 |
|
32 | function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
33 |
|
34 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
35 |
|
36 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
37 |
|
38 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
39 |
|
40 | function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
41 |
|
42 | function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
43 |
|
44 | function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
45 |
|
46 | function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
47 |
|
48 | function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
49 |
|
50 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
51 |
|
52 | function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
53 |
|
54 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
55 |
|
56 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
57 |
|
58 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
59 |
|
60 | var defaultProps = _objectSpread({}, _modeHandler["default"].defaultProps, {
|
61 | clickRadius: 0,
|
62 | featureShape: 'circle',
|
63 | editHandleShape: 'rect',
|
64 | editHandleStyle: _style.editHandleStyle,
|
65 | featureStyle: _style.featureStyle
|
66 | });
|
67 |
|
68 | var Editor =
|
69 | /*#__PURE__*/
|
70 | function (_ModeHandler) {
|
71 | _inherits(Editor, _ModeHandler);
|
72 |
|
73 | function Editor() {
|
74 | var _getPrototypeOf2;
|
75 |
|
76 | var _this;
|
77 |
|
78 | _classCallCheck(this, Editor);
|
79 |
|
80 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
81 | args[_key] = arguments[_key];
|
82 | }
|
83 |
|
84 | _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Editor)).call.apply(_getPrototypeOf2, [this].concat(args)));
|
85 |
|
86 | _defineProperty(_assertThisInitialized(_this), "_getEditHandleState", function (editHandle, renderState) {
|
87 | var _this$state = _this.state,
|
88 | pointerDownPicks = _this$state.pointerDownPicks,
|
89 | hovered = _this$state.hovered;
|
90 |
|
91 | if (renderState) {
|
92 | return renderState;
|
93 | }
|
94 |
|
95 | var editHandleIndex = editHandle.properties.positionIndexes[0];
|
96 | var draggingEditHandleIndex = null;
|
97 | var pickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
|
98 |
|
99 | if (pickedObject && pickedObject.guideType === _constants.GUIDE_TYPE.EDIT_HANDLE) {
|
100 | draggingEditHandleIndex = pickedObject.index;
|
101 | }
|
102 |
|
103 | if (editHandleIndex === draggingEditHandleIndex) {
|
104 | return _constants.RENDER_STATE.SELECTED;
|
105 | }
|
106 |
|
107 | if (hovered && hovered.type === _constants.ELEMENT_TYPE.EDIT_HANDLE) {
|
108 | if (hovered.index === editHandleIndex) {
|
109 | return _constants.RENDER_STATE.HOVERED;
|
110 | } // cursor hovered on first vertex when drawing polygon
|
111 |
|
112 |
|
113 | if (hovered.index === 0 && editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
|
114 | return _constants.RENDER_STATE.CLOSING;
|
115 | }
|
116 | }
|
117 |
|
118 | return _constants.RENDER_STATE.INACTIVE;
|
119 | });
|
120 |
|
121 | _defineProperty(_assertThisInitialized(_this), "_getFeatureRenderState", function (index, renderState) {
|
122 | var hovered = _this.state.hovered;
|
123 |
|
124 | var selectedFeatureIndex = _this._getSelectedFeatureIndex();
|
125 |
|
126 | if (renderState) {
|
127 | return renderState;
|
128 | }
|
129 |
|
130 | if (index === selectedFeatureIndex) {
|
131 | return _constants.RENDER_STATE.SELECTED;
|
132 | }
|
133 |
|
134 | if (hovered && hovered.type === _constants.ELEMENT_TYPE.FEATURE && hovered.featureIndex === index) {
|
135 | return _constants.RENDER_STATE.HOVERED;
|
136 | }
|
137 |
|
138 | return _constants.RENDER_STATE.INACTIVE;
|
139 | });
|
140 |
|
141 | _defineProperty(_assertThisInitialized(_this), "_getStyleProp", function (styleProp, params) {
|
142 | return typeof styleProp === 'function' ? styleProp(params) : styleProp;
|
143 | });
|
144 |
|
145 | _defineProperty(_assertThisInitialized(_this), "_renderEditHandle", function (editHandle, feature) {
|
146 | /* eslint-enable max-params */
|
147 | var coordinates = (0, _utils.getFeatureCoordinates)(editHandle);
|
148 |
|
149 | var p = _this.project(coordinates && coordinates[0]);
|
150 |
|
151 | if (!p) {
|
152 | return null;
|
153 | }
|
154 |
|
155 | var _editHandle$propertie = editHandle.properties,
|
156 | featureIndex = _editHandle$propertie.featureIndex,
|
157 | positionIndexes = _editHandle$propertie.positionIndexes;
|
158 | var _this$props = _this.props,
|
159 | clickRadius = _this$props.clickRadius,
|
160 | editHandleShape = _this$props.editHandleShape,
|
161 | editHandleStyle = _this$props.editHandleStyle;
|
162 | var index = positionIndexes[0];
|
163 |
|
164 | var shape = _this._getStyleProp(editHandleShape, {
|
165 | feature: feature || editHandle,
|
166 | index: index,
|
167 | featureIndex: featureIndex,
|
168 | state: _this._getEditHandleState(editHandle)
|
169 | });
|
170 |
|
171 | var style = _this._getStyleProp(editHandleStyle, {
|
172 | feature: feature || editHandle,
|
173 | index: index,
|
174 | featureIndex: featureIndex,
|
175 | shape: shape,
|
176 | state: _this._getEditHandleState(editHandle)
|
177 | }); // disable events for cursor editHandle
|
178 |
|
179 |
|
180 | if (editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
|
181 | style = _objectSpread({}, style, {
|
182 | // disable pointer events for cursor
|
183 | pointerEvents: 'none'
|
184 | });
|
185 | }
|
186 |
|
187 | var elemKey = "".concat(_constants.ELEMENT_TYPE.EDIT_HANDLE, ".").concat(featureIndex, ".").concat(index); // first <circle|rect> is to make path easily interacted with
|
188 |
|
189 | switch (shape) {
|
190 | case 'circle':
|
191 | return _react["default"].createElement("g", {
|
192 | key: elemKey,
|
193 | transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
|
194 | }, _react["default"].createElement("circle", {
|
195 | "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
|
196 | "data-index": index,
|
197 | "data-feature-index": featureIndex,
|
198 | key: "".concat(elemKey, ".hidden"),
|
199 | style: _objectSpread({}, style, {
|
200 | stroke: 'none',
|
201 | fill: '#000',
|
202 | fillOpacity: 0
|
203 | }),
|
204 | cx: 0,
|
205 | cy: 0,
|
206 | r: clickRadius
|
207 | }), _react["default"].createElement("circle", {
|
208 | "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
|
209 | "data-index": index,
|
210 | "data-feature-index": featureIndex,
|
211 | key: elemKey,
|
212 | style: style,
|
213 | cx: 0,
|
214 | cy: 0
|
215 | }));
|
216 |
|
217 | case 'rect':
|
218 | return _react["default"].createElement("g", {
|
219 | key: elemKey,
|
220 | transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
|
221 | }, _react["default"].createElement("rect", {
|
222 | "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
|
223 | "data-index": index,
|
224 | "data-feature-index": featureIndex,
|
225 | key: "".concat(elemKey, ".hidden"),
|
226 | style: _objectSpread({}, style, {
|
227 | height: clickRadius,
|
228 | width: clickRadius,
|
229 | fill: '#000',
|
230 | fillOpacity: 0
|
231 | }),
|
232 | r: clickRadius
|
233 | }), _react["default"].createElement("rect", {
|
234 | "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
|
235 | "data-index": index,
|
236 | "data-feature-index": featureIndex,
|
237 | key: "".concat(elemKey),
|
238 | style: style
|
239 | }));
|
240 |
|
241 | default:
|
242 | return null;
|
243 | }
|
244 | });
|
245 |
|
246 | _defineProperty(_assertThisInitialized(_this), "_renderSegment", function (featureIndex, index, coordinates, style) {
|
247 | var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.LINE_STRING);
|
248 |
|
249 | var radius = style.radius,
|
250 | others = _objectWithoutProperties(style, ["radius"]);
|
251 |
|
252 | var clickRadius = _this.props.clickRadius;
|
253 | var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(index);
|
254 | return _react["default"].createElement("g", {
|
255 | key: elemKey
|
256 | }, _react["default"].createElement("path", {
|
257 | key: "".concat(elemKey, ".hidden"),
|
258 | "data-type": _constants.ELEMENT_TYPE.SEGMENT,
|
259 | "data-index": index,
|
260 | "data-feature-index": featureIndex,
|
261 | style: _objectSpread({}, others, {
|
262 | strokeWidth: clickRadius || radius,
|
263 | opacity: 0
|
264 | }),
|
265 | d: path
|
266 | }), _react["default"].createElement("path", {
|
267 | key: elemKey,
|
268 | "data-type": _constants.ELEMENT_TYPE.SEGMENT,
|
269 | "data-index": index,
|
270 | "data-feature-index": featureIndex,
|
271 | style: others,
|
272 | d: path
|
273 | }));
|
274 | });
|
275 |
|
276 | _defineProperty(_assertThisInitialized(_this), "_renderSegments", function (featureIndex, coordinates, style) {
|
277 | var segments = [];
|
278 |
|
279 | for (var i = 0; i < coordinates.length - 1; i++) {
|
280 | segments.push(_this._renderSegment(featureIndex, i, [coordinates[i], coordinates[i + 1]], style));
|
281 | }
|
282 |
|
283 | return segments;
|
284 | });
|
285 |
|
286 | _defineProperty(_assertThisInitialized(_this), "_renderFill", function (featureIndex, coordinates, style) {
|
287 | var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.POLYGON);
|
288 |
|
289 | return _react["default"].createElement("path", {
|
290 | key: "".concat(_constants.ELEMENT_TYPE.FILL, ".").concat(featureIndex),
|
291 | "data-type": _constants.ELEMENT_TYPE.FILL,
|
292 | "data-feature-index": featureIndex,
|
293 | style: _objectSpread({}, style, {
|
294 | stroke: 'none'
|
295 | }),
|
296 | d: path
|
297 | });
|
298 | });
|
299 |
|
300 | _defineProperty(_assertThisInitialized(_this), "_renderTentativeFeature", function (feature, cursorEditHandle) {
|
301 | var featureStyle = _this.props.featureStyle;
|
302 | var coordinates = feature.geometry.coordinates,
|
303 | renderType = feature.properties.renderType;
|
304 |
|
305 | if (!coordinates || coordinates.length < 2) {
|
306 | return null;
|
307 | } // >= 2 coordinates
|
308 |
|
309 |
|
310 | var firstCoords = coordinates[0];
|
311 | var lastCoords = coordinates[coordinates.length - 1];
|
312 |
|
313 | var uncommittedStyle = _this._getStyleProp(featureStyle, {
|
314 | feature: feature,
|
315 | index: null,
|
316 | state: _constants.RENDER_STATE.UNCOMMITTED
|
317 | });
|
318 |
|
319 | var committedPath;
|
320 | var uncommittedPath;
|
321 | var closingPath;
|
322 |
|
323 | var fill = _this._renderFill('tentative', coordinates, uncommittedStyle);
|
324 |
|
325 | switch (renderType) {
|
326 | case _constants.RENDER_TYPE.LINE_STRING:
|
327 | case _constants.RENDER_TYPE.POLYGON:
|
328 | var committedStyle = _this._getStyleProp(featureStyle, {
|
329 | feature: feature,
|
330 | state: _constants.RENDER_STATE.SELECTED
|
331 | });
|
332 |
|
333 | if (cursorEditHandle) {
|
334 | var cursorCoords = coordinates[coordinates.length - 2];
|
335 | committedPath = _this._renderSegments('tentative', coordinates.slice(0, coordinates.length - 1), committedStyle);
|
336 | uncommittedPath = _this._renderSegment('tentative-uncommitted', coordinates.length - 2, [cursorCoords, lastCoords], uncommittedStyle);
|
337 | } else {
|
338 | committedPath = _this._renderSegments('tentative', coordinates, committedStyle);
|
339 | }
|
340 |
|
341 | if (renderType === _constants.RENDER_TYPE.POLYGON) {
|
342 | var closingStyle = _this._getStyleProp(featureStyle, {
|
343 | feature: feature,
|
344 | index: null,
|
345 | state: _constants.RENDER_STATE.CLOSING
|
346 | });
|
347 |
|
348 | closingPath = _this._renderSegment('tentative-closing', coordinates.length - 1, [lastCoords, firstCoords], closingStyle);
|
349 | }
|
350 |
|
351 | break;
|
352 |
|
353 | case _constants.RENDER_TYPE.RECTANGLE:
|
354 | uncommittedPath = _this._renderSegments('tentative', [].concat(_toConsumableArray(coordinates), [firstCoords]), uncommittedStyle);
|
355 | break;
|
356 |
|
357 | default:
|
358 | }
|
359 |
|
360 | return [fill, committedPath, uncommittedPath, closingPath].filter(Boolean);
|
361 | });
|
362 |
|
363 | _defineProperty(_assertThisInitialized(_this), "_renderGuides", function (_ref) {
|
364 | var tentativeFeature = _ref.tentativeFeature,
|
365 | editHandles = _ref.editHandles;
|
366 |
|
367 | var features = _this.getFeatures();
|
368 |
|
369 | var cursorEditHandle = editHandles.find(function (f) {
|
370 | return f.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE;
|
371 | });
|
372 | return _react["default"].createElement("g", {
|
373 | key: "feature-guides"
|
374 | }, tentativeFeature && _this._renderTentativeFeature(tentativeFeature, cursorEditHandle), editHandles && editHandles.map(function (editHandle) {
|
375 | var feature = features && features[editHandle.properties.featureIndex] || tentativeFeature;
|
376 | return _this._renderEditHandle(editHandle, feature);
|
377 | }));
|
378 | });
|
379 |
|
380 | _defineProperty(_assertThisInitialized(_this), "_renderPoint", function (feature, index, path) {
|
381 | var renderState = _this._getFeatureRenderState(index);
|
382 |
|
383 | var _this$props2 = _this.props,
|
384 | featureStyle = _this$props2.featureStyle,
|
385 | featureShape = _this$props2.featureShape,
|
386 | clickRadius = _this$props2.clickRadius;
|
387 |
|
388 | var shape = _this._getStyleProp(featureShape, {
|
389 | feature: feature,
|
390 | index: index,
|
391 | state: renderState
|
392 | });
|
393 |
|
394 | var style = _this._getStyleProp(featureStyle, {
|
395 | feature: feature,
|
396 | index: index,
|
397 | state: renderState
|
398 | });
|
399 |
|
400 | var elemKey = "feature.".concat(index);
|
401 |
|
402 | if (shape === 'rect') {
|
403 | return _react["default"].createElement("g", {
|
404 | key: elemKey,
|
405 | transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
|
406 | }, _react["default"].createElement("rect", {
|
407 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
408 | "data-feature-index": index,
|
409 | key: "".concat(elemKey, ".hidden"),
|
410 | style: _objectSpread({}, style, {
|
411 | width: clickRadius,
|
412 | height: clickRadius,
|
413 | fill: '#000',
|
414 | fillOpacity: 0
|
415 | })
|
416 | }), _react["default"].createElement("rect", {
|
417 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
418 | "data-feature-index": index,
|
419 | key: elemKey,
|
420 | style: style
|
421 | }));
|
422 | }
|
423 |
|
424 | return _react["default"].createElement("g", {
|
425 | key: "feature.".concat(index),
|
426 | transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
|
427 | }, _react["default"].createElement("circle", {
|
428 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
429 | "data-feature-index": index,
|
430 | key: "".concat(elemKey, ".hidden"),
|
431 | style: _objectSpread({}, style, {
|
432 | opacity: 0
|
433 | }),
|
434 | cx: 0,
|
435 | cy: 0,
|
436 | r: clickRadius
|
437 | }), _react["default"].createElement("circle", {
|
438 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
439 | "data-feature-index": index,
|
440 | key: elemKey,
|
441 | style: style,
|
442 | cx: 0,
|
443 | cy: 0
|
444 | }));
|
445 | });
|
446 |
|
447 | _defineProperty(_assertThisInitialized(_this), "_renderPath", function (feature, index, path) {
|
448 | var _this$props3 = _this.props,
|
449 | featureStyle = _this$props3.featureStyle,
|
450 | clickRadius = _this$props3.clickRadius;
|
451 |
|
452 | var selectedFeatureIndex = _this._getSelectedFeatureIndex();
|
453 |
|
454 | var selected = index === selectedFeatureIndex;
|
455 |
|
456 | var renderState = _this._getFeatureRenderState(index);
|
457 |
|
458 | var style = _this._getStyleProp(featureStyle, {
|
459 | feature: feature,
|
460 | index: index,
|
461 | state: renderState
|
462 | });
|
463 |
|
464 | var elemKey = "feature.".concat(index);
|
465 |
|
466 | if (selected) {
|
467 | return _react["default"].createElement("g", {
|
468 | key: elemKey
|
469 | }, _this._renderSegments(index, feature.geometry.coordinates, style));
|
470 | } // first <path> is to make path easily interacted with
|
471 |
|
472 |
|
473 | return _react["default"].createElement("g", {
|
474 | key: elemKey
|
475 | }, _react["default"].createElement("path", {
|
476 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
477 | "data-feature-index": index,
|
478 | key: "".concat(elemKey, ".hidden"),
|
479 | style: _objectSpread({}, style, {
|
480 | strokeWidth: clickRadius,
|
481 | opacity: 0
|
482 | }),
|
483 | d: path
|
484 | }), _react["default"].createElement("path", {
|
485 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
486 | "data-feature-index": index,
|
487 | key: elemKey,
|
488 | style: style,
|
489 | d: path
|
490 | }));
|
491 | });
|
492 |
|
493 | _defineProperty(_assertThisInitialized(_this), "_renderPolygon", function (feature, index, path) {
|
494 | var featureStyle = _this.props.featureStyle;
|
495 |
|
496 | var selectedFeatureIndex = _this._getSelectedFeatureIndex();
|
497 |
|
498 | var selected = index === selectedFeatureIndex;
|
499 |
|
500 | var renderState = _this._getFeatureRenderState(index);
|
501 |
|
502 | var style = _this._getStyleProp(featureStyle, {
|
503 | feature: feature,
|
504 | index: index,
|
505 | state: renderState
|
506 | });
|
507 |
|
508 | var elemKey = "feature.".concat(index);
|
509 |
|
510 | if (selected) {
|
511 | var coordinates = (0, _utils.getFeatureCoordinates)(feature);
|
512 |
|
513 | if (!coordinates) {
|
514 | return null;
|
515 | }
|
516 |
|
517 | return _react["default"].createElement("g", {
|
518 | key: elemKey
|
519 | }, _this._renderFill(index, coordinates, style), _this._renderSegments(index, coordinates, style));
|
520 | }
|
521 |
|
522 | return _react["default"].createElement("path", {
|
523 | "data-type": _constants.ELEMENT_TYPE.FEATURE,
|
524 | "data-feature-index": index,
|
525 | key: elemKey,
|
526 | style: style,
|
527 | d: path
|
528 | });
|
529 | });
|
530 |
|
531 | _defineProperty(_assertThisInitialized(_this), "_renderFeature", function (feature, index) {
|
532 | var coordinates = (0, _utils.getFeatureCoordinates)(feature);
|
533 |
|
534 | if (!coordinates || !coordinates.length) {
|
535 | return null;
|
536 | }
|
537 |
|
538 | var renderType = feature.properties.renderType,
|
539 | type = feature.geometry.type;
|
540 |
|
541 | var path = _this._getPathInScreenCoords(coordinates, type);
|
542 |
|
543 | if (!path) {
|
544 | return null;
|
545 | }
|
546 |
|
547 | switch (renderType) {
|
548 | case _constants.RENDER_TYPE.POINT:
|
549 | return _this._renderPoint(feature, index, path);
|
550 |
|
551 | case _constants.RENDER_TYPE.LINE_STRING:
|
552 | return _this._renderPath(feature, index, path);
|
553 |
|
554 | case _constants.RENDER_TYPE.POLYGON:
|
555 | case _constants.RENDER_TYPE.RECTANGLE:
|
556 | return _this._renderPolygon(feature, index, path);
|
557 |
|
558 | default:
|
559 | return null;
|
560 | }
|
561 | });
|
562 |
|
563 | _defineProperty(_assertThisInitialized(_this), "_renderCanvas", function () {
|
564 | var features = _this.getFeatures();
|
565 |
|
566 | var guides = _this._modeHandler && _this._modeHandler.getGuides(_this.getModeProps());
|
567 |
|
568 | return _react["default"].createElement("svg", {
|
569 | key: "draw-canvas",
|
570 | width: "100%",
|
571 | height: "100%"
|
572 | }, features && features.length > 0 && _react["default"].createElement("g", {
|
573 | key: "feature-group"
|
574 | }, features.map(_this._renderFeature)), guides && _react["default"].createElement("g", {
|
575 | key: "feature-guides"
|
576 | }, _this._renderGuides(guides)));
|
577 | });
|
578 |
|
579 | _defineProperty(_assertThisInitialized(_this), "_renderEditor", function () {
|
580 | if (!_this._context) return null;
|
581 | var viewport = _this._context && _this._context.viewport || {};
|
582 | var style = _this.props.style;
|
583 | var width = viewport.width,
|
584 | height = viewport.height;
|
585 | return _react["default"].createElement("div", {
|
586 | id: "editor",
|
587 | style: _objectSpread({
|
588 | width: width,
|
589 | height: height
|
590 | }, style),
|
591 | ref: function ref(_) {
|
592 | _this._containerRef = _;
|
593 | }
|
594 | }, _this._renderCanvas());
|
595 | });
|
596 |
|
597 | return _this;
|
598 | }
|
599 |
|
600 | _createClass(Editor, [{
|
601 | key: "_getPathInScreenCoords",
|
602 |
|
603 | /* HELPERS */
|
604 | value: function _getPathInScreenCoords(coordinates, type) {
|
605 | var _this2 = this;
|
606 |
|
607 | if (coordinates.length === 0) {
|
608 | return '';
|
609 | }
|
610 |
|
611 | var screenCoords = coordinates.map(function (p) {
|
612 | return _this2.project(p);
|
613 | });
|
614 | var pathString = '';
|
615 |
|
616 | switch (type) {
|
617 | case _constants.GEOJSON_TYPE.POINT:
|
618 | return screenCoords;
|
619 |
|
620 | case _constants.GEOJSON_TYPE.LINE_STRING:
|
621 | pathString = screenCoords.map(function (p) {
|
622 | return "".concat(p[0], ",").concat(p[1]);
|
623 | }).join('L');
|
624 | return "M ".concat(pathString);
|
625 |
|
626 | case _constants.GEOJSON_TYPE.POLYGON:
|
627 | pathString = screenCoords.map(function (p) {
|
628 | return "".concat(p[0], ",").concat(p[1]);
|
629 | }).join('L');
|
630 | return "M ".concat(pathString, " z");
|
631 |
|
632 | default:
|
633 | return null;
|
634 | }
|
635 | }
|
636 | }, {
|
637 | key: "render",
|
638 | value: function render() {
|
639 | return _get(_getPrototypeOf(Editor.prototype), "render", this).call(this, this._renderEditor());
|
640 | }
|
641 | }]);
|
642 |
|
643 | return Editor;
|
644 | }(_modeHandler["default"]);
|
645 |
|
646 | exports["default"] = Editor;
|
647 |
|
648 | _defineProperty(Editor, "defaultProps", defaultProps);
|
649 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanMiXSwibmFtZXMiOlsiZGVmYXVsdFByb3BzIiwiTW9kZUhhbmRsZXIiLCJjbGlja1JhZGl1cyIsImZlYXR1cmVTaGFwZSIsImVkaXRIYW5kbGVTaGFwZSIsImVkaXRIYW5kbGVTdHlsZSIsImRlZmF1bHRFZGl0SGFuZGxlU3R5bGUiLCJmZWF0dXJlU3R5bGUiLCJkZWZhdWx0RmVhdHVyZVN0eWxlIiwiRWRpdG9yIiwiZWRpdEhhbmRsZSIsInJlbmRlclN0YXRlIiwic3RhdGUiLCJwb2ludGVyRG93blBpY2tzIiwiaG92ZXJlZCIsImVkaXRIYW5kbGVJbmRleCIsInByb3BlcnRpZXMiLCJwb3NpdGlvbkluZGV4ZXMiLCJkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCIsInBpY2tlZE9iamVjdCIsIm9iamVjdCIsImd1aWRlVHlwZSIsIkdVSURFX1RZUEUiLCJFRElUX0hBTkRMRSIsImluZGV4IiwiUkVOREVSX1NUQVRFIiwiU0VMRUNURUQiLCJ0eXBlIiwiRUxFTUVOVF9UWVBFIiwiSE9WRVJFRCIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIkNMT1NJTkciLCJJTkFDVElWRSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiRkVBVFVSRSIsImZlYXR1cmVJbmRleCIsInN0eWxlUHJvcCIsInBhcmFtcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsInAiLCJwcm9qZWN0IiwicHJvcHMiLCJzaGFwZSIsIl9nZXRTdHlsZVByb3AiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwiZWxlbUtleSIsInN0cm9rZSIsImZpbGwiLCJmaWxsT3BhY2l0eSIsImhlaWdodCIsIndpZHRoIiwicGF0aCIsIl9nZXRQYXRoSW5TY3JlZW5Db29yZHMiLCJHRU9KU09OX1RZUEUiLCJMSU5FX1NUUklORyIsInJhZGl1cyIsIm90aGVycyIsIlNFR01FTlQiLCJzdHJva2VXaWR0aCIsIm9wYWNpdHkiLCJzZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiX3JlbmRlclNlZ21lbnQiLCJQT0xZR09OIiwiRklMTCIsImN1cnNvckVkaXRIYW5kbGUiLCJnZW9tZXRyeSIsInJlbmRlclR5cGUiLCJmaXJzdENvb3JkcyIsImxhc3RDb29yZHMiLCJ1bmNvbW1pdHRlZFN0eWxlIiwiVU5DT01NSVRURUQiLCJjb21taXR0ZWRQYXRoIiwidW5jb21taXR0ZWRQYXRoIiwiY2xvc2luZ1BhdGgiLCJfcmVuZGVyRmlsbCIsIlJFTkRFUl9UWVBFIiwiY29tbWl0dGVkU3R5bGUiLCJjdXJzb3JDb29yZHMiLCJfcmVuZGVyU2VnbWVudHMiLCJzbGljZSIsImNsb3NpbmdTdHlsZSIsIlJFQ1RBTkdMRSIsImZpbHRlciIsIkJvb2xlYW4iLCJ0ZW50YXRpdmVGZWF0dXJlIiwiZWRpdEhhbmRsZXMiLCJmZWF0dXJlcyIsImdldEZlYXR1cmVzIiwiZmluZCIsImYiLCJfcmVuZGVyVGVudGF0aXZlRmVhdHVyZSIsIm1hcCIsIl9yZW5kZXJFZGl0SGFuZGxlIiwiX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSIsInNlbGVjdGVkIiwiUE9JTlQiLCJfcmVuZGVyUG9pbnQiLCJfcmVuZGVyUGF0aCIsIl9yZW5kZXJQb2x5Z29uIiwiZ3VpZGVzIiwiX21vZGVIYW5kbGVyIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwiX3JlbmRlckZlYXR1cmUiLCJfcmVuZGVyR3VpZGVzIiwiX2NvbnRleHQiLCJ2aWV3cG9ydCIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsInNjcmVlbkNvb3JkcyIsInBhdGhTdHJpbmciLCJqb2luIiwiX3JlbmRlckVkaXRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLElBQU1BLFlBQVkscUJBQ2JDLHdCQUFZRCxZQURDO0FBRWhCRSxFQUFB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QUEsT0FBakIsQ0FBckI7QUFFQSxVQUFJNkUsVUFBVSxHQUFHLEVBQWpCOztBQUNBLGNBQVEzRixJQUFSO0FBQ0UsYUFBSzhCLHdCQUFhNkMsS0FBbEI7QUFDRSxpQkFBT2UsWUFBUDs7QUFFRixhQUFLNUQsd0JBQWFDLFdBQWxCO0FBQ0U0RCxVQUFBQSxVQUFVLEdBQUdELFlBQVksQ0FBQ25CLEdBQWIsQ0FBaUIsVUFBQXpELENBQUM7QUFBQSw2QkFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBUixjQUFlQSxDQUFDLENBQUMsQ0FBRCxDQUFoQjtBQUFBLFdBQWxCLEVBQXlDOEUsSUFBekMsQ0FBOEMsR0FBOUMsQ0FBYjtBQUNBLDZCQUFZRCxVQUFaOztBQUVGLGFBQUs3RCx3QkFBYVksT0FBbEI7QUFDRWlELFVBQUFBLFVBQVUsR0FBR0QsWUFBWSxDQUFDbkIsR0FBYixDQUFpQixVQUFBekQsQ0FBQztBQUFBLDZCQUFPQSxDQUFDLENBQUMsQ0FBRCxDQUFSLGNBQWVBLENBQUMsQ0FBQyxDQUFELENBQWhCO0FBQUEsV0FBbEIsRUFBeUM4RSxJQUF6QyxDQUE4QyxHQUE5QyxDQUFiO0FBQ0EsNkJBQVlELFVBQVo7O0FBRUY7QUFDRSxpQkFBTyxJQUFQO0FBYko7QUFlRDs7OzZCQTZmUTtBQUNQLGdGQUFvQixLQUFLRSxhQUFMLEVBQXBCO0FBQ0Q7Ozs7RUExaEJpQ3ZILHVCOzs7O2dCQUFmUSxNLGtCQUNHVCxZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgR2VvSnNvblR5cGUsIFJlbmRlclN0YXRlLCBJZCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBSRU5ERVJfU1RBVEUsIFJFTkRFUl9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUsIEVMRU1FTlRfVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBNb2RlSGFuZGxlciBmcm9tICcuL21vZGUtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMgfSBmcm9tICcuL2VkaXQtbW9kZXMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBlZGl0SGFuZGxlU3R5bGUgYXMgZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlIGFzIGRlZmF1bHRGZWF0dXJlU3R5bGVcbn0gZnJvbSAnLi9zdHlsZSc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uTW9kZUhhbmRsZXIuZGVmYXVsdFByb3BzLFxuICBjbGlja1JhZGl1czogMCxcbiAgZmVhdHVyZVNoYXBlOiAnY2lyY2xlJyxcbiAgZWRpdEhhbmRsZVNoYXBlOiAncmVjdCcsXG4gIGVkaXRIYW5kbGVTdHlsZTogZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlOiBkZWZhdWx0RmVhdHVyZVN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBNb2RlSGFuZGxlciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgLyogSEVMUEVSUyAqL1xuICBfZ2V0UGF0aEluU2NyZWVuQ29vcmRzKGNvb3JkaW5hdGVzOiBhbnksIHR5cGU6IEdlb0pzb25UeXBlKSB7XG4gICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcmVlbkNvb3JkcyA9IGNvb3JkaW5hdGVzLm1hcChwID0+IHRoaXMucHJvamVjdChwKSk7XG5cbiAgICBsZXQgcGF0aFN0cmluZyA9ICcnO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBHRU9KU09OX1RZUEUuUE9JTlQ6XG4gICAgICAgIHJldHVybiBzY3JlZW5Db29yZHM7XG5cbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HOlxuICAgICAgICBwYXRoU3RyaW5nID0gc2NyZWVuQ29vcmRzLm1hcChwID0+IGAke3BbMF19LCR7cFsxXX1gKS5qb2luKCdMJyk7XG4gICAgICAgIHJldHVybiBgTSAke3BhdGhTdHJpbmd9YDtcblxuICAgICAgY2FzZSBHRU9KU09OX1RZUEUuUE9MWUdPTjpcbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfSB6YDtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChlZGl0SGFuZGxlOiBGZWF0dXJlLCByZW5kZXJTdGF0ZTogP3N0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlckRvd25QaWNrcywgaG92ZXJlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGVkaXRIYW5kbGUucHJvcGVydGllcy5wb3NpdGlvbkluZGV4ZXNbMF07XG4gICAgbGV0IGRyYWdnaW5nRWRpdEhhbmRsZUluZGV4ID0gbnVsbDtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBwb2ludGVyRG93blBpY2tzICYmIHBvaW50ZXJEb3duUGlja3NbMF0gJiYgcG9pbnRlckRvd25QaWNrc1swXS5vYmplY3Q7XG4gICAgaWYgKHBpY2tlZE9iamVjdCAmJiBwaWNrZWRPYmplY3QuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkVESVRfSEFORExFKSB7XG4gICAgICBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCA9IHBpY2tlZE9iamVjdC5pbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEhhbmRsZUluZGV4ID09PSBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5TRUxFQ1RFRDtcbiAgICB9XG5cbiAgICBpZiAoaG92ZXJlZCAmJiBob3ZlcmVkLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5FRElUX0hBTkRMRSkge1xuICAgICAgaWYgKGhvdmVyZWQuaW5kZXggPT09IGVkaXRIYW5kbGVJbmRleCkge1xuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1cnNvciBob3ZlcmVkIG9uIGZpcnN0IHZlcnRleCB3aGVuIGRyYXdpbmcgcG9seWdvblxuICAgICAgaWYgKFxuICAgICAgICBob3ZlcmVkLmluZGV4ID09PSAwICYmXG4gICAgICAgIGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5DTE9TSU5HO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSRU5ERVJfU1RBVEUuSU5BQ1RJVkU7XG4gIH07XG5cbiAgX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSA9IChpbmRleDogbnVtYmVyLCByZW5kZXJTdGF0ZTogP1JlbmRlclN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBob3ZlcmVkIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBpZiAocmVuZGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiByZW5kZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHNlbGVjdGVkRmVhdHVyZUluZGV4KSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlNFTEVDVEVEO1xuICAgIH1cblxuICAgIGlmIChob3ZlcmVkICYmIGhvdmVyZWQudHlwZSA9PT0gRUxFTUVOVF9UWVBFLkZFQVRVUkUgJiYgaG92ZXJlZC5mZWF0dXJlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJFTkRFUl9TVEFURS5JTkFDVElWRTtcbiAgfTtcblxuICBfZ2V0U3R5bGVQcm9wID0gKHN0eWxlUHJvcDogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygc3R5bGVQcm9wID09PSAnZnVuY3Rpb24nID8gc3R5bGVQcm9wKHBhcmFtcykgOiBzdHlsZVByb3A7XG4gIH07XG5cbiAgLyogUkVOREVSICovXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiAgX3JlbmRlckVkaXRIYW5kbGUgPSAoZWRpdEhhbmRsZTogRmVhdHVyZSwgZmVhdHVyZTogRmVhdHVyZSkgPT4ge1xuICAgIC8qIGVzbGludC1lbmFibGUgbWF4LXBhcmFtcyAqL1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGVkaXRIYW5kbGUpO1xuICAgIGNvbnN0IHAgPSB0aGlzLnByb2plY3QoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXNbMF0pO1xuICAgIGlmICghcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydGllczogeyBmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcyB9XG4gICAgfSA9IGVkaXRIYW5kbGU7XG4gICAgY29uc3QgeyBjbGlja1JhZGl1cywgZWRpdEhhbmRsZVNoYXBlLCBlZGl0SGFuZGxlU3R5bGUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBpbmRleCA9IHBvc2l0aW9uSW5kZXhlc1swXTtcblxuICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGVkaXRIYW5kbGVTaGFwZSwge1xuICAgICAgZmVhdHVyZTogZmVhdHVyZSB8fCBlZGl0SGFuZGxlLFxuICAgICAgaW5kZXgsXG4gICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICBzdGF0ZTogdGhpcy5fZ2V0RWRpdEhhbmRsZVN0YXRlKGVkaXRIYW5kbGUpXG4gICAgfSk7XG5cbiAgICBsZXQgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZWRpdEhhbmRsZVN0eWxlLCB7XG4gICAgICBmZWF0dXJlOiBmZWF0dXJlIHx8IGVkaXRIYW5kbGUsXG4gICAgICBpbmRleCxcbiAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgIHNoYXBlLFxuICAgICAgc3RhdGU6IHRoaXMuX2dldEVkaXRIYW5kbGVTdGF0ZShlZGl0SGFuZGxlKVxuICAgIH0pO1xuXG4gICAgLy8gZGlzYWJsZSBldmVudHMgZm9yIGN1cnNvciBlZGl0SGFuZGxlXG4gICAgaWYgKGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgIC8vIGRpc2FibGUgcG9pbnRlciBldmVudHMgZm9yIGN1cnNvclxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbUtleSA9IGAke0VMRU1FTlRfVFlQRS5FRElUX0hBTkRMRX0uJHtmZWF0dXJlSW5kZXh9LiR7aW5kZXh9YDtcbiAgICAvLyBmaXJzdCA8Y2lyY2xlfHJlY3Q+IGlzIHRvIG1ha2UgcGF0aCBlYXNpbHkgaW50ZXJhY3RlZCB3aXRoXG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BbMF19LCAke3BbMV19KWB9PlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5FRElUX0hBTkRMRX1cbiAgICAgICAgICAgICAgZGF0YS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgICAgIHN0eWxlPXt7IC4uLnN0eWxlLCBzdHJva2U6ICdub25lJywgZmlsbDogJyMwMDAnLCBmaWxsT3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgICBjeD17MH1cbiAgICAgICAgICAgICAgY3k9ezB9XG4gICAgICAgICAgICAgIHI9e2NsaWNrUmFkaXVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9XG4gICAgICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGN4PXswfVxuICAgICAgICAgICAgICBjeT17MH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGcga2V5PXtlbGVtS2V5fSB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHtwWzBdfSwgJHtwWzFdfSlgfT5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkVESVRfSEFORExFfVxuICAgICAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBjbGlja1JhZGl1cyxcbiAgICAgICAgICAgICAgICBmaWxsOiAnIzAwMCcsXG4gICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgcj17Y2xpY2tSYWRpdXN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9XG4gICAgICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fWB9XG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgX3JlbmRlclNlZ21lbnQgPSAoZmVhdHVyZUluZGV4OiBJZCwgaW5kZXg6IG51bWJlciwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlcywgR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HKTtcbiAgICBjb25zdCB7IHJhZGl1cywgLi4ub3RoZXJzIH0gPSBzdHlsZTtcbiAgICBjb25zdCB7IGNsaWNrUmFkaXVzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgZWxlbUtleSA9IGAke0VMRU1FTlRfVFlQRS5TRUdNRU5UfS4ke2ZlYXR1cmVJbmRleH0uJHtpbmRleH1gO1xuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5TRUdNRU5UfVxuICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAuLi5vdGhlcnMsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMgfHwgcmFkaXVzLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgZD17cGF0aH1cbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuU0VHTUVOVH1cbiAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICBzdHlsZT17b3RoZXJzfVxuICAgICAgICAgIGQ9e3BhdGh9XG4gICAgICAgIC8+XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyU2VnbWVudHMgPSAoZmVhdHVyZUluZGV4OiBJZCwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgc2VnbWVudHMucHVzaChcbiAgICAgICAgdGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGksIFtjb29yZGluYXRlc1tpXSwgY29vcmRpbmF0ZXNbaSArIDFdXSwgc3R5bGUpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH07XG5cbiAgX3JlbmRlckZpbGwgPSAoZmVhdHVyZUluZGV4OiBJZCwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlcywgR0VPSlNPTl9UWVBFLlBPTFlHT04pO1xuICAgIHJldHVybiAoXG4gICAgICA8cGF0aFxuICAgICAgICBrZXk9e2Ake0VMRU1FTlRfVFlQRS5GSUxMfS4ke2ZlYXR1cmVJbmRleH1gfVxuICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GSUxMfVxuICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgc3R5bGU9e3sgLi4uc3R5bGUsIHN0cm9rZTogJ25vbmUnIH19XG4gICAgICAgIGQ9e3BhdGh9XG4gICAgICAvPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclRlbnRhdGl2ZUZlYXR1cmUgPSAoZmVhdHVyZTogRmVhdHVyZSwgY3Vyc29yRWRpdEhhbmRsZTogRmVhdHVyZSkgPT4ge1xuICAgIGNvbnN0IHsgZmVhdHVyZVN0eWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIGdlb21ldHJ5OiB7IGNvb3JkaW5hdGVzIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IHJlbmRlclR5cGUgfVxuICAgIH0gPSBmZWF0dXJlO1xuXG4gICAgaWYgKCFjb29yZGluYXRlcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyA+PSAyIGNvb3JkaW5hdGVzXG4gICAgY29uc3QgZmlyc3RDb29yZHMgPSBjb29yZGluYXRlc1swXTtcbiAgICBjb25zdCBsYXN0Q29vcmRzID0gY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdW5jb21taXR0ZWRTdHlsZSA9IHRoaXMuX2dldFN0eWxlUHJvcChmZWF0dXJlU3R5bGUsIHtcbiAgICAgIGZlYXR1cmUsXG4gICAgICBpbmRleDogbnVsbCxcbiAgICAgIHN0YXRlOiBSRU5ERVJfU1RBVEUuVU5DT01NSVRURURcbiAgICB9KTtcblxuICAgIGxldCBjb21taXR0ZWRQYXRoO1xuICAgIGxldCB1bmNvbW1pdHRlZFBhdGg7XG4gICAgbGV0IGNsb3NpbmdQYXRoO1xuICAgIGNvbnN0IGZpbGwgPSB0aGlzLl9yZW5kZXJGaWxsKCd0ZW50YXRpdmUnLCBjb29yZGluYXRlcywgdW5jb21taXR0ZWRTdHlsZSk7XG5cbiAgICBzd2l0Y2ggKHJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuTElORV9TVFJJTkc6XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPTFlHT046XG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZFN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwge1xuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgc3RhdGU6IFJFTkRFUl9TVEFURS5TRUxFQ1RFRFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY3Vyc29yRWRpdEhhbmRsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnNvckNvb3JkcyA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgIGNvbW1pdHRlZFBhdGggPSB0aGlzLl9yZW5kZXJTZWdtZW50cyhcbiAgICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICBjb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5jb21taXR0ZWRQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtdW5jb21taXR0ZWQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMixcbiAgICAgICAgICAgIFtjdXJzb3JDb29yZHMsIGxhc3RDb29yZHNdLFxuICAgICAgICAgICAgdW5jb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKCd0ZW50YXRpdmUnLCBjb29yZGluYXRlcywgY29tbWl0dGVkU3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04pIHtcbiAgICAgICAgICBjb25zdCBjbG9zaW5nU3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7XG4gICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogUkVOREVSX1NUQVRFLkNMT1NJTkdcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNsb3NpbmdQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtY2xvc2luZycsXG4gICAgICAgICAgICBjb29yZGluYXRlcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgW2xhc3RDb29yZHMsIGZpcnN0Q29vcmRzXSxcbiAgICAgICAgICAgIGNsb3NpbmdTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5SRUNUQU5HTEU6XG4gICAgICAgIHVuY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKFxuICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgIFsuLi5jb29yZGluYXRlcywgZmlyc3RDb29yZHNdLFxuICAgICAgICAgIHVuY29tbWl0dGVkU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuIFtmaWxsLCBjb21taXR0ZWRQYXRoLCB1bmNvbW1pdHRlZFBhdGgsIGNsb3NpbmdQYXRoXS5maWx0ZXIoQm9vbGVhbik7XG4gIH07XG5cbiAgX3JlbmRlckd1aWRlcyA9ICh7IHRlbnRhdGl2ZUZlYXR1cmUsIGVkaXRIYW5kbGVzIH06IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRGZWF0dXJlcygpO1xuICAgIGNvbnN0IGN1cnNvckVkaXRIYW5kbGUgPSBlZGl0SGFuZGxlcy5maW5kKFxuICAgICAgZiA9PiBmLnByb3BlcnRpZXMuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkNVUlNPUl9FRElUX0hBTkRMRVxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxnIGtleT1cImZlYXR1cmUtZ3VpZGVzXCI+XG4gICAgICAgIHt0ZW50YXRpdmVGZWF0dXJlICYmIHRoaXMuX3JlbmRlclRlbnRhdGl2ZUZlYXR1cmUodGVudGF0aXZlRmVhdHVyZSwgY3Vyc29yRWRpdEhhbmRsZSl9XG4gICAgICAgIHtlZGl0SGFuZGxlcyAmJlxuICAgICAgICAgIGVkaXRIYW5kbGVzLm1hcChlZGl0SGFuZGxlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPVxuICAgICAgICAgICAgICAoZmVhdHVyZXMgJiYgZmVhdHVyZXNbZWRpdEhhbmRsZS5wcm9wZXJ0aWVzLmZlYXR1cmVJbmRleF0pIHx8IHRlbnRhdGl2ZUZlYXR1cmU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRWRpdEhhbmRsZShlZGl0SGFuZGxlLCBmZWF0dXJlKTtcbiAgICAgICAgICB9KX1cbiAgICAgIDwvZz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJQb2ludCA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGZlYXR1cmVTaGFwZSwgY2xpY2tSYWRpdXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVNoYXBlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzaGFwZSA9PT0gJ3JlY3QnKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGhlaWdodDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDBcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9nPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PXtgZmVhdHVyZS4ke2luZGV4fWB9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjeD17MH1cbiAgICAgICAgICBjeT17MH1cbiAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgLz5cbiAgICAgICAgPGNpcmNsZVxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgIGN4PXswfVxuICAgICAgICAgIGN5PXswfVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBhdGggPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGNsaWNrUmFkaXVzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGluZGV4ID09PSBzZWxlY3RlZEZlYXR1cmVJbmRleDtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGcga2V5PXtlbGVtS2V5fT57dGhpcy5fcmVuZGVyU2VnbWVudHMoaW5kZXgsIGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlKX08L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IDxwYXRoPiBpcyB0byBtYWtlIHBhdGggZWFzaWx5IGludGVyYWN0ZWQgd2l0aFxuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgZD17cGF0aH1cbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICBkPXtwYXRofVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBvbHlnb24gPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmVJbmRleCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaW5kZXggPT09IHNlbGVjdGVkRmVhdHVyZUluZGV4O1xuXG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSB0aGlzLl9nZXRGZWF0dXJlUmVuZGVyU3RhdGUoaW5kZXgpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwgeyBmZWF0dXJlLCBpbmRleCwgc3RhdGU6IHJlbmRlclN0YXRlIH0pO1xuXG4gICAgY29uc3QgZWxlbUtleSA9IGBmZWF0dXJlLiR7aW5kZXh9YDtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICAgICAgaWYgKCFjb29yZGluYXRlcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxnIGtleT17ZWxlbUtleX0+XG4gICAgICAgICAge3RoaXMuX3JlbmRlckZpbGwoaW5kZXgsIGNvb3JkaW5hdGVzLCBzdHlsZSl9XG4gICAgICAgICAge3RoaXMuX3JlbmRlclNlZ21lbnRzKGluZGV4LCBjb29yZGluYXRlcywgc3R5bGUpfVxuICAgICAgICA8L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8cGF0aFxuICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgZD17cGF0aH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZSA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG4gICAgaWYgKCFjb29yZGluYXRlcyB8fCAhY29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IHJlbmRlclR5cGUgfSxcbiAgICAgIGdlb21ldHJ5OiB7IHR5cGUgfVxuICAgIH0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRQYXRoSW5TY3JlZW5Db29yZHMoY29vcmRpbmF0ZXMsIHR5cGUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUG9pbnQoZmVhdHVyZSwgaW5kZXgsIHBhdGgpO1xuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclBhdGgoZmVhdHVyZSwgaW5kZXgsIHBhdGgpO1xuXG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPTFlHT046XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlJFQ1RBTkdMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclBvbHlnb24oZmVhdHVyZSwgaW5kZXgsIHBhdGgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgX3JlbmRlckNhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RmVhdHVyZXMoKTtcbiAgICBjb25zdCBndWlkZXMgPSB0aGlzLl9tb2RlSGFuZGxlciAmJiB0aGlzLl9tb2RlSGFuZGxlci5nZXRHdWlkZXModGhpcy5nZXRNb2RlUHJvcHMoKSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPHN2ZyBrZXk9XCJkcmF3LWNhbnZhc1wiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAge2ZlYXR1cmVzICYmXG4gICAgICAgICAgZmVhdHVyZXMubGVuZ3RoID4gMCAmJiA8ZyBrZXk9XCJmZWF0dXJlLWdyb3VwXCI+e2ZlYXR1cmVzLm1hcCh0aGlzLl9yZW5kZXJGZWF0dXJlKX08L2c+fVxuICAgICAgICB7Z3VpZGVzICYmIDxnIGtleT1cImZlYXR1cmUtZ3VpZGVzXCI+e3RoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpfTwvZz59XG4gICAgICA8L3N2Zz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJFZGl0b3IgPSAoKSA9PiB7XG4gICAgaWYoIXRoaXMuX2NvbnRleHQpIHJldHVybiBudWxsXG4gICAgY29uc3Qgdmlld3BvcnQgPSAodGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LnZpZXdwb3J0KSB8fCB7fTtcbiAgICBjb25zdCB7IHN0eWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdmlld3BvcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBpZD1cImVkaXRvclwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIC4uLnN0eWxlXG4gICAgICAgIH19XG4gICAgICAgIHJlZj17XyA9PiB7XG4gICAgICAgICAgdGhpcy5fY29udGFpbmVyUmVmID0gXztcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3RoaXMuX3JlbmRlckNhbnZhcygpfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHN1cGVyLnJlbmRlcih0aGlzLl9yZW5kZXJFZGl0b3IoKSk7XG4gIH1cbn1cbiJdfQ== |
\ | No newline at end of file |