UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

308 lines (259 loc) 37.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AddDataButtonFactory = AddDataButtonFactory; exports.AddExternalDataButtonFactory = AddExternalDataButtonFactory; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactSortableHoc = require("react-sortable-hoc"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reselect = require("reselect"); var _dataUtils = require("../../utils/data-utils"); var _layerPanel = _interopRequireDefault(require("./layer-panel/layer-panel")); var _sourceDataCatalog = _interopRequireDefault(require("./common/source-data-catalog")); var _icons = require("../common/icons"); var _itemSelector = _interopRequireDefault(require("../common/item-selector/item-selector")); var _styledComponents2 = require("../common/styled-components"); var _defaultSettings = require("../../constants/default-settings"); var _templateObject; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } // make sure the element is always visible while is being dragged // item being dragged is appended in body, here to reset its global style var SortableStyledItem = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n z-index: ", ";\n\n &.sorting {\n pointer-events: none;\n }\n\n &.sorting-layers .layer-panel__header {\n background-color: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-size: ", ";\n line-height: ", ";\n width: 100%;\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n .layer__drag-handle {\n opacity: 1;\n color: ", ";\n }\n }\n"])), function (props) { return props.theme.dropdownWrapperZ + 1; }, function (props) { return props.theme.panelBackgroundHover; }, function (props) { return props.theme.fontFamily; }, function (props) { return props.theme.fontWeight; }, function (props) { return props.theme.fontSize; }, function (props) { return props.theme.lineHeight; }, function (props) { return props.theme.textColorHl; }); function AddDataButtonFactory() { var AddDataButton = function AddDataButton(_ref) { var onClick = _ref.onClick, isInactive = _ref.isInactive; return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { onClick: onClick, isInactive: !isInactive, width: "105px", secondary: true }, /*#__PURE__*/_react["default"].createElement(_icons.Add, { height: "12px" }), "Add Data") ); }; return AddDataButton; } function AddExternalDataButtonFactory() { var AddExternalDataButton = function AddExternalDataButton(_ref2) { var onClick = _ref2.onClick, isInactive = _ref2.isInactive; return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { onClick: onClick, isInactive: !isInactive, width: "135", margin: '0px 0px 0px 16px', secondary: true }, /*#__PURE__*/_react["default"].createElement(_icons.Add, { height: "12px" }), "Add Ext. Data") ); }; return AddExternalDataButton; } LayerManagerFactory.deps = [AddDataButtonFactory, AddExternalDataButtonFactory, _layerPanel["default"], _sourceDataCatalog["default"]]; function LayerManagerFactory(AddDataButton, AddExternalDataButton, LayerPanel, SourceDataCatalog) { var _class, _temp; // By wrapping layer panel using a sortable element we don't have to implement the drag and drop logic into the panel itself; // Developers can provide any layer panel implementation and it will still be sortable var SortableItem = (0, _reactSortableHoc.sortableElement)(function (_ref3) { var children = _ref3.children, isSorting = _ref3.isSorting; return (/*#__PURE__*/_react["default"].createElement(SortableStyledItem, { className: (0, _classnames["default"])('sortable-layer-items', { sorting: isSorting }) }, children) ); }); var SortableContainer = (0, _reactSortableHoc.sortableContainer)(function (_ref4) { var children = _ref4.children; return (/*#__PURE__*/_react["default"].createElement("div", null, children) ); }); return _temp = _class = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(LayerManager, _Component); var _super = _createSuper(LayerManager); function LayerManager() { var _this; (0, _classCallCheck2["default"])(this, LayerManager); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { isSorting: false }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerClassSelector", function (props) { return props.layerClasses; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerTypeOptionsSelector", (0, _reselect.createSelector)(_this.layerClassSelector, function (layerClasses) { return Object.keys(layerClasses).map(function (key) { var layer = new layerClasses[key](); return { id: key, label: layer.name, icon: layer.layerIcon }; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_addEmptyNewLayer", function () { _this.props.addLayer(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleSort", function (_ref5) { var oldIndex = _ref5.oldIndex, newIndex = _ref5.newIndex; _this.props.updateLayerOrder((0, _dataUtils.arrayMove)(_this.props.layerOrder, oldIndex, newIndex)); _this.setState({ isSorting: false }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSortStart", function () { _this.setState({ isSorting: true }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateBeforeSortStart", function (_ref6) { var index = _ref6.index; // if layer config is active, close it var _this$props = _this.props, layerOrder = _this$props.layerOrder, layers = _this$props.layers, layerConfigChange = _this$props.layerConfigChange; var layerIdx = layerOrder[index]; if (layers[layerIdx].config.isConfigActive) { layerConfigChange(layers[layerIdx], { isConfigActive: false }); } }); return _this; } (0, _createClass2["default"])(LayerManager, [{ key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, layers = _this$props2.layers, datasets = _this$props2.datasets, layerOrder = _this$props2.layerOrder, openModal = _this$props2.openModal, mapState = _this$props2.mapState, filters = _this$props2.filters, isPublic = _this$props2.isPublic; var defaultDataset = Object.keys(datasets)[0]; var layerTypeOptions = this.layerTypeOptionsSelector(this.props); var layerActions = { layerColorUIChange: this.props.layerColorUIChange, layerConfigChange: this.props.layerConfigChange, layerVisualChannelConfigChange: this.props.layerVisualChannelConfigChange, layerTypeChange: this.props.layerTypeChange, layerVisConfigChange: this.props.layerVisConfigChange, layerTextLabelChange: this.props.layerTextLabelChange, removeLayer: this.props.removeLayer, updateLayerData: this.props.updateLayerData }; var panelProps = { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions, mapState: mapState, filters: filters }; return (/*#__PURE__*/_react["default"].createElement("div", { className: "layer-manager" }, /*#__PURE__*/_react["default"].createElement(SourceDataCatalog, { datasets: datasets, showDatasetTable: isPublic ? this.props.showDatasetTable : false, removeDataset: this.props.removeDataset, showDeleteDataset: true }), isPublic && /*#__PURE__*/_react["default"].createElement(AddDataButton, { onClick: this.props.showAddDataModal, isInactive: !defaultDataset }), /*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelDivider, null), /*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(SortableContainer, { onSortEnd: this._handleSort, onSortStart: this._onSortStart, updateBeforeSortStart: this._updateBeforeSortStart, lockAxis: "y", helperClass: "sorting-layers", useDragHandle: true }, layerOrder.map(function (layerIdx, index) { return (/*#__PURE__*/_react["default"].createElement(SortableItem, { key: "layer-".concat(layerIdx), index: index, isSorting: _this2.state.isSorting }, /*#__PURE__*/_react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, { sortData: layerIdx, key: layers[layerIdx].id, idx: layerIdx, layer: layers[layerIdx] }))) ); }))), /*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, defaultDataset ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { onClick: this._addEmptyNewLayer, width: "105px" }, /*#__PURE__*/_react["default"].createElement(_icons.Add, { height: "12px" }), "Add Layer") : null)) ); } }]); return LayerManager; }(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", { datasets: _propTypes["default"].object.isRequired, layerBlending: _propTypes["default"].string.isRequired, layerClasses: _propTypes["default"].object.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, // functions addLayer: _propTypes["default"].func.isRequired, layerColorUIChange: _propTypes["default"].func.isRequired, layerConfigChange: _propTypes["default"].func.isRequired, layerTextLabelChange: _propTypes["default"].func.isRequired, layerVisualChannelConfigChange: _propTypes["default"].func.isRequired, layerTypeChange: _propTypes["default"].func.isRequired, layerVisConfigChange: _propTypes["default"].func.isRequired, openModal: _propTypes["default"].func.isRequired, removeLayer: _propTypes["default"].func.isRequired, removeDataset: _propTypes["default"].func.isRequired, showDatasetTable: _propTypes["default"].func.isRequired, updateLayerBlending: _propTypes["default"].func.isRequired, updateLayerOrder: _propTypes["default"].func.isRequired, updateLayerData: _propTypes["default"].func.isRequired, axiosAPICAll: _propTypes["default"].func.isRequired }), _temp; } var _default = exports["default"] = LayerManagerFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJTb3J0YWJsZVN0eWxlZEl0ZW0iLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwiZHJvcGRvd25XcmFwcGVyWiIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiZm9udEZhbWlseSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImxpbmVIZWlnaHQiLCJ0ZXh0Q29sb3JIbCIsIkFkZERhdGFCdXR0b25GYWN0b3J5IiwiQWRkRGF0YUJ1dHRvbiIsIm9uQ2xpY2siLCJpc0luYWN0aXZlIiwiQWRkRXh0ZXJuYWxEYXRhQnV0dG9uRmFjdG9yeSIsIkFkZEV4dGVybmFsRGF0YUJ1dHRvbiIsIkxheWVyTWFuYWdlckZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkiLCJMYXllclBhbmVsIiwiU291cmNlRGF0YUNhdGFsb2ciLCJTb3J0YWJsZUl0ZW0iLCJjaGlsZHJlbiIsImlzU29ydGluZyIsInNvcnRpbmciLCJTb3J0YWJsZUNvbnRhaW5lciIsImxheWVyQ2xhc3NlcyIsImxheWVyQ2xhc3NTZWxlY3RvciIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJsYXllciIsImlkIiwibGFiZWwiLCJuYW1lIiwiaWNvbiIsImxheWVySWNvbiIsImFkZExheWVyIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsInVwZGF0ZUxheWVyT3JkZXIiLCJsYXllck9yZGVyIiwic2V0U3RhdGUiLCJpbmRleCIsImxheWVycyIsImxheWVyQ29uZmlnQ2hhbmdlIiwibGF5ZXJJZHgiLCJjb25maWciLCJpc0NvbmZpZ0FjdGl2ZSIsImRhdGFzZXRzIiwib3Blbk1vZGFsIiwibWFwU3RhdGUiLCJmaWx0ZXJzIiwiaXNQdWJsaWMiLCJkZWZhdWx0RGF0YXNldCIsImxheWVyVHlwZU9wdGlvbnMiLCJsYXllclR5cGVPcHRpb25zU2VsZWN0b3IiLCJsYXllckFjdGlvbnMiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJsYXllclR5cGVDaGFuZ2UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsImxheWVyVGV4dExhYmVsQ2hhbmdlIiwicmVtb3ZlTGF5ZXIiLCJ1cGRhdGVMYXllckRhdGEiLCJwYW5lbFByb3BzIiwic2hvd0RhdGFzZXRUYWJsZSIsInJlbW92ZURhdGFzZXQiLCJzaG93QWRkRGF0YU1vZGFsIiwiX2hhbmRsZVNvcnQiLCJfb25Tb3J0U3RhcnQiLCJfdXBkYXRlQmVmb3JlU29ydFN0YXJ0Iiwic3RhdGUiLCJfYWRkRW1wdHlOZXdMYXllciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJsYXllckJsZW5kaW5nIiwic3RyaW5nIiwiYXJyYXlPZiIsImFueSIsImZ1bmMiLCJ1cGRhdGVMYXllckJsZW5kaW5nIiwiYXhpb3NBUElDQWxsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU9BOzs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0EsSUFBTUEsa0JBQWtCLEdBQUdDLDZCQUFPQyxHQUFWLGdmQUNYLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsZ0JBQVosR0FBK0IsQ0FBbkM7QUFBQSxDQURNLEVBUUEsVUFBQUYsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZRSxvQkFBaEI7QUFBQSxDQVJMLEVBU0wsVUFBQUgsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZRyxVQUFoQjtBQUFBLENBVEEsRUFVTCxVQUFBSixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlJ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QUFVTyxJQUFWLENBQWVMLFVBWGY7QUFZakJoQixJQUFBQSxvQkFBb0IsRUFBRWMsc0JBQVVPLElBQVYsQ0FBZUwsVUFacEI7QUFhakIzQixJQUFBQSxTQUFTLEVBQUV5QixzQkFBVU8sSUFBVixDQUFlTCxVQWJUO0FBY2pCZCxJQUFBQSxXQUFXLEVBQUVZLHNCQUFVTyxJQUFWLENBQWVMLFVBZFg7QUFlakJWLElBQUFBLGFBQWEsRUFBRVEsc0JBQVVPLElBQVYsQ0FBZUwsVUFmYjtBQWdCakJYLElBQUFBLGdCQUFnQixFQUFFUyxzQkFBVU8sSUFBVixDQUFlTCxVQWhCaEI7QUFpQmpCTSxJQUFBQSxtQkFBbUIsRUFBRVIsc0JBQVVPLElBQVYsQ0FBZUwsVUFqQm5CO0FBa0JqQnJDLElBQUFBLGdCQUFnQixFQUFFbUMsc0JBQVVPLElBQVYsQ0FBZUwsVUFsQmhCO0FBbUJqQmIsSUFBQUEsZUFBZSxFQUFFVyxzQkFBVU8sSUFBVixDQUFlTCxVQW5CZjtBQW9CakJPLElBQUFBLFlBQVksRUFBRVQsc0JBQVVPLElBQVYsQ0FBZUw7QUFwQlosR0FEckI7QUE2SkQ7O29DQUVjL0QsbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtzb3J0YWJsZUNvbnRhaW5lciwgc29ydGFibGVFbGVtZW50fSBmcm9tICdyZWFjdC1zb3J0YWJsZS1ob2MnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQge2FycmF5TW92ZX0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5cbmltcG9ydCBMYXllclBhbmVsRmFjdG9yeSBmcm9tICcuL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsJztcbmltcG9ydCBTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkgZnJvbSAnLi9jb21tb24vc291cmNlLWRhdGEtY2F0YWxvZyc7XG5pbXBvcnQge0FkZH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IEl0ZW1TZWxlY3RvciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2l0ZW0tc2VsZWN0b3InO1xuaW1wb3J0IHtcbiAgUGFuZWxMYWJlbCxcbiAgU2lkZVBhbmVsRGl2aWRlcixcbiAgU2lkZVBhbmVsU2VjdGlvbixcbiAgQnV0dG9uXG59IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtMQVlFUl9CTEVORElOR1N9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFsd2F5cyB2aXNpYmxlIHdoaWxlIGlzIGJlaW5nIGRyYWdnZWRcbi8vIGl0ZW0gYmVpbmcgZHJhZ2dlZCBpcyBhcHBlbmRlZCBpbiBib2R5LCBoZXJlIHRvIHJlc2V0IGl0cyBnbG9iYWwgc3R5bGVcbmNvbnN0IFNvcnRhYmxlU3R5bGVkSXRlbSA9IHN0eWxlZC5kaXZgXG4gIHotaW5kZXg6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25XcmFwcGVyWiArIDF9O1xuXG4gICYuc29ydGluZyB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAmLnNvcnRpbmctbGF5ZXJzIC5sYXllci1wYW5lbF9faGVhZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBmb250LWZhbWlseTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250RmFtaWx5fTtcbiAgICBmb250LXdlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250V2VpZ2h0fTtcbiAgICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udFNpemV9O1xuICAgIGxpbmUtaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmVIZWlnaHR9O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgICosXG4gICAgKjpiZWZvcmUsXG4gICAgKjphZnRlciB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cbiAgICAubGF5ZXJfX2RyYWctaGFuZGxlIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gQWRkRGF0YUJ1dHRvbkZhY3RvcnkoKSB7XG4gIGNvbnN0IEFkZERhdGFCdXR0b24gPSAoe29uQ2xpY2ssIGlzSW5hY3RpdmV9KSA9PiAoXG4gICAgPEJ1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfSBpc0luYWN0aXZlPXshaXNJbmFjdGl2ZX0gd2lkdGg9XCIxMDVweFwiIHNlY29uZGFyeT5cbiAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICBBZGQgRGF0YVxuICAgIDwvQnV0dG9uPlxuICApO1xuICByZXR1cm4gQWRkRGF0YUJ1dHRvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEFkZEV4dGVybmFsRGF0YUJ1dHRvbkZhY3RvcnkoKSB7XG4gIGNvbnN0IEFkZEV4dGVybmFsRGF0YUJ1dHRvbiA9ICh7b25DbGljaywgaXNJbmFjdGl2ZX0pID0+IChcbiAgICA8QnV0dG9uXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgaXNJbmFjdGl2ZT17IWlzSW5hY3RpdmV9XG4gICAgICB3aWR0aD1cIjEzNVwiXG4gICAgICBtYXJnaW49eycwcHggMHB4IDBweCAxNnB4J31cbiAgICAgIHNlY29uZGFyeVxuICAgID5cbiAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICBBZGQgRXh0LiBEYXRhXG4gICAgPC9CdXR0b24+XG4gICk7XG4gIHJldHVybiBBZGRFeHRlcm5hbERhdGFCdXR0b247XG59XG5cbkxheWVyTWFuYWdlckZhY3RvcnkuZGVwcyA9IFtcbiAgQWRkRGF0YUJ1dHRvbkZhY3RvcnksXG4gIEFkZEV4dGVybmFsRGF0YUJ1dHRvbkZhY3RvcnksXG4gIExheWVyUGFuZWxGYWN0b3J5LFxuICBTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3Rvcnlcbl07XG5cbmZ1bmN0aW9uIExheWVyTWFuYWdlckZhY3RvcnkoXG4gIEFkZERhdGFCdXR0b24sXG4gIEFkZEV4dGVybmFsRGF0YUJ1dHRvbixcbiAgTGF5ZXJQYW5lbCxcbiAgU291cmNlRGF0YUNhdGFsb2dcbikge1xuICAvLyBCeSB3cmFwcGluZyBsYXllciBwYW5lbCB1c2luZyBhIHNvcnRhYmxlIGVsZW1lbnQgd2UgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGRyYWcgYW5kIGRyb3AgbG9naWMgaW50byB0aGUgcGFuZWwgaXRzZWxmO1xuICAvLyBEZXZlbG9wZXJzIGNhbiBwcm92aWRlIGFueSBsYXllciBwYW5lbCBpbXBsZW1lbnRhdGlvbiBhbmQgaXQgd2lsbCBzdGlsbCBiZSBzb3J0YWJsZVxuICBjb25zdCBTb3J0YWJsZUl0ZW0gPSBzb3J0YWJsZUVsZW1lbnQoKHtjaGlsZHJlbiwgaXNTb3J0aW5nfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U29ydGFibGVTdHlsZWRJdGVtXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnc29ydGFibGUtbGF5ZXItaXRlbXMnLCB7c29ydGluZzogaXNTb3J0aW5nfSl9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvU29ydGFibGVTdHlsZWRJdGVtPlxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IFNvcnRhYmxlQ29udGFpbmVyID0gc29ydGFibGVDb250YWluZXIoKHtjaGlsZHJlbn0pID0+IHtcbiAgICByZXR1cm4gPGRpdj57Y2hpbGRyZW59PC9kaXY+O1xuICB9KTtcblxuICByZXR1cm4gY2xhc3MgTGF5ZXJNYW5hZ2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuICAgICAgLy8gZnVuY3Rpb25zXG4gICAgICBhZGRMYXllcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29uZmlnQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJUZXh0TGFiZWxDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclR5cGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9wZW5Nb2RhbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZUxheWVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgcmVtb3ZlRGF0YXNldDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB1cGRhdGVMYXllckJsZW5kaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgdXBkYXRlTGF5ZXJPcmRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUxheWVyRGF0YTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGF4aW9zQVBJQ0FsbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH07XG4gICAgc3RhdGUgPSB7XG4gICAgICBpc1NvcnRpbmc6IGZhbHNlXG4gICAgfTtcblxuICAgIGxheWVyQ2xhc3NTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmxheWVyQ2xhc3NlcztcbiAgICBsYXllclR5cGVPcHRpb25zU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMubGF5ZXJDbGFzc1NlbGVjdG9yLFxuICAgICAgbGF5ZXJDbGFzc2VzID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGxheWVyQ2xhc3NlcykubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgbGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW2tleV0oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgICAgIGxhYmVsOiBsYXllci5uYW1lLFxuICAgICAgICAgICAgaWNvbjogbGF5ZXIubGF5ZXJJY29uXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgX2FkZEVtcHR5TmV3TGF5ZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmFkZExheWVyKCk7XG4gICAgfTtcblxuICAgIF9oYW5kbGVTb3J0ID0gKHtvbGRJbmRleCwgbmV3SW5kZXh9KSA9PiB7XG4gICAgICB0aGlzLnByb3BzLnVwZGF0ZUxheWVyT3JkZXIoXG4gICAgICAgIGFycmF5TW92ZSh0aGlzLnByb3BzLmxheWVyT3JkZXIsIG9sZEluZGV4LCBuZXdJbmRleClcbiAgICAgICk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpc1NvcnRpbmc6IGZhbHNlfSk7XG4gICAgfTtcblxuICAgIF9vblNvcnRTdGFydCA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzU29ydGluZzogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICBfdXBkYXRlQmVmb3JlU29ydFN0YXJ0ID0gKHtpbmRleH0pID0+IHtcbiAgICAgIC8vIGlmIGxheWVyIGNvbmZpZyBpcyBhY3RpdmUsIGNsb3NlIGl0XG4gICAgICBjb25zdCB7bGF5ZXJPcmRlciwgbGF5ZXJzLCBsYXllckNvbmZpZ0NoYW5nZX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgbGF5ZXJJZHggPSBsYXllck9yZGVyW2luZGV4XTtcbiAgICAgIGlmIChsYXllcnNbbGF5ZXJJZHhdLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZSkge1xuICAgICAgICBsYXllckNvbmZpZ0NoYW5nZShsYXllcnNbbGF5ZXJJZHhdLCB7aXNDb25maWdBY3RpdmU6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgbGF5ZXJPcmRlcixcbiAgICAgICAgb3Blbk1vZGFsLFxuICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgaXNQdWJsaWNcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF07XG4gICAgICBjb25zdCBsYXllclR5cGVPcHRpb25zID0gdGhpcy5sYXllclR5cGVPcHRpb25zU2VsZWN0b3IodGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBsYXllckFjdGlvbnMgPSB7XG4gICAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogdGhpcy5wcm9wcy5sYXllckNvbG9yVUlDaGFuZ2UsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IHRoaXMucHJvcHNcbiAgICAgICAgICAubGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclR5cGVDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJUeXBlQ2hhbmdlLFxuICAgICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogdGhpcy5wcm9wcy5sYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUZXh0TGFiZWxDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UsXG4gICAgICAgIHJlbW92ZUxheWVyOiB0aGlzLnByb3BzLnJlbW92ZUxheWVyLFxuICAgICAgICB1cGRhdGVMYXllckRhdGE6IHRoaXMucHJvcHMudXBkYXRlTGF5ZXJEYXRhXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYW5lbFByb3BzID0ge1xuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgb3Blbk1vZGFsLFxuICAgICAgICBsYXllclR5cGVPcHRpb25zLFxuICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgZmlsdGVyc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYXllci1tYW5hZ2VyXCI+XG4gICAgICAgICAgPFNvdXJjZURhdGFDYXRhbG9nXG4gICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICBzaG93RGF0YXNldFRhYmxlPXtpc1B1YmxpYyA/IHRoaXMucHJvcHMuc2hvd0RhdGFzZXRUYWJsZSA6IGZhbHNlfVxuICAgICAgICAgICAgcmVtb3ZlRGF0YXNldD17dGhpcy5wcm9wcy5yZW1vdmVEYXRhc2V0fVxuICAgICAgICAgICAgc2hvd0RlbGV0ZURhdGFzZXRcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAge2lzUHVibGljICYmIChcbiAgICAgICAgICAgIDxBZGREYXRhQnV0dG9uXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0FkZERhdGFNb2RhbH1cbiAgICAgICAgICAgICAgaXNJbmFjdGl2ZT17IWRlZmF1bHREYXRhc2V0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgey8qIDxBZGRFeHRlcm5hbERhdGFCdXR0b25cbiAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0FkZEV4dGVybmFsRGF0YU1vZGFsfVxuICAgICAgICAgICAgaXNJbmFjdGl2ZT17IWRlZmF1bHREYXRhc2V0fVxuICAgICAgICAgIC8+ICovfVxuICAgICAgICAgIDxTaWRlUGFuZWxEaXZpZGVyIC8+XG4gICAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgICA8U29ydGFibGVDb250YWluZXJcbiAgICAgICAgICAgICAgb25Tb3J0RW5kPXt0aGlzLl9oYW5kbGVTb3J0fVxuICAgICAgICAgICAgICBvblNvcnRTdGFydD17dGhpcy5fb25Tb3J0U3RhcnR9XG4gICAgICAgICAgICAgIHVwZGF0ZUJlZm9yZVNvcnRTdGFydD17dGhpcy5fdXBkYXRlQmVmb3JlU29ydFN0YXJ0fVxuICAgICAgICAgICAgICBsb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICBoZWxwZXJDbGFzcz1cInNvcnRpbmctbGF5ZXJzXCJcbiAgICAgICAgICAgICAgdXNlRHJhZ0hhbmRsZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bGF5ZXJPcmRlci5tYXAoKGxheWVySWR4LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxTb3J0YWJsZUl0ZW1cbiAgICAgICAgICAgICAgICAgIGtleT17YGxheWVyLSR7bGF5ZXJJZHh9YH1cbiAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIGlzU29ydGluZz17dGhpcy5zdGF0ZS5pc1NvcnRpbmd9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPExheWVyUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5sYXllckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIHNvcnREYXRhPXtsYXllcklkeH1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtsYXllcnNbbGF5ZXJJZHhdLmlkfVxuICAgICAgICAgICAgICAgICAgICBpZHg9e2xheWVySWR4fVxuICAgICAgICAgICAgICAgICAgICBsYXllcj17bGF5ZXJzW2xheWVySWR4XX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9Tb3J0YWJsZUl0ZW0+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9Tb3J0YWJsZUNvbnRhaW5lcj5cbiAgICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgICB7ZGVmYXVsdERhdGFzZXQgPyAoXG4gICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy5fYWRkRW1wdHlOZXdMYXllcn0gd2lkdGg9XCIxMDVweFwiPlxuICAgICAgICAgICAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAgICAgICAgQWRkIExheWVyXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllck1hbmFnZXJGYWN0b3J5O1xuIl19