UNPKG

kepler.gl

Version:

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

203 lines (202 loc) 37.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl"); var _styledComponents = require("../common/styled-components"); var _sourceDataCatalog = _interopRequireDefault(require("./common/source-data-catalog")); var _filterPanel = _interopRequireDefault(require("./filter-panel/filter-panel")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _panelViewListToggle = _interopRequireDefault(require("./panel-view-list-toggle")); var _panelTitle = _interopRequireDefault(require("./panel-title")); var _addFilterButton = _interopRequireDefault(require("./filter-panel/add-filter-button")); var _datasetSection = _interopRequireDefault(require("./layer-panel/dataset-section")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project FilterManagerFactory.deps = [_datasetSection["default"], _filterPanel["default"], _panelTitle["default"], _addFilterButton["default"], _panelViewListToggle["default"], _sourceDataCatalog["default"]]; function FilterManagerFactory(DatasetSection, FilterPanel, PanelTitle, AddFilterButton, PanelViewListToggle, SourceDataCatalog) { var FilterList = function FilterList(_ref) { var filtersByIndex = _ref.filtersByIndex, filters = _ref.filters, datasets = _ref.datasets, layers = _ref.layers, isAnyFilterAnimating = _ref.isAnyFilterAnimating, visStateActions = _ref.visStateActions; var _removeFilter = visStateActions.removeFilter, setFilter = visStateActions.setFilter, setFilterPlot = visStateActions.setFilterPlot, toggleFilterAnimation = visStateActions.toggleFilterAnimation, _toggleFilterFeature = visStateActions.toggleFilterFeature, setFilterView = visStateActions.setFilterView, syncTimeFilterWithLayerTimeline = visStateActions.syncTimeFilterWithLayerTimeline; var filterPanelCallbacks = (0, _react.useMemo)(function () { return filtersByIndex.reduce(function (accu, _ref2) { var filter = _ref2.filter, idx = _ref2.idx; return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, filter.id, { removeFilter: function removeFilter() { return _removeFilter(idx); }, toggleFilterView: function toggleFilterView() { return setFilterView(idx, (0, _src2.isSideFilter)(filter) ? _src.FILTER_VIEW_TYPES.enlarged : _src.FILTER_VIEW_TYPES.side); }, toggleAnimation: function toggleAnimation() { return toggleFilterAnimation(idx); }, toggleFilterFeature: function toggleFilterFeature() { return _toggleFilterFeature(idx); } })); }, {}); }, [filtersByIndex, _removeFilter, setFilterView, toggleFilterAnimation, _toggleFilterFeature]); return /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, (0, _toConsumableArray2["default"])(filtersByIndex).reverse().map(function (_ref3) { var filter = _ref3.filter, idx = _ref3.idx; return /*#__PURE__*/_react["default"].createElement(FilterPanel, { key: "".concat(filter.id, "-").concat(idx), idx: idx, filters: filters, filter: filter, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, removeFilter: filterPanelCallbacks[filter.id].removeFilter, enlargeFilter: filterPanelCallbacks[filter.id].toggleFilterView, toggleAnimation: filterPanelCallbacks[filter.id].toggleAnimation, toggleFilterFeature: filterPanelCallbacks[filter.id].toggleFilterFeature, setFilter: setFilter, setFilterPlot: setFilterPlot, syncTimeFilterWithLayerTimeline: syncTimeFilterWithLayerTimeline }); })); }; var DatasetFilterSection = function DatasetFilterSection(_ref4) { var filtersByIndex = _ref4.filtersByIndex, filters = _ref4.filters, dataset = _ref4.dataset, datasets = _ref4.datasets, layers = _ref4.layers, isAnyFilterAnimating = _ref4.isAnyFilterAnimating, visStateActions = _ref4.visStateActions, showDatasetTable = _ref4.showDatasetTable, updateTableColor = _ref4.updateTableColor, removeDataset = _ref4.removeDataset, showDeleteDataset = _ref4.showDeleteDataset; var datasetCatalog = (0, _react.useMemo)(function () { return (0, _defineProperty2["default"])({}, dataset.id, dataset); }, [dataset]); return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(SourceDataCatalog, { datasets: datasetCatalog, showDatasetTable: showDatasetTable, updateTableColor: updateTableColor, removeDataset: removeDataset, showDeleteDataset: showDeleteDataset }), /*#__PURE__*/_react["default"].createElement(FilterList, { filtersByIndex: filtersByIndex, filters: filters, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, visStateActions: visStateActions })); }; var FilterManager = function FilterManager(_ref6) { var _ref6$filters = _ref6.filters, filters = _ref6$filters === void 0 ? [] : _ref6$filters, datasets = _ref6.datasets, layers = _ref6.layers, showDatasetTable = _ref6.showDatasetTable, updateTableColor = _ref6.updateTableColor, removeDataset = _ref6.removeDataset, showAddDataModal = _ref6.showAddDataModal, panelMetadata = _ref6.panelMetadata, panelListView = _ref6.panelListView, visStateActions = _ref6.visStateActions, uiStateActions = _ref6.uiStateActions; var addFilter = visStateActions.addFilter; var togglePanelListView = uiStateActions.togglePanelListView; var isAnyFilterAnimating = filters.some(function (f) { return f.isAnimating; }); var onClickAddFilter = (0, _react.useCallback)(function (dataset) { return addFilter(dataset); }, [addFilter]); var isSortByDatasetMode = panelListView === _src.PANEL_VIEW_TOGGLES.byDataset; var filtersByIndex = (0, _react.useMemo)(function () { return filters.map(function (f, idx) { return { filter: f, idx: idx }; }); }, [filters]); var filtersByDatasets = (0, _react.useMemo)(function () { return Object.keys(datasets).reduce(function (accu, dataId) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, dataId, filtersByIndex.filter(function (fidx) { return fidx.filter.dataId && fidx.filter.dataId[0] === dataId; }))); }, {}); }, [datasets, filtersByIndex]); var _TogglePanelListView = (0, _react.useCallback)(function (listView) { togglePanelListView({ panelId: 'filter', listView: listView }); }, [togglePanelListView]); var intl = (0, _reactIntl.useIntl)(); var filterListProps = { datasets: datasets, filters: filters, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, visStateActions: visStateActions }; var sourceDataCatalogProps = { showDatasetTable: showDatasetTable, updateTableColor: updateTableColor, removeDataset: removeDataset, showDeleteDataset: true }; return /*#__PURE__*/_react["default"].createElement("div", { className: "filter-manager" }, /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(PanelViewListToggle, { togglePanelListView: _TogglePanelListView, mode: panelListView })), /*#__PURE__*/_react["default"].createElement(DatasetSection, (0, _extends2["default"])({ datasets: datasets }, sourceDataCatalogProps, { showDatasetList: !isSortByDatasetMode, showAddDataModal: showAddDataModal })), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelDivider, null), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(PanelTitle, { className: "filter-manager-title", title: intl.formatMessage({ id: panelMetadata.label }) }, /*#__PURE__*/_react["default"].createElement(AddFilterButton, { datasets: datasets, onAdd: onClickAddFilter }))), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, isSortByDatasetMode ? Object.keys(filtersByDatasets).map(function (dataId) { return /*#__PURE__*/_react["default"].createElement(DatasetFilterSection, (0, _extends2["default"])({ key: dataId, filtersByIndex: filtersByDatasets[dataId], dataset: datasets[dataId] }, filterListProps, sourceDataCatalogProps)); }) : /*#__PURE__*/_react["default"].createElement(FilterList, (0, _extends2["default"])({ filtersByIndex: filtersByIndex }, filterListProps)))); }; return FilterManager; } var _default = exports["default"] = FilterManagerFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RJbnRsIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc291cmNlRGF0YUNhdGFsb2ciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2ZpbHRlclBhbmVsIiwiX3NyYyIsIl9zcmMyIiwiX3BhbmVsVmlld0xpc3RUb2dnbGUiLCJfcGFuZWxUaXRsZSIsIl9hZGRGaWx0ZXJCdXR0b24iLCJfZGF0YXNldFNlY3Rpb24iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJGaWx0ZXJNYW5hZ2VyRmFjdG9yeSIsImRlcHMiLCJEYXRhc2V0U2VjdGlvbkZhY3RvcnkiLCJGaWx0ZXJQYW5lbEZhY3RvcnkiLCJQYW5lbFRpdGxlRmFjdG9yeSIsIkFkZEZpbHRlckJ1dHRvbkZhY3RvcnkiLCJQYW5lbFZpZXdMaXN0VG9nZ2xlRmFjdG9yeSIsIlNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeSIsIkRhdGFzZXRTZWN0aW9uIiwiRmlsdGVyUGFuZWwiLCJQYW5lbFRpdGxlIiwiQWRkRmlsdGVyQnV0dG9uIiwiUGFuZWxWaWV3TGlzdFRvZ2dsZSIsIlNvdXJjZURhdGFDYXRhbG9nIiwiRmlsdGVyTGlzdCIsIl9yZWYiLCJmaWx0ZXJzQnlJbmRleCIsImZpbHRlcnMiLCJkYXRhc2V0cyIsImxheWVycyIsImlzQW55RmlsdGVyQW5pbWF0aW5nIiwidmlzU3RhdGVBY3Rpb25zIiwicmVtb3ZlRmlsdGVyIiwic2V0RmlsdGVyIiwic2V0RmlsdGVyUGxvdCIsInRvZ2dsZUZpbHRlckFuaW1hdGlvbiIsInRvZ2dsZUZpbHRlckZlYXR1cmUiLCJzZXRGaWx0ZXJWaWV3Iiwic3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZSIsImZpbHRlclBhbmVsQ2FsbGJhY2tzIiwidXNlTWVtbyIsInJlZHVjZSIsImFjY3UiLCJfcmVmMiIsImlkeCIsImlkIiwidG9nZ2xlRmlsdGVyVmlldyIsImlzU2lkZUZpbHRlciIsIkZJTFRFUl9WSUVXX1RZUEVTIiwiZW5sYXJnZWQiLCJzaWRlIiwidG9nZ2xlQW5pbWF0aW9uIiwiY3JlYXRlRWxlbWVudCIsIlNpZGVQYW5lbFNlY3Rpb24iLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmV2ZXJzZSIsIm1hcCIsIl9yZWYzIiwia2V5IiwiY29uY2F0IiwiZW5sYXJnZUZpbHRlciIsIkRhdGFzZXRGaWx0ZXJTZWN0aW9uIiwiX3JlZjQiLCJkYXRhc2V0Iiwic2hvd0RhdGFzZXRUYWJsZSIsInVwZGF0ZVRhYmxlQ29sb3IiLCJyZW1vdmVEYXRhc2V0Iiwic2hvd0RlbGV0ZURhdGFzZXQiLCJkYXRhc2V0Q2F0YWxvZyIsIkZyYWdtZW50IiwiRmlsdGVyTWFuYWdlciIsIl9yZWY2IiwiX3JlZjYkZmlsdGVycyIsInNob3dBZGREYXRhTW9kYWwiLCJwYW5lbE1ldGFkYXRhIiwicGFuZWxMaXN0VmlldyIsInVpU3RhdGVBY3Rpb25zIiwiYWRkRmlsdGVyIiwidG9nZ2xlUGFuZWxMaXN0VmlldyIsInNvbWUiLCJmIiwiaXNBbmltYXRpbmciLCJvbkNsaWNrQWRkRmlsdGVyIiwidXNlQ2FsbGJhY2siLCJpc1NvcnRCeURhdGFzZXRNb2RlIiwiUEFORUxfVklFV19UT0dHTEVTIiwiYnlEYXRhc2V0IiwiZmlsdGVyc0J5RGF0YXNldHMiLCJkYXRhSWQiLCJmaWR4IiwiX1RvZ2dsZVBhbmVsTGlzdFZpZXciLCJsaXN0VmlldyIsInBhbmVsSWQiLCJpbnRsIiwidXNlSW50bCIsImZpbHRlckxpc3RQcm9wcyIsInNvdXJjZURhdGFDYXRhbG9nUHJvcHMiLCJjbGFzc05hbWUiLCJtb2RlIiwiX2V4dGVuZHMyIiwic2hvd0RhdGFzZXRMaXN0IiwiU2lkZVBhbmVsRGl2aWRlciIsInRpdGxlIiwiZm9ybWF0TWVzc2FnZSIsImxhYmVsIiwib25BZGQiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvc2lkZS1wYW5lbC9maWx0ZXItbWFuYWdlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1NpZGVQYW5lbERpdmlkZXIsIFNpZGVQYW5lbFNlY3Rpb259IGZyb20gJy4uL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgU291cmNlRGF0YUNhdGFsb2dGYWN0b3J5IGZyb20gJy4vY29tbW9uL3NvdXJjZS1kYXRhLWNhdGFsb2cnO1xuaW1wb3J0IEZpbHRlclBhbmVsRmFjdG9yeSBmcm9tICcuL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwnO1xuaW1wb3J0IHtGSUxURVJfVklFV19UWVBFUywgUEFORUxfVklFV19UT0dHTEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2lzU2lkZUZpbHRlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge1Zpc1N0YXRlQWN0aW9ucywgQWN0aW9uSGFuZGxlciwgVUlTdGF0ZUFjdGlvbnMsIEFjdGlvbkhhbmRsZXJzfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmltcG9ydCBQYW5lbFZpZXdMaXN0VG9nZ2xlRmFjdG9yeSBmcm9tICcuL3BhbmVsLXZpZXctbGlzdC10b2dnbGUnO1xuaW1wb3J0IFBhbmVsVGl0bGVGYWN0b3J5IGZyb20gJy4vcGFuZWwtdGl0bGUnO1xuaW1wb3J0IEFkZEZpbHRlckJ1dHRvbkZhY3RvcnkgZnJvbSAnLi9maWx0ZXItcGFuZWwvYWRkLWZpbHRlci1idXR0b24nO1xuaW1wb3J0IERhdGFzZXRTZWN0aW9uRmFjdG9yeSBmcm9tICcuL2xheWVyLXBhbmVsL2RhdGFzZXQtc2VjdGlvbic7XG5pbXBvcnQge1BhbmVsTWV0YX0gZnJvbSAnLi9jb21tb24vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBWaXNTdGF0ZUFjdGlvbkhhbmRsZXJzID0gQWN0aW9uSGFuZGxlcnM8dHlwZW9mIFZpc1N0YXRlQWN0aW9ucz47XG5leHBvcnQgdHlwZSBVaVN0YXRlQWN0aW9uSGFuZGxlcnMgPSBBY3Rpb25IYW5kbGVyczx0eXBlb2YgVUlTdGF0ZUFjdGlvbnM+O1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJNYW5hZ2VyUHJvcHMgPSB7XG4gIGZpbHRlcnM6IEZpbHRlcltdO1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgc2hvd0RhdGFzZXRUYWJsZTogQWN0aW9uSGFuZGxlcjx0eXBlb2YgVmlzU3RhdGVBY3Rpb25zLnNob3dEYXRhc2V0VGFibGU+O1xuICB1cGRhdGVUYWJsZUNvbG9yOiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBWaXNTdGF0ZUFjdGlvbnMudXBkYXRlVGFibGVDb2xvcj47XG4gIHJlbW92ZURhdGFzZXQ6IEFjdGlvbkhhbmRsZXI8dHlwZW9mIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0PjtcbiAgc2hvd0FkZERhdGFNb2RhbDogKCkgPT4gdm9pZDtcblxuICBwYW5lbE1ldGFkYXRhOiBQYW5lbE1ldGE7XG4gIHBhbmVsTGlzdFZpZXc6IHN0cmluZztcbiAgdmlzU3RhdGVBY3Rpb25zOiBWaXNTdGF0ZUFjdGlvbkhhbmRsZXJzO1xuICB1aVN0YXRlQWN0aW9uczogVWlTdGF0ZUFjdGlvbkhhbmRsZXJzO1xufTtcblxudHlwZSBGaWx0ZXJMaXN0UHJvcHMgPSB7XG4gIGZpbHRlcnM6IEZpbHRlcltdO1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgZmlsdGVyc0J5SW5kZXg6IHtcbiAgICBmaWx0ZXI6IEZpbHRlcjtcbiAgICBpZHg6IG51bWJlcjtcbiAgfVtdO1xuICBpc0FueUZpbHRlckFuaW1hdGluZzogYm9vbGVhbjtcbiAgdmlzU3RhdGVBY3Rpb25zOiBWaXNTdGF0ZUFjdGlvbkhhbmRsZXJzO1xufTtcblxuRmlsdGVyTWFuYWdlckZhY3RvcnkuZGVwcyA9IFtcbiAgRGF0YXNldFNlY3Rpb25GYWN0b3J5LFxuICBGaWx0ZXJQYW5lbEZhY3RvcnksXG4gIFBhbmVsVGl0bGVGYWN0b3J5LFxuICBBZGRGaWx0ZXJCdXR0b25GYWN0b3J5LFxuICBQYW5lbFZpZXdMaXN0VG9nZ2xlRmFjdG9yeSxcbiAgU291cmNlRGF0YUNhdGFsb2dGYWN0b3J5XG5dO1xuXG5mdW5jdGlvbiBGaWx0ZXJNYW5hZ2VyRmFjdG9yeShcbiAgRGF0YXNldFNlY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIERhdGFzZXRTZWN0aW9uRmFjdG9yeT4sXG4gIEZpbHRlclBhbmVsOiBSZXR1cm5UeXBlPHR5cGVvZiBGaWx0ZXJQYW5lbEZhY3Rvcnk+LFxuICBQYW5lbFRpdGxlOiBSZXR1cm5UeXBlPHR5cGVvZiBQYW5lbFRpdGxlRmFjdG9yeT4sXG4gIEFkZEZpbHRlckJ1dHRvbjogUmV0dXJuVHlwZTx0eXBlb2YgQWRkRmlsdGVyQnV0dG9uRmFjdG9yeT4sXG4gIFBhbmVsVmlld0xpc3RUb2dnbGU6IFJldHVyblR5cGU8dHlwZW9mIFBhbmVsVmlld0xpc3RUb2dnbGVGYWN0b3J5PixcbiAgU291cmNlRGF0YUNhdGFsb2c6IFJldHVyblR5cGU8dHlwZW9mIFNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeT5cbikge1xuICBjb25zdCBGaWx0ZXJMaXN0ID0gKHtcbiAgICBmaWx0ZXJzQnlJbmRleCxcbiAgICBmaWx0ZXJzLFxuICAgIGRhdGFzZXRzLFxuICAgIGxheWVycyxcbiAgICBpc0FueUZpbHRlckFuaW1hdGluZyxcbiAgICB2aXNTdGF0ZUFjdGlvbnNcbiAgfTogRmlsdGVyTGlzdFByb3BzKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVtb3ZlRmlsdGVyLFxuICAgICAgc2V0RmlsdGVyLFxuICAgICAgc2V0RmlsdGVyUGxvdCxcbiAgICAgIHRvZ2dsZUZpbHRlckFuaW1hdGlvbixcbiAgICAgIHRvZ2dsZUZpbHRlckZlYXR1cmUsXG4gICAgICBzZXRGaWx0ZXJWaWV3LFxuICAgICAgc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVxuICAgIH0gPSB2aXNTdGF0ZUFjdGlvbnM7XG5cbiAgICBjb25zdCBmaWx0ZXJQYW5lbENhbGxiYWNrcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpbHRlcnNCeUluZGV4LnJlZHVjZShcbiAgICAgICAgKGFjY3UsIHtmaWx0ZXIsIGlkeH0pID0+ICh7XG4gICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICBbZmlsdGVyLmlkXToge1xuICAgICAgICAgICAgcmVtb3ZlRmlsdGVyOiAoKSA9PiByZW1vdmVGaWx0ZXIoaWR4KSxcbiAgICAgICAgICAgIHRvZ2dsZUZpbHRlclZpZXc6ICgpID0+XG4gICAgICAgICAgICAgIHNldEZpbHRlclZpZXcoXG4gICAgICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgICAgIGlzU2lkZUZpbHRlcihmaWx0ZXIpID8gRklMVEVSX1ZJRVdfVFlQRVMuZW5sYXJnZWQgOiBGSUxURVJfVklFV19UWVBFUy5zaWRlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB0b2dnbGVBbmltYXRpb246ICgpID0+IHRvZ2dsZUZpbHRlckFuaW1hdGlvbihpZHgpLFxuICAgICAgICAgICAgdG9nZ2xlRmlsdGVyRmVhdHVyZTogKCkgPT4gdG9nZ2xlRmlsdGVyRmVhdHVyZShpZHgpXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgfSwgW2ZpbHRlcnNCeUluZGV4LCByZW1vdmVGaWx0ZXIsIHNldEZpbHRlclZpZXcsIHRvZ2dsZUZpbHRlckFuaW1hdGlvbiwgdG9nZ2xlRmlsdGVyRmVhdHVyZV0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICB7Wy4uLmZpbHRlcnNCeUluZGV4XS5yZXZlcnNlKCkubWFwKCh7ZmlsdGVyLCBpZHh9KSA9PiAoXG4gICAgICAgICAgPEZpbHRlclBhbmVsXG4gICAgICAgICAgICBrZXk9e2Ake2ZpbHRlci5pZH0tJHtpZHh9YH1cbiAgICAgICAgICAgIGlkeD17aWR4fVxuICAgICAgICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICBpc0FueUZpbHRlckFuaW1hdGluZz17aXNBbnlGaWx0ZXJBbmltYXRpbmd9XG4gICAgICAgICAgICByZW1vdmVGaWx0ZXI9e2ZpbHRlclBhbmVsQ2FsbGJhY2tzW2ZpbHRlci5pZF0ucmVtb3ZlRmlsdGVyfVxuICAgICAgICAgICAgZW5sYXJnZUZpbHRlcj17ZmlsdGVyUGFuZWxDYWxsYmFja3NbZmlsdGVyLmlkXS50b2dnbGVGaWx0ZXJWaWV3fVxuICAgICAgICAgICAgdG9nZ2xlQW5pbWF0aW9uPXtmaWx0ZXJQYW5lbENhbGxiYWNrc1tmaWx0ZXIuaWRdLnRvZ2dsZUFuaW1hdGlvbn1cbiAgICAgICAgICAgIHRvZ2dsZUZpbHRlckZlYXR1cmU9e2ZpbHRlclBhbmVsQ2FsbGJhY2tzW2ZpbHRlci5pZF0udG9nZ2xlRmlsdGVyRmVhdHVyZX1cbiAgICAgICAgICAgIHNldEZpbHRlcj17c2V0RmlsdGVyfVxuICAgICAgICAgICAgc2V0RmlsdGVyUGxvdD17c2V0RmlsdGVyUGxvdH1cbiAgICAgICAgICAgIHN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmU9e3N5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmV9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBEYXRhc2V0RmlsdGVyU2VjdGlvbiA9ICh7XG4gICAgZmlsdGVyc0J5SW5kZXgsXG4gICAgZmlsdGVycyxcbiAgICBkYXRhc2V0LFxuICAgIGRhdGFzZXRzLFxuICAgIGxheWVycyxcbiAgICBpc0FueUZpbHRlckFuaW1hdGluZyxcbiAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgc2hvd0RhdGFzZXRUYWJsZSxcbiAgICB1cGRhdGVUYWJsZUNvbG9yLFxuICAgIHJlbW92ZURhdGFzZXQsXG4gICAgc2hvd0RlbGV0ZURhdGFzZXRcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRDYXRhbG9nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4ge1tkYXRhc2V0LmlkXTogZGF0YXNldH07XG4gICAgfSwgW2RhdGFzZXRdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8U291cmNlRGF0YUNhdGFsb2dcbiAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldENhdGFsb2d9XG4gICAgICAgICAgc2hvd0RhdGFzZXRUYWJsZT17c2hvd0RhdGFzZXRUYWJsZX1cbiAgICAgICAgICB1cGRhdGVUYWJsZUNvbG9yPXt1cGRhdGVUYWJsZUNvbG9yfVxuICAgICAgICAgIHJlbW92ZURhdGFzZXQ9e3JlbW92ZURhdGFzZXR9XG4gICAgICAgICAgc2hvd0RlbGV0ZURhdGFzZXQ9e3Nob3dEZWxldGVEYXRhc2V0fVxuICAgICAgICAvPlxuICAgICAgICA8RmlsdGVyTGlzdFxuICAgICAgICAgIGZpbHRlcnNCeUluZGV4PXtmaWx0ZXJzQnlJbmRleH1cbiAgICAgICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICBsYXllcnM9e2xheWVyc31cbiAgICAgICAgICBpc0FueUZpbHRlckFuaW1hdGluZz17aXNBbnlGaWx0ZXJBbmltYXRpbmd9XG4gICAgICAgICAgdmlzU3RhdGVBY3Rpb25zPXt2aXNTdGF0ZUFjdGlvbnN9XG4gICAgICAgIC8+XG4gICAgICA8Lz5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IEZpbHRlck1hbmFnZXI6IFJlYWN0LkZDPEZpbHRlck1hbmFnZXJQcm9wcz4gPSAoe1xuICAgIGZpbHRlcnMgPSBbXSxcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgc2hvd0RhdGFzZXRUYWJsZSxcbiAgICB1cGRhdGVUYWJsZUNvbG9yLFxuICAgIHJlbW92ZURhdGFzZXQsXG4gICAgc2hvd0FkZERhdGFNb2RhbCxcbiAgICBwYW5lbE1ldGFkYXRhLFxuICAgIHBhbmVsTGlzdFZpZXcsXG4gICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgIHVpU3RhdGVBY3Rpb25zXG4gIH0pID0+IHtcbiAgICBjb25zdCB7YWRkRmlsdGVyfSA9IHZpc1N0YXRlQWN0aW9ucztcbiAgICBjb25zdCB7dG9nZ2xlUGFuZWxMaXN0Vmlld30gPSB1aVN0YXRlQWN0aW9ucztcbiAgICBjb25zdCBpc0FueUZpbHRlckFuaW1hdGluZyA9IGZpbHRlcnMuc29tZShmID0+IGYuaXNBbmltYXRpbmcpO1xuICAgIGNvbnN0IG9uQ2xpY2tBZGRGaWx0ZXIgPSB1c2VDYWxsYmFjayhkYXRhc2V0ID0+IGFkZEZpbHRlcihkYXRhc2V0KSwgW2FkZEZpbHRlcl0pO1xuICAgIGNvbnN0IGlzU29ydEJ5RGF0YXNldE1vZGUgPSBwYW5lbExpc3RWaWV3ID09PSBQQU5FTF9WSUVXX1RPR0dMRVMuYnlEYXRhc2V0O1xuICAgIGNvbnN0IGZpbHRlcnNCeUluZGV4ID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGZpbHRlcnMubWFwKChmLCBpZHgpID0+ICh7XG4gICAgICAgICAgZmlsdGVyOiBmLFxuICAgICAgICAgIGlkeFxuICAgICAgICB9KSksXG4gICAgICBbZmlsdGVyc11cbiAgICApO1xuICAgIGNvbnN0IGZpbHRlcnNCeURhdGFzZXRzID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFzZXRzKS5yZWR1Y2UoXG4gICAgICAgICAgKGFjY3UsIGRhdGFJZCkgPT4gKHtcbiAgICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgICAvLyBpZiBzeW5jZWQgZmlsdGVyLCBzaG93IGl0IHVuZmRlciBpdHMgdGhlIGZpcnN0IGRhdGFzZXRcbiAgICAgICAgICAgIFtkYXRhSWRdOiBmaWx0ZXJzQnlJbmRleC5maWx0ZXIoXG4gICAgICAgICAgICAgIGZpZHggPT4gZmlkeC5maWx0ZXIuZGF0YUlkICYmIGZpZHguZmlsdGVyLmRhdGFJZFswXSA9PT0gZGF0YUlkXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAge31cbiAgICAgICAgKSxcbiAgICAgIFtkYXRhc2V0cywgZmlsdGVyc0J5SW5kZXhdXG4gICAgKTtcbiAgICBjb25zdCBfVG9nZ2xlUGFuZWxMaXN0VmlldyA9IHVzZUNhbGxiYWNrKFxuICAgICAgbGlzdFZpZXcgPT4ge1xuICAgICAgICB0b2dnbGVQYW5lbExpc3RWaWV3KHtwYW5lbElkOiAnZmlsdGVyJywgbGlzdFZpZXd9KTtcbiAgICAgIH0sXG4gICAgICBbdG9nZ2xlUGFuZWxMaXN0Vmlld11cbiAgICApO1xuXG4gICAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgICBjb25zdCBmaWx0ZXJMaXN0UHJvcHMgPSB7XG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBsYXllcnMsXG4gICAgICBpc0FueUZpbHRlckFuaW1hdGluZyxcbiAgICAgIHZpc1N0YXRlQWN0aW9uc1xuICAgIH07XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhQ2F0YWxvZ1Byb3BzID0ge1xuICAgICAgc2hvd0RhdGFzZXRUYWJsZSxcbiAgICAgIHVwZGF0ZVRhYmxlQ29sb3IsXG4gICAgICByZW1vdmVEYXRhc2V0LFxuICAgICAgc2hvd0RlbGV0ZURhdGFzZXQ6IHRydWVcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyLW1hbmFnZXJcIj5cbiAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgPFBhbmVsVmlld0xpc3RUb2dnbGUgdG9nZ2xlUGFuZWxMaXN0Vmlldz17X1RvZ2dsZVBhbmVsTGlzdFZpZXd9IG1vZGU9e3BhbmVsTGlzdFZpZXd9IC8+XG4gICAgICAgIDwvU2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgPERhdGFzZXRTZWN0aW9uXG4gICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgIHsuLi5zb3VyY2VEYXRhQ2F0YWxvZ1Byb3BzfVxuICAgICAgICAgIHNob3dEYXRhc2V0TGlzdD17IWlzU29ydEJ5RGF0YXNldE1vZGV9XG4gICAgICAgICAgc2hvd0FkZERhdGFNb2RhbD17c2hvd0FkZERhdGFNb2RhbH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNpZGVQYW5lbERpdmlkZXIgLz5cbiAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgPFBhbmVsVGl0bGVcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbHRlci1tYW5hZ2VyLXRpdGxlXCJcbiAgICAgICAgICAgIHRpdGxlPXtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiBwYW5lbE1ldGFkYXRhLmxhYmVsfSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFkZEZpbHRlckJ1dHRvbiBkYXRhc2V0cz17ZGF0YXNldHN9IG9uQWRkPXtvbkNsaWNrQWRkRmlsdGVyfSAvPlxuICAgICAgICAgIDwvUGFuZWxUaXRsZT5cbiAgICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICA8U2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgICB7aXNTb3J0QnlEYXRhc2V0TW9kZSA/IChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpbHRlcnNCeURhdGFzZXRzKS5tYXAoZGF0YUlkID0+IChcbiAgICAgICAgICAgICAgPERhdGFzZXRGaWx0ZXJTZWN0aW9uXG4gICAgICAgICAgICAgICAga2V5PXtkYXRhSWR9XG4gICAgICAgICAgICAgICAgZmlsdGVyc0J5SW5kZXg9e2ZpbHRlcnNCeURhdGFzZXRzW2RhdGFJZF19XG4gICAgICAgICAgICAgICAgZGF0YXNldD17ZGF0YXNldHNbZGF0YUlkXX1cbiAgICAgICAgICAgICAgICB7Li4uZmlsdGVyTGlzdFByb3BzfVxuICAgICAgICAgICAgICAgIHsuLi5zb3VyY2VEYXRhQ2F0YWxvZ1Byb3BzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEZpbHRlckxpc3QgZmlsdGVyc0J5SW5kZXg9e2ZpbHRlcnNCeUluZGV4fSB7Li4uZmlsdGVyTGlzdFByb3BzfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEZpbHRlck1hbmFnZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlck1h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