UNPKG

tmp-react-map-gl-draw

Version:

A lite version editing layer with react

333 lines (248 loc) 37.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _constants = require("../constants"); var _baseMode = _interopRequireDefault(require("./base-mode")); var _utils = require("./utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } 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); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } 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; } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 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); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 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; } var EditingMode = /*#__PURE__*/ function (_BaseMode) { _inherits(EditingMode, _BaseMode); function EditingMode() { var _getPrototypeOf2; var _this; _classCallCheck(this, EditingMode); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(EditingMode)).call.apply(_getPrototypeOf2, [this].concat(args))); _defineProperty(_assertThisInitialized(_this), "handleClick", function (event, props) { var pickedObject = event.picks && event.picks[0] && event.picks[0].object; var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0]; if (!pickedObject || pickedObject.featureIndex !== selectedFeatureIndex) { return; } var featureIndex = pickedObject.featureIndex, index = pickedObject.index; var feature = _this.getSelectedFeature(props, featureIndex); if (feature && (feature.geometry.type === _constants.RENDER_TYPE.POLYGON || feature.geometry.type === _constants.RENDER_TYPE.LINE_STRING) && pickedObject.type === _constants.ELEMENT_TYPE.SEGMENT) { var coordinates = (0, _utils.getFeatureCoordinates)(feature); if (!coordinates) { return; } var insertIndex = (index + 1) % coordinates.length; var positionIndexes = feature.geometry.type === _constants.RENDER_TYPE.POLYGON ? [0, insertIndex] : [insertIndex]; var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords); var updatedData = props.data.addPosition(featureIndex, positionIndexes, insertMapCoords).getObject(); props.onEdit({ editType: _constants.EDIT_TYPE.ADD_POSITION, updatedData: updatedData, editContext: [{ featureIndex: featureIndex, editHandleIndex: insertIndex, screenCoords: props.viewport && props.viewport.project(insertMapCoords), mapCoords: insertMapCoords }] }); } }); _defineProperty(_assertThisInitialized(_this), "_handleDragging", function (event, props) { var onEdit = props.onEdit; var selectedFeature = _this.getSelectedFeature(props); // nothing clicked var isDragging = event.isDragging, pointerDownPicks = event.pointerDownPicks, screenCoords = event.screenCoords; var lastPointerMoveEvent = props.lastPointerMoveEvent; var clickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object; if (!clickedObject || !(0, _utils.isNumeric)(clickedObject.featureIndex)) { return; } var editHandleIndex = clickedObject.index; // not dragging var updatedData = null; var editType = isDragging ? _constants.EDIT_TYPE.MOVE_POSITION : _constants.EDIT_TYPE.FINISH_MOVE_POSITION; switch (clickedObject.type) { case _constants.ELEMENT_TYPE.FEATURE: case _constants.ELEMENT_TYPE.FILL: case _constants.ELEMENT_TYPE.SEGMENT: // dragging feature var dx = screenCoords[0] - lastPointerMoveEvent.screenCoords[0]; var dy = screenCoords[1] - lastPointerMoveEvent.screenCoords[1]; updatedData = _this._updateFeature(props, 'feature', { dx: dx, dy: dy }); onEdit({ editType: editType, updatedData: updatedData, editContext: null }); break; case _constants.ELEMENT_TYPE.EDIT_HANDLE: // dragging editHandle // dragging rectangle or other shapes var updateType = selectedFeature.properties.renderType === _constants.RENDER_TYPE.RECTANGLE ? 'rectangle' : 'editHandle'; updatedData = _this._updateFeature(props, updateType, { editHandleIndex: editHandleIndex, mapCoords: event.mapCoords }); onEdit({ editType: editType, updatedData: updatedData, editContext: null }); break; default: } }); _defineProperty(_assertThisInitialized(_this), "handlePointerMove", function (event, props) { // no selected feature var selectedFeature = _this.getSelectedFeature(props); if (!selectedFeature) { return; } if (!event.isDragging) { return; } _this._handleDragging(event, props); }); _defineProperty(_assertThisInitialized(_this), "_updateFeature", function (props, type) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var data = props.data, selectedIndexes = props.selectedIndexes, viewport = props.viewport; var featureIndex = selectedIndexes && selectedIndexes[0]; var feature = _this.getSelectedFeature(props, featureIndex); var geometry = null; var coordinates = (0, _utils.getFeatureCoordinates)(feature); if (!coordinates) { return null; } var newCoordinates = _toConsumableArray(coordinates); switch (type) { case 'editHandle': var positionIndexes = feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [0, options.editHandleIndex] : [options.editHandleIndex]; return data.replacePosition(featureIndex, positionIndexes, options.mapCoords).getObject(); case 'feature': var dx = options.dx, dy = options.dy; newCoordinates = newCoordinates.map(function (mapCoords) { var pixels = viewport && viewport.project(mapCoords); if (pixels) { pixels[0] += dx; pixels[1] += dy; return viewport && viewport.unproject(pixels); } return null; }).filter(Boolean); geometry = { type: feature.geometry.type, coordinates: feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [newCoordinates] : newCoordinates }; return data.replaceGeometry(featureIndex, geometry).getObject(); case 'rectangle': // moved editHandleIndex and destination mapCoords newCoordinates = (0, _utils.updateRectanglePosition)(feature, options.editHandleIndex, options.mapCoords); geometry = { type: _constants.GEOJSON_TYPE.POLYGON, coordinates: newCoordinates }; return data.replaceGeometry(featureIndex, geometry).getObject(); default: return data && data.getObject(); } }); _defineProperty(_assertThisInitialized(_this), "_getCursorEditHandle", function (event, feature) { if (!event) return null; var isDragging = event.isDragging, picks = event.picks; // if not pick segment var pickedObject = picks && picks[0] && picks[0].object; if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex) || pickedObject.type !== _constants.ELEMENT_TYPE.SEGMENT) { return null; } // if dragging or feature is neither polygon nor line string if (isDragging || feature.properties.renderType !== _constants.GEOJSON_TYPE.POLYGON && feature.properties.renderType !== _constants.GEOJSON_TYPE.LINE_STRING) { return null; } var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords); if (!insertMapCoords) { return null; } return { type: 'Feature', properties: { guideType: _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE, renderType: feature.properties.renderType, positionIndexes: [null] }, geometry: { type: _constants.GEOJSON_TYPE.POINT, coordinates: [insertMapCoords] } }; }); _defineProperty(_assertThisInitialized(_this), "getGuides", function (props) { var selectedFeature = _this.getSelectedFeature(props); var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0]; if (!selectedFeature || selectedFeature.geometry.type === _constants.GEOJSON_TYPE.POINT) { return null; } var event = props.lastPointerMoveEvent; // feature editHandles var editHandles = _this.getEditHandlesFromFeature(selectedFeature, selectedFeatureIndex) || []; // cursor editHandle var cursorEditHandle = _this._getCursorEditHandle(event, selectedFeature); if (cursorEditHandle) { editHandles.push(_this._getCursorEditHandle(event, selectedFeature)); } return { editHandles: editHandles.length ? editHandles : null }; }); return _this; } _createClass(EditingMode, [{ key: "handleStopDragging", value: function handleStopDragging(event, props) { // replace point var pickedObject = event.picks && event.picks[0] && event.picks[0].object; if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex)) { return; } switch (pickedObject.type) { case _constants.ELEMENT_TYPE.FEATURE: case _constants.ELEMENT_TYPE.EDIT_HANDLE: this._handleDragging(event, props); break; default: } } }, { key: "_getPointOnSegment", value: function _getPointOnSegment(feature, pickedObject, pickedMapCoords) { var coordinates = (0, _utils.getFeatureCoordinates)(feature); if (!coordinates) { return null; } var srcVertexIndex = pickedObject.index; var targetVertexIndex = pickedObject.index + 1; return (0, _utils.findClosestPointOnLineSegment)(coordinates[srcVertexIndex], coordinates[targetVertexIndex], pickedMapCoords); } }]); return EditingMode; }(_baseMode["default"]); exports["default"] = EditingMode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0LW1vZGVzL2VkaXRpbmctbW9kZS5qcyJdLCJuYW1lcyI6WyJFZGl0aW5nTW9kZSIsImV2ZW50IiwicHJvcHMiLCJwaWNrZWRPYmplY3QiLCJwaWNrcyIsIm9iamVjdCIsInNlbGVjdGVkRmVhdHVyZUluZGV4Iiwic2VsZWN0ZWRJbmRleGVzIiwiZmVhdHVyZUluZGV4IiwiaW5kZXgiLCJmZWF0dXJlIiwiZ2V0U2VsZWN0ZWRGZWF0dXJlIiwiZ2VvbWV0cnkiLCJ0eXBlIiwiUkVOREVSX1RZUEUiLCJQT0xZR09OIiwiTElORV9TVFJJTkciLCJFTEVNRU5UX1RZUEUiLCJTRUdNRU5UIiwiY29vcmRpbmF0ZXMiLCJpbnNlcnRJbmRleCIsImxlbmd0aCIsInBvc2l0aW9uSW5kZXhlcyIsImluc2VydE1hcENvb3JkcyIsIl9nZXRQb2ludE9uU2VnbWVudCIsIm1hcENvb3JkcyIsInVwZGF0ZWREYXRhIiwiZGF0YSIsImFkZFBvc2l0aW9uIiwiZ2V0T2JqZWN0Iiwib25FZGl0IiwiZWRpdFR5cGUiLCJFRElUX1RZUEUiLCJBRERfUE9TSVRJT04iLCJlZGl0Q29udGV4dCIsImVkaXRIYW5kbGVJbmRleCIsInNjcmVlbkNvb3JkcyIsInZpZXdwb3J0IiwicHJvamVjdCIsInNlbGVjdGVkRmVhdHVyZSIsImlzRHJhZ2dpbmciLCJwb2ludGVyRG93blBpY2tzIiwibGFzdFBvaW50ZXJNb3ZlRXZlbnQiLCJjbGlja2VkT2JqZWN0IiwiTU9WRV9QT1NJVElPTiIsIkZJTklTSF9NT1ZFX1BPU0lUSU9OIiwiRkVBVFVSRSIsIkZJTEwiLCJkeCIsImR5IiwiX3VwZGF0ZUZlYXR1cmUiLCJFRElUX0hBTkRMRSIsInVwZGF0ZVR5cGUiLCJwcm9wZXJ0aWVzIiwicmVuZGVyVHlwZSIsIlJFQ1RBTkdMRSIsIl9oYW5kbGVEcmFnZ2luZyIsIm9wdGlvbnMiLCJuZXdDb29yZGluYXRlcyIsIkdFT0pTT05fVFlQRSIsInJlcGxhY2VQb3NpdGlvbiIsIm1hcCIsInBpeGVscyIsInVucHJvamVjdCIsImZpbHRlciIsIkJvb2xlYW4iLCJyZXBsYWNlR2VvbWV0cnkiLCJndWlkZVR5cGUiLCJHVUlERV9UWVBFIiwiQ1VSU09SX0VESVRfSEFORExFIiwiUE9JTlQiLCJlZGl0SGFuZGxlcyIsImdldEVkaXRIYW5kbGVzRnJvbUZlYXR1cmUiLCJjdXJzb3JFZGl0SGFuZGxlIiwiX2dldEN1cnNvckVkaXRIYW5kbGUiLCJwdXNoIiwicGlja2VkTWFwQ29vcmRzIiwic3JjVmVydGV4SW5kZXgiLCJ0YXJnZXRWZXJ0ZXhJbmRleCIsIkJhc2VNb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBT3FCQSxXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7a0VBQ0wsVUFBQ0MsS0FBRCxFQUFvQkMsS0FBcEIsRUFBNEQ7QUFDeEUsVUFBTUMsWUFBWSxHQUFHRixLQUFLLENBQUNHLEtBQU4sSUFBZUgsS0FBSyxDQUFDRyxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSCxLQUFLLENBQUNHLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQXJFO0FBQ0EsVUFBTUMsb0JBQW9CLEdBQUdKLEtBQUssQ0FBQ0ssZUFBTixJQUF5QkwsS0FBSyxDQUFDSyxlQUFOLENBQXNCLENBQXRCLENBQXREOztBQUNBLFVBQUksQ0FBQ0osWUFBRCxJQUFpQkEsWUFBWSxDQUFDSyxZQUFiLEtBQThCRixvQkFBbkQsRUFBeUU7QUFDdkU7QUFDRDs7QUFMdUUsVUFPaEVFLFlBUGdFLEdBT3hDTCxZQVB3QyxDQU9oRUssWUFQZ0U7QUFBQSxVQU9sREMsS0FQa0QsR0FPeENOLFlBUHdDLENBT2xETSxLQVBrRDs7QUFReEUsVUFBTUMsT0FBTyxHQUFHLE1BQUtDLGtCQUFMLENBQXdCVCxLQUF4QixFQUErQk0sWUFBL0IsQ0FBaEI7O0FBQ0EsVUFDRUUsT0FBTyxLQUNOQSxPQUFPLENBQUNFLFFBQVIsQ0FBaUJDLElBQWpCLEtBQTBCQyx1QkFBWUMs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LFdBQXJCLEdBQW1DO0FBRDNDLE9BQVA7QUFHRCxLOzs7Ozs7O3VDQXpPa0J0RSxLLEVBQTBCQyxLLEVBQXFDO0FBQ2hGO0FBQ0EsVUFBTUMsWUFBWSxHQUFHRixLQUFLLENBQUNHLEtBQU4sSUFBZUgsS0FBSyxDQUFDRyxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSCxLQUFLLENBQUNHLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQXJFOztBQUNBLFVBQUksQ0FBQ0YsWUFBRCxJQUFpQixDQUFDLHNCQUFVQSxZQUFZLENBQUNLLFlBQXZCLENBQXRCLEVBQTREO0FBQzFEO0FBQ0Q7O0FBRUQsY0FBUUwsWUFBWSxDQUFDVSxJQUFyQjtBQUNFLGFBQUtJLHdCQUFhNkIsT0FBbEI7QUFDQSxhQUFLN0Isd0JBQWFrQyxXQUFsQjtBQUNFLGVBQUtLLGVBQUwsQ0FBcUJ2RCxLQUFyQixFQUE0QkMsS0FBNUI7O0FBQ0E7O0FBQ0Y7QUFMRjtBQU9EOzs7dUNBNklrQlEsTyxFQUFrQlAsWSxFQUFtQnlFLGUsRUFBMkI7QUFDakYsVUFBTXpELFdBQVcsR0FBRyxrQ0FBc0JULE9BQXRCLENBQXBCOztBQUNBLFVBQUksQ0FBQ1MsV0FBTCxFQUFrQjtBQUNoQixlQUFPLElBQVA7QUFDRDs7QUFDRCxVQUFNMEQsY0FBYyxHQUFHMUUsWUFBWSxDQUFDTSxLQUFwQztBQUNBLFVBQU1xRSxpQkFBaUIsR0FBRzNFLFlBQVksQ0FBQ00sS0FBYixHQUFxQixDQUEvQztBQUNBLGFBQU8sMENBQ0xVLFdBQVcsQ0FBQzBELGNBQUQsQ0FETixFQUVMMUQsV0FBVyxDQUFDMkQsaUJBQUQsQ0FGTixFQUdMRixlQUhLLENBQVA7QUFLRDs7OztFQW5Oc0NHLG9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlLFxuICBGZWF0dXJlQ29sbGVjdGlvbixcbiAgQ2xpY2tFdmVudCxcbiAgU3RvcERyYWdnaW5nRXZlbnQsXG4gIFBvaW50ZXJNb3ZlRXZlbnQsXG4gIFBvc2l0aW9uXG59IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5pbXBvcnQgdHlwZSB7IE1vZGVQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgUkVOREVSX1RZUEUsIEVESVRfVFlQRSwgRUxFTUVOVF9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEJhc2VNb2RlIGZyb20gJy4vYmFzZS1tb2RlJztcbmltcG9ydCB7XG4gIGZpbmRDbG9zZXN0UG9pbnRPbkxpbmVTZWdtZW50LFxuICBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMsXG4gIGlzTnVtZXJpYyxcbiAgdXBkYXRlUmVjdGFuZ2xlUG9zaXRpb25cbn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRpbmdNb2RlIGV4dGVuZHMgQmFzZU1vZGUge1xuICBoYW5kbGVDbGljayA9IChldmVudDogQ2xpY2tFdmVudCwgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBldmVudC5waWNrcyAmJiBldmVudC5waWNrc1swXSAmJiBldmVudC5waWNrc1swXS5vYmplY3Q7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBwcm9wcy5zZWxlY3RlZEluZGV4ZXMgJiYgcHJvcHMuc2VsZWN0ZWRJbmRleGVzWzBdO1xuICAgIGlmICghcGlja2VkT2JqZWN0IHx8IHBpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXggIT09IHNlbGVjdGVkRmVhdHVyZUluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBmZWF0dXJlSW5kZXgsIGluZGV4IH0gPSBwaWNrZWRPYmplY3Q7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzLCBmZWF0dXJlSW5kZXgpO1xuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gfHxcbiAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORykgJiZcbiAgICAgIHBpY2tlZE9iamVjdC50eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICkge1xuICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG4gICAgICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gKGluZGV4ICsgMSkgJSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICBjb25zdCBwb3NpdGlvbkluZGV4ZXMgPVxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gPyBbMCwgaW5zZXJ0SW5kZXhdIDogW2luc2VydEluZGV4XTtcbiAgICAgIGNvbnN0IGluc2VydE1hcENvb3JkcyA9IHRoaXMuX2dldFBvaW50T25TZWdtZW50KGZlYXR1cmUsIHBpY2tlZE9iamVjdCwgZXZlbnQubWFwQ29vcmRzKTtcblxuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcm9wcy5kYXRhXG4gICAgICAgIC5hZGRQb3NpdGlvbihmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcywgaW5zZXJ0TWFwQ29vcmRzKVxuICAgICAgICAuZ2V0T2JqZWN0KCk7XG5cbiAgICAgIHByb3BzLm9uRWRpdCh7XG4gICAgICAgIGVkaXRUeXBlOiBFRElUX1RZUEUuQUREX1BPU0lUSU9OLFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgZWRpdENvbnRleHQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBlZGl0SGFuZGxlSW5kZXg6IGluc2VydEluZGV4LFxuICAgICAgICAgICAgc2NyZWVuQ29vcmRzOiBwcm9wcy52aWV3cG9ydCAmJiBwcm9wcy52aWV3cG9ydC5wcm9qZWN0KGluc2VydE1hcENvb3JkcyksXG4gICAgICAgICAgICBtYXBDb29yZHM6IGluc2VydE1hcENvb3Jkc1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVN0b3BEcmFnZ2luZyhldmVudDogU3RvcERyYWdnaW5nRXZlbnQsIHByb3BzOiBNb2RlUHJvcHM8RmVhdHVyZUNvbGxlY3Rpb24+KSB7XG4gICAgLy8gcmVwbGFjZSBwb2ludFxuICAgIGNvbnN0IHBpY2tlZE9iamVjdCA9IGV2ZW50LnBpY2tzICYmIGV2ZW50LnBpY2tzWzBdICYmIGV2ZW50LnBpY2tzWzBdLm9iamVjdDtcbiAgICBpZiAoIXBpY2tlZE9iamVjdCB8fCAhaXNOdW1lcmljKHBpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChwaWNrZWRPYmplY3QudHlwZSkge1xuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuRkVBVFVSRTpcbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkVESVRfSEFORExFOlxuICAgICAgICB0aGlzLl9oYW5kbGVEcmFnZ2luZyhldmVudCwgcHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZURyYWdnaW5nID0gKFxuICAgIGV2ZW50OiBQb2ludGVyTW92ZUV2ZW50IHwgU3RvcERyYWdnaW5nRXZlbnQsXG4gICAgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj5cbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvbkVkaXQgfSA9IHByb3BzO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzKTtcbiAgICAvLyBub3RoaW5nIGNsaWNrZWRcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIHBvaW50ZXJEb3duUGlja3MsIHNjcmVlbkNvb3JkcyB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyBsYXN0UG9pbnRlck1vdmVFdmVudCB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gcG9pbnRlckRvd25QaWNrcyAmJiBwb2ludGVyRG93blBpY2tzWzBdICYmIHBvaW50ZXJEb3duUGlja3NbMF0ub2JqZWN0O1xuICAgIGlmICghY2xpY2tlZE9iamVjdCB8fCAhaXNOdW1lcmljKGNsaWNrZWRPYmplY3QuZmVhdHVyZUluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGNsaWNrZWRPYmplY3QuaW5kZXg7XG5cbiAgICAvLyBub3QgZHJhZ2dpbmdcbiAgICBsZXQgdXBkYXRlZERhdGEgPSBudWxsO1xuICAgIGNvbnN0IGVkaXRUeXBlID0gaXNEcmFnZ2luZyA/IEVESVRfVFlQRS5NT1ZFX1BPU0lUSU9OIDogRURJVF9UWVBFLkZJTklTSF9NT1ZFX1BPU0lUSU9OO1xuXG4gICAgc3dpdGNoIChjbGlja2VkT2JqZWN0LnR5cGUpIHtcbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkZFQVRVUkU6XG4gICAgICBjYXNlIEVMRU1FTlRfVFlQRS5GSUxMOlxuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuU0VHTUVOVDpcbiAgICAgICAgLy8gZHJhZ2dpbmcgZmVhdHVyZVxuICAgICAgICBjb25zdCBkeCA9IHNjcmVlbkNvb3Jkc1swXSAtIGxhc3RQb2ludGVyTW92ZUV2ZW50LnNjcmVlbkNvb3Jkc1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBzY3JlZW5Db29yZHNbMV0gLSBsYXN0UG9pbnRlck1vdmVFdmVudC5zY3JlZW5Db29yZHNbMV07XG4gICAgICAgIHVwZGF0ZWREYXRhID0gdGhpcy5fdXBkYXRlRmVhdHVyZShwcm9wcywgJ2ZlYXR1cmUnLCB7IGR4LCBkeSB9KTtcbiAgICAgICAgb25FZGl0KHtcbiAgICAgICAgICBlZGl0VHlwZSxcbiAgICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgICBlZGl0Q29udGV4dDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkVESVRfSEFORExFOlxuICAgICAgICAvLyBkcmFnZ2luZyBlZGl0SGFuZGxlXG4gICAgICAgIC8vIGRyYWdnaW5nIHJlY3RhbmdsZSBvciBvdGhlciBzaGFwZXNcbiAgICAgICAgY29uc3QgdXBkYXRlVHlwZSA9XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlLnByb3BlcnRpZXMucmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUkVDVEFOR0xFXG4gICAgICAgICAgICA/ICdyZWN0YW5nbGUnXG4gICAgICAgICAgICA6ICdlZGl0SGFuZGxlJztcbiAgICAgICAgdXBkYXRlZERhdGEgPSB0aGlzLl91cGRhdGVGZWF0dXJlKHByb3BzLCB1cGRhdGVUeXBlLCB7XG4gICAgICAgICAgZWRpdEhhbmRsZUluZGV4LFxuICAgICAgICAgIG1hcENvb3JkczogZXZlbnQubWFwQ29vcmRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uRWRpdCh7XG4gICAgICAgICAgZWRpdFR5cGUsXG4gICAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgICAgZWRpdENvbnRleHQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBoYW5kbGVQb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlck1vdmVFdmVudCwgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICAvLyBubyBzZWxlY3RlZCBmZWF0dXJlXG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMpO1xuICAgIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFldmVudC5pc0RyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlRHJhZ2dpbmcoZXZlbnQsIHByb3BzKTtcbiAgfTtcblxuICAvLyBUT0RPIC0gcmVmYWN0b3JcbiAgX3VwZGF0ZUZlYXR1cmUgPSAocHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4sIHR5cGU6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHNlbGVjdGVkSW5kZXhlcywgdmlld3BvcnQgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZmVhdHVyZUluZGV4ID0gc2VsZWN0ZWRJbmRleGVzICYmIHNlbGVjdGVkSW5kZXhlc1swXTtcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMsIGZlYXR1cmVJbmRleCk7XG5cbiAgICBsZXQgZ2VvbWV0cnkgPSBudWxsO1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBuZXdDb29yZGluYXRlcyA9IFsuLi5jb29yZGluYXRlc107XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2VkaXRIYW5kbGUnOlxuICAgICAgICBjb25zdCBwb3NpdGlvbkluZGV4ZXMgPVxuICAgICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gR0VPSlNPTl9UWVBFLlBPTFlHT05cbiAgICAgICAgICAgID8gWzAsIG9wdGlvbnMuZWRpdEhhbmRsZUluZGV4XVxuICAgICAgICAgICAgOiBbb3B0aW9ucy5lZGl0SGFuZGxlSW5kZXhdO1xuXG4gICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2VQb3NpdGlvbihmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcywgb3B0aW9ucy5tYXBDb29yZHMpLmdldE9iamVjdCgpO1xuXG4gICAgICBjYXNlICdmZWF0dXJlJzpcbiAgICAgICAgY29uc3QgeyBkeCwgZHkgfSA9IG9wdGlvbnM7XG4gICAgICAgIG5ld0Nvb3JkaW5hdGVzID0gbmV3Q29vcmRpbmF0ZXNcbiAgICAgICAgICAubWFwKG1hcENvb3JkcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBwaXhlbHMgPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC5wcm9qZWN0KG1hcENvb3Jkcyk7XG4gICAgICAgICAgICBpZiAocGl4ZWxzKSB7XG4gICAgICAgICAgICAgIHBpeGVsc1swXSArPSBkeDtcbiAgICAgICAgICAgICAgcGl4ZWxzWzFdICs9IGR5O1xuICAgICAgICAgICAgICByZXR1cm4gdmlld3BvcnQgJiYgdmlld3BvcnQudW5wcm9qZWN0KHBpeGVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgICAgdHlwZTogZmVhdHVyZS5nZW9tZXRyeS50eXBlLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOlxuICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBHRU9KU09OX1RZUEUuUE9MWUdPTiA/IFtuZXdDb29yZGluYXRlc10gOiBuZXdDb29yZGluYXRlc1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2VHZW9tZXRyeShmZWF0dXJlSW5kZXgsIGdlb21ldHJ5KS5nZXRPYmplY3QoKTtcblxuICAgICAgY2FzZSAncmVjdGFuZ2xlJzpcbiAgICAgICAgLy8gbW92ZWQgZWRpdEhhbmRsZUluZGV4IGFuZCBkZXN0aW5hdGlvbiBtYXBDb29yZHNcbiAgICAgICAgbmV3Q29vcmRpbmF0ZXMgPSB1cGRhdGVSZWN0YW5nbGVQb3NpdGlvbihcbiAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgIG9wdGlvbnMuZWRpdEhhbmRsZUluZGV4LFxuICAgICAgICAgIG9wdGlvbnMubWFwQ29vcmRzXG4gICAgICAgICk7XG5cbiAgICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgICAgdHlwZTogR0VPSlNPTl9UWVBFLlBPTFlHT04sXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IG5ld0Nvb3JkaW5hdGVzXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZUdlb21ldHJ5KGZlYXR1cmVJbmRleCwgZ2VvbWV0cnkpLmdldE9iamVjdCgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmdldE9iamVjdCgpO1xuICAgIH1cbiAgfTtcblxuICBfZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZTogRmVhdHVyZSwgcGlja2VkT2JqZWN0OiBhbnksIHBpY2tlZE1hcENvb3JkczogUG9zaXRpb24pIHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldEZlYXR1cmVDb29yZGluYXRlcyhmZWF0dXJlKTtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3JjVmVydGV4SW5kZXggPSBwaWNrZWRPYmplY3QuaW5kZXg7XG4gICAgY29uc3QgdGFyZ2V0VmVydGV4SW5kZXggPSBwaWNrZWRPYmplY3QuaW5kZXggKyAxO1xuICAgIHJldHVybiBmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudChcbiAgICAgIGNvb3JkaW5hdGVzW3NyY1ZlcnRleEluZGV4XSxcbiAgICAgIGNvb3JkaW5hdGVzW3RhcmdldFZlcnRleEluZGV4XSxcbiAgICAgIHBpY2tlZE1hcENvb3Jkc1xuICAgICk7XG4gIH1cblxuICBfZ2V0Q3Vyc29yRWRpdEhhbmRsZSA9IChldmVudDogUG9pbnRlck1vdmVFdmVudCwgZmVhdHVyZTogRmVhdHVyZSkgPT4ge1xuICAgIGlmKCFldmVudCkgcmV0dXJuIG51bGxcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIHBpY2tzIH0gPSBldmVudDtcbiAgICAvLyBpZiBub3QgcGljayBzZWdtZW50XG4gICAgY29uc3QgcGlja2VkT2JqZWN0ID0gcGlja3MgJiYgcGlja3NbMF0gJiYgcGlja3NbMF0ub2JqZWN0O1xuICAgIGlmIChcbiAgICAgICFwaWNrZWRPYmplY3QgfHxcbiAgICAgICFpc051bWVyaWMocGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleCkgfHxcbiAgICAgIHBpY2tlZE9iamVjdC50eXBlICE9PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgZHJhZ2dpbmcgb3IgZmVhdHVyZSBpcyBuZWl0aGVyIHBvbHlnb24gbm9yIGxpbmUgc3RyaW5nXG4gICAgaWYgKFxuICAgICAgaXNEcmFnZ2luZyB8fFxuICAgICAgKGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlICE9PSBHRU9KU09OX1RZUEUuUE9MWUdPTiAmJlxuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMucmVuZGVyVHlwZSAhPT0gR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zZXJ0TWFwQ29vcmRzID0gdGhpcy5fZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZSwgcGlja2VkT2JqZWN0LCBldmVudC5tYXBDb29yZHMpO1xuXG4gICAgaWYgKCFpbnNlcnRNYXBDb29yZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGd1aWRlVHlwZTogR1VJREVfVFlQRS5DVVJTT1JfRURJVF9IQU5ETEUsXG4gICAgICAgIHJlbmRlclR5cGU6IGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlLFxuICAgICAgICBwb3NpdGlvbkluZGV4ZXM6IFtudWxsXVxuICAgICAgfSxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIHR5cGU6IEdFT0pTT05fVFlQRS5QT0lOVCxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtpbnNlcnRNYXBDb29yZHNdXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBnZXRHdWlkZXMgPSAocHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSB0aGlzLmdldFNlbGVjdGVkRmVhdHVyZShwcm9wcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBwcm9wcy5zZWxlY3RlZEluZGV4ZXMgJiYgcHJvcHMuc2VsZWN0ZWRJbmRleGVzWzBdO1xuXG4gICAgaWYgKCFzZWxlY3RlZEZlYXR1cmUgfHwgc2VsZWN0ZWRGZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IEdFT0pTT05fVFlQRS5QT0lOVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBwcm9wcy5sYXN0UG9pbnRlck1vdmVFdmVudDtcblxuICAgIC8vIGZlYXR1cmUgZWRpdEhhbmRsZXNcbiAgICBjb25zdCBlZGl0SGFuZGxlcyA9IHRoaXMuZ2V0RWRpdEhhbmRsZXNGcm9tRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsIHNlbGVjdGVkRmVhdHVyZUluZGV4KSB8fCBbXTtcblxuICAgIC8vIGN1cnNvciBlZGl0SGFuZGxlXG4gICAgY29uc3QgY3Vyc29yRWRpdEhhbmRsZSA9IHRoaXMuX2dldEN1cnNvckVkaXRIYW5kbGUoZXZlbnQsIHNlbGVjdGVkRmVhdHVyZSk7XG4gICAgaWYgKGN1cnNvckVkaXRIYW5kbGUpIHtcbiAgICAgIGVkaXRIYW5kbGVzLnB1c2godGhpcy5fZ2V0Q3Vyc29yRWRpdEhhbmRsZShldmVudCwgc2VsZWN0ZWRGZWF0dXJlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRIYW5kbGVzOiBlZGl0SGFuZGxlcy5sZW5ndGggPyBlZGl0SGFuZGxlcyA6IG51bGxcbiAgICB9O1xuICB9O1xufVxuIl19