UNPKG

kepler.gl

Version:

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

242 lines (209 loc) 33.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = SidePanelFactory; exports.StyledSidePanelContent = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _localization = require("../localization"); var _defaultSettings = require("../constants/default-settings"); var _sideBar = _interopRequireDefault(require("./side-panel/side-bar")); var _panelHeader = _interopRequireDefault(require("./side-panel/panel-header")); var _panelToggle = _interopRequireDefault(require("./side-panel/panel-toggle")); var _layerManager = _interopRequireDefault(require("./side-panel/layer-manager")); var _filterManager = _interopRequireDefault(require("./side-panel/filter-manager")); var _interactionManager = _interopRequireDefault(require("./side-panel/interaction-manager")); var _mapManager = _interopRequireDefault(require("./side-panel/map-manager")); var _customPanel = _interopRequireDefault(require("./side-panel/custom-panel")); var _panelTitle = _interopRequireDefault(require("./side-panel/panel-title")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _lodash = _interopRequireDefault(require("lodash.get")); var _templateObject; 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; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var StyledSidePanelContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n flex-grow: 1;\n padding: ", "px;\n overflow-y: scroll;\n overflow-x: hidden;\n\n .side-panel__content__inner {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n"])), function (props) { return props.theme.sidePanelScrollBar; }, function (props) { return props.theme.sidePanelInnerPadding; }); exports.StyledSidePanelContent = StyledSidePanelContent; SidePanelFactory.deps = [_sideBar["default"], _panelHeader["default"], _panelToggle["default"], _panelTitle["default"], _layerManager["default"], _filterManager["default"], _interactionManager["default"], _mapManager["default"], _customPanel["default"]]; /** * Vertical sidebar containing input components for the rendering layers */ function SidePanelFactory(Sidebar, PanelHeader, PanelToggle, PanelTitle, LayerManager, FilterManager, InteractionManager, MapManager, CustomPanels) { // inject components var SIDEBAR_COMPONENTS = { layer: LayerManager, filter: FilterManager, interaction: InteractionManager, map: MapManager }; // We should defined sidebar panels here but keeping them for backward compatible var fullPanels = _defaultSettings.SIDEBAR_PANELS.map(function (component) { return _objectSpread(_objectSpread({}, component), {}, { component: SIDEBAR_COMPONENTS[component.id] }); }); var getCustomPanelProps = (0, _lodash["default"])(CustomPanels, ['defaultProps', 'getProps']) || function () { return {}; }; /** @type {typeof import('./side-panel').SidePanel} */ // eslint-disable-next-line max-statements var SidePanel = function SidePanel(props) { var appName = props.appName, appWebsite = props.appWebsite, availableProviders = props.availableProviders, datasets = props.datasets, filters = props.filters, layers = props.layers, layerBlending = props.layerBlending, layerClasses = props.layerClasses, layerOrder = props.layerOrder, interactionConfig = props.interactionConfig, panels = props.panels, mapInfo = props.mapInfo, mapSaved = props.mapSaved, mapStateActions = props.mapStateActions, mapStyle = props.mapStyle, mapStyleActions = props.mapStyleActions, onSaveMap = props.onSaveMap, uiState = props.uiState, uiStateActions = props.uiStateActions, visStateActions = props.visStateActions, version = props.version, width = props.width; var openDeleteModal = uiStateActions.openDeleteModal, toggleModal = uiStateActions.toggleModal, toggleSidePanel = uiStateActions.toggleSidePanel; var activeSidePanel = uiState.activeSidePanel; var setMapInfo = visStateActions.setMapInfo, showDatasetTable = visStateActions.showDatasetTable; var hasShare = availableProviders.hasShare, hasStorage = availableProviders.hasStorage; var title = mapInfo.title; var isOpen = Boolean(activeSidePanel); var _onOpenOrClose = (0, _react.useCallback)(function () { return toggleSidePanel(activeSidePanel ? null : 'layer'); }, [activeSidePanel, toggleSidePanel]); var onClickExportImage = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.EXPORT_IMAGE_ID); }, [toggleModal]); var onClickExportData = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.EXPORT_DATA_ID); }, [toggleModal]); var onClickExportMap = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.EXPORT_MAP_ID); }, [toggleModal]); var onClickSaveToStorage = (0, _react.useCallback)(function () { return toggleModal(mapSaved ? _defaultSettings.OVERWRITE_MAP_ID : _defaultSettings.SAVE_MAP_ID); }, [mapSaved, toggleModal]); var onClickSaveAsToStorage = (0, _react.useCallback)(function () { setMapInfo({ title: "".concat(title || 'Kepler.gl', " (Copy)") }); toggleModal(_defaultSettings.SAVE_MAP_ID); }, [title, setMapInfo, toggleModal]); var onClickShareMap = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.SHARE_MAP_ID); }, [toggleModal]); var onShowDatasetTable = (0, _react.useCallback)(function (dataId) { return showDatasetTable(dataId); }, [showDatasetTable]); var onShowAddDataModal = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.ADD_DATA_ID); }, [toggleModal]); var onShowAddMapStyleModal = (0, _react.useCallback)(function () { return toggleModal(_defaultSettings.ADD_MAP_STYLE_ID); }, [toggleModal]); var onRemoveDataset = (0, _react.useCallback)(function (dataId) { return openDeleteModal(dataId); }, [openDeleteModal]); var onSaveToStorage = (0, _react.useMemo)(function () { return hasStorage ? onClickSaveToStorage : null; }, [hasStorage, onClickSaveToStorage]); var onSaveAsToStorage = (0, _react.useMemo)(function () { return hasStorage && mapSaved ? onClickSaveAsToStorage : null; }, [hasStorage, mapSaved, onClickSaveAsToStorage]); var currentPanel = (0, _react.useMemo)(function () { return panels.find(function (_ref) { var id = _ref.id; return id === activeSidePanel; }) || {}; }, [activeSidePanel, panels]); var onShareMap = (0, _react.useMemo)(function () { return hasShare ? onClickShareMap : null; }, [hasShare, onClickShareMap]); var customPanelProps = (0, _react.useMemo)(function () { return getCustomPanelProps(props); }, [props]); var PanelComponent = currentPanel.component; return /*#__PURE__*/_react["default"].createElement(Sidebar, { width: width, isOpen: isOpen, minifiedWidth: 0, onOpenOrClose: _onOpenOrClose }, /*#__PURE__*/_react["default"].createElement(PanelHeader, { appName: appName, version: version, appWebsite: appWebsite, visibleDropdown: uiState.visibleDropdown, showExportDropdown: uiStateActions.showExportDropdown, hideExportDropdown: uiStateActions.hideExportDropdown, onExportImage: onClickExportImage, onExportData: onClickExportData, onExportMap: onClickExportMap, onSaveMap: onSaveMap, onSaveToStorage: onSaveToStorage, onSaveAsToStorage: onSaveAsToStorage, onShareMap: onShareMap }), /*#__PURE__*/_react["default"].createElement(PanelToggle, { panels: panels, activePanel: activeSidePanel, togglePanel: uiStateActions.toggleSidePanel }), /*#__PURE__*/_react["default"].createElement(StyledSidePanelContent, { className: "side-panel__content" }, /*#__PURE__*/_react["default"].createElement("div", { className: "side-panel__content__inner" }, /*#__PURE__*/_react["default"].createElement(PanelTitle, { className: "side-panel__content__title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: currentPanel.label })), PanelComponent ? /*#__PURE__*/_react["default"].createElement(PanelComponent, { datasets: datasets, filters: filters, layers: layers, layerClasses: layerClasses, layerOrder: layerOrder, layerBlending: layerBlending, mapStyle: mapStyle, mapStyleActions: mapStyleActions, mapStateActions: mapStateActions, interactionConfig: interactionConfig, removeDataset: onRemoveDataset, showDatasetTable: onShowDatasetTable, showAddDataModal: onShowAddDataModal, showAddMapStyleModal: onShowAddMapStyleModal, uiStateActions: uiStateActions, visStateActions: visStateActions }) : null, /*#__PURE__*/_react["default"].createElement(CustomPanels, (0, _extends2["default"])({}, customPanelProps, { activeSidePanel: activeSidePanel }))))); }; SidePanel.defaultProps = { panels: fullPanels, sidebarComponents: SIDEBAR_COMPONENTS, uiState: {}, visStateActions: {}, mapStyleActions: {}, uiStateActions: {}, availableProviders: {}, mapInfo: {} }; return SidePanel; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwuanMiXSwibmFtZXMiOlsiU3R5bGVkU2lkZVBhbmVsQ29udGVudCIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzaWRlUGFuZWxTY3JvbGxCYXIiLCJzaWRlUGFuZWxJbm5lclBhZGRpbmciLCJTaWRlUGFuZWxGYWN0b3J5IiwiZGVwcyIsIlNpZGViYXJGYWN0b3J5IiwiUGFuZWxIZWFkZXJGYWN0b3J5IiwiUGFuZWxUb2dnbGVGYWN0b3J5IiwiUGFuZWxUaXRsZUZhY3RvcnkiLCJMYXllck1hbmFnZXJGYWN0b3J5IiwiRmlsdGVyTWFuYWdlckZhY3RvcnkiLCJJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5IiwiTWFwTWFuYWdlckZhY3RvcnkiLCJDdXN0b21QYW5lbHNGYWN0b3J5IiwiU2lkZWJhciIsIlBhbmVsSGVhZGVyIiwiUGFuZWxUb2dnbGUiLCJQYW5lbFRpdGxlIiwiTGF5ZXJNYW5hZ2VyIiwiRmlsdGVyTWFuYWdlciIsIkludGVyYWN0aW9uTWFuYWdlciIsIk1hcE1hbmFnZXIiLCJDdXN0b21QYW5lbHMiLCJTSURFQkFSX0NPTVBPTkVOVFMiLCJsYXllciIsImZpbHRlciIsImludGVyYWN0aW9uIiwibWFwIiwiZnVsbFBhbmVscyIsIlNJREVCQVJfUEFORUxTIiwiY29tcG9uZW50IiwiaWQiLCJnZXRDdXN0b21QYW5lbFByb3BzIiwiU2lkZVBhbmVsIiwiYXBwTmFtZSIsImFwcFdlYnNpdGUiLCJhdmFpbGFibGVQcm92aWRlcnMiLCJkYXRhc2V0cyIsImZpbHRlcnMiLCJsYXllcnMiLCJsYXllckJsZW5kaW5nIiwibGF5ZXJDbGFzc2VzIiwibGF5ZXJPcmRlciIsImludGVyYWN0aW9uQ29uZmlnIiwicGFuZWxzIiwibWFwSW5mbyIsIm1hcFNhdmVkIiwibWFwU3RhdGVBY3Rpb25zIiwibWFwU3R5bGUiLCJtYXBTdHlsZUFjdGlvbnMiLCJvblNhdmVNYXAiLCJ1aVN0YXRlIiwidWlTdGF0ZUFjdGlvbnMiLCJ2aXNTdGF0ZUFjdGlvbnMiLCJ2ZXJzaW9uIiwid2lkdGgiLCJvcGVuRGVsZXRlTW9kYWwiLCJ0b2dnbGVNb2RhbCIsInRvZ2dsZVNpZGVQYW5lbCIsImFjdGl2ZVNpZGVQYW5lbCIsInNldE1hcEluZm8iLCJzaG93RGF0YXNldFRhYmxlIiwiaGFzU2hhcmUiLCJoYXNTdG9yYWdlIiwidGl0bGUiLCJpc09wZW4iLCJCb29sZWFuIiwiX29uT3Blbk9yQ2xvc2UiLCJvbkNsaWNrRXhwb3J0SW1hZ2UiLCJFWFBPUlRfSU1BR0VfSUQiLCJvbkNsaWNrRXhwb3J0RGF0YSIsIkVYUE9SVF9EQVRBX0lEIiwib25DbGlja0V4cG9ydE1hcCIsIkVYUE9SVF9NQVBfSUQiLCJvbkNsaWNrU2F2ZVRvU3RvcmFnZSIsIk9WRVJXUklURV9NQVBfSUQiLCJTQVZFX01BUF9JRCIsIm9uQ2xpY2tTYXZlQXNUb1N0b3JhZ2UiLCJvbkNsaWNrU2hhcmVNYXAiLCJTSEFSRV9NQVBfSUQiLCJvblNob3dEYXRhc2V0VGFibGUiLCJkYXRhSWQiLCJvblNob3dBZGREYXRhTW9kYWwiLCJBRERfREFUQV9JRCIsIm9uU2hvd0FkZE1hcFN0eWxlTW9kYWwiLCJBRERfTUFQX1NUWUxFX0lEIiwib25SZW1vdmVEYXRhc2V0Iiwib25TYXZlVG9TdG9yYWdlIiwib25TYXZlQXNUb1N0b3JhZ2UiLCJjdXJyZW50UGFuZWwiLCJmaW5kIiwib25TaGFyZU1hcCIsImN1c3RvbVBhbmVsUHJvcHMiLCJQYW5lbENvbXBvbmVudCIsInZpc2libGVEcm9wZG93biIsInNob3dFeHBvcnREcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsImxhYmVsIiwiZGVmYXVsdFByb3BzIiwic2lkZWJhckNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFFQTs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7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QkFBa0IsRUFBRSxFQVBHO0FBUXZCUyxJQUFBQSxPQUFPLEVBQUU7QUFSYyxHQUF6QjtBQVdBLFNBQU9aLFNBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ2xvY2FsaXphdGlvbic7XG5cbmltcG9ydCB7XG4gIEVYUE9SVF9EQVRBX0lELFxuICBFWFBPUlRfTUFQX0lELFxuICBTSEFSRV9NQVBfSUQsXG4gIFNJREVCQVJfUEFORUxTLFxuICBPVkVSV1JJVEVfTUFQX0lELFxuICBTQVZFX01BUF9JRCxcbiAgRVhQT1JUX0lNQUdFX0lELFxuICBBRERfREFUQV9JRCxcbiAgQUREX01BUF9TVFlMRV9JRFxufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmltcG9ydCBTaWRlYmFyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvc2lkZS1iYXInO1xuaW1wb3J0IFBhbmVsSGVhZGVyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyJztcbmltcG9ydCBQYW5lbFRvZ2dsZUZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL3BhbmVsLXRvZ2dsZSc7XG5pbXBvcnQgTGF5ZXJNYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlcic7XG5pbXBvcnQgRmlsdGVyTWFuYWdlckZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL2ZpbHRlci1tYW5hZ2VyJztcbmltcG9ydCBJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9pbnRlcmFjdGlvbi1tYW5hZ2VyJztcbmltcG9ydCBNYXBNYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvbWFwLW1hbmFnZXInO1xuaW1wb3J0IEN1c3RvbVBhbmVsc0ZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL2N1c3RvbS1wYW5lbCc7XG5pbXBvcnQgUGFuZWxUaXRsZUZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL3BhbmVsLXRpdGxlJztcblxuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuXG5leHBvcnQgY29uc3QgU3R5bGVkU2lkZVBhbmVsQ29udGVudCA9IHN0eWxlZC5kaXZgXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsU2Nyb2xsQmFyfTtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNpZGVQYW5lbElubmVyUGFkZGluZ31weDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG5cbiAgLnNpZGUtcGFuZWxfX2NvbnRlbnRfX2lubmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG5gO1xuXG5TaWRlUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIFNpZGViYXJGYWN0b3J5LFxuICBQYW5lbEhlYWRlckZhY3RvcnksXG4gIFBhbmVsVG9nZ2xlRmFjdG9yeSxcbiAgUGFuZWxUaXRsZUZhY3RvcnksXG4gIExheWVyTWFuYWdlckZhY3RvcnksXG4gIEZpbHRlck1hbmFnZXJGYWN0b3J5LFxuICBJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5LFxuICBNYXBNYW5hZ2VyRmFjdG9yeSxcbiAgQ3VzdG9tUGFuZWxzRmFjdG9yeVxuXTtcblxuLyoqXG4gKiBWZXJ0aWNhbCBzaWRlYmFyIGNvbnRhaW5pbmcgaW5wdXQgY29tcG9uZW50cyBmb3IgdGhlIHJlbmRlcmluZyBsYXllcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lkZVBhbmVsRmFjdG9yeShcbiAgU2lkZWJhcixcbiAgUGFuZWxIZWFkZXIsXG4gIFBhbmVsVG9nZ2xlLFxuICBQYW5lbFRpdGxlLFxuICBMYXllck1hbmFnZXIsXG4gIEZpbHRlck1hbmFnZXIsXG4gIEludGVyYWN0aW9uTWFuYWdlcixcbiAgTWFwTWFuYWdlcixcbiAgQ3VzdG9tUGFuZWxzXG4pIHtcbiAgLy8gaW5qZWN0IGNvbXBvbmVudHNcbiAgY29uc3QgU0lERUJBUl9DT01QT05FTlRTID0ge1xuICAgIGxheWVyOiBMYXllck1hbmFnZXIsXG4gICAgZmlsdGVyOiBGaWx0ZXJNYW5hZ2VyLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbk1hbmFnZXIsXG4gICAgbWFwOiBNYXBNYW5hZ2VyXG4gIH07XG5cbiAgLy8gV2Ugc2hvdWxkIGRlZmluZWQgc2lkZWJhciBwYW5lbHMgaGVyZSBidXQga2VlcGluZyB0aGVtIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlXG4gIGNvbnN0IGZ1bGxQYW5lbHMgPSBTSURFQkFSX1BBTkVMUy5tYXAoY29tcG9uZW50ID0+ICh7XG4gICAgLi4uY29tcG9uZW50LFxuICAgIGNvbXBvbmVudDogU0lERUJBUl9DT01QT05FTlRTW2NvbXBvbmVudC5pZF1cbiAgfSkpO1xuXG4gIGNvbnN0IGdldEN1c3RvbVBhbmVsUHJvcHMgPSBnZXQoQ3VzdG9tUGFuZWxzLCBbJ2RlZmF1bHRQcm9wcycsICdnZXRQcm9wcyddKSB8fCAoKCkgPT4gKHt9KSk7XG5cbiAgLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3NpZGUtcGFuZWwnKS5TaWRlUGFuZWx9ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBjb25zdCBTaWRlUGFuZWwgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYXBwTmFtZSxcbiAgICAgIGFwcFdlYnNpdGUsXG4gICAgICBhdmFpbGFibGVQcm92aWRlcnMsXG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBsYXllcnMsXG4gICAgICBsYXllckJsZW5kaW5nLFxuICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgbGF5ZXJPcmRlcixcbiAgICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgcGFuZWxzLFxuICAgICAgbWFwSW5mbyxcbiAgICAgIG1hcFNhdmVkLFxuICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgbWFwU3R5bGUsXG4gICAgICBtYXBTdHlsZUFjdGlvbnMsXG4gICAgICBvblNhdmVNYXAsXG4gICAgICB1aVN0YXRlLFxuICAgICAgdWlTdGF0ZUFjdGlvbnMsXG4gICAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgd2lkdGhcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qge29wZW5EZWxldGVNb2RhbCwgdG9nZ2xlTW9kYWwsIHRvZ2dsZVNpZGVQYW5lbH0gPSB1aVN0YXRlQWN0aW9ucztcbiAgICBjb25zdCB7YWN0aXZlU2lkZVBhbmVsfSA9IHVpU3RhdGU7XG4gICAgY29uc3Qge3NldE1hcEluZm8sIHNob3dEYXRhc2V0VGFibGV9ID0gdmlzU3RhdGVBY3Rpb25zO1xuICAgIGNvbnN0IHtoYXNTaGFyZSwgaGFzU3RvcmFnZX0gPSBhdmFpbGFibGVQcm92aWRlcnM7XG5cbiAgICBjb25zdCB7dGl0bGV9ID0gbWFwSW5mbztcblxuICAgIGNvbnN0IGlzT3BlbiA9IEJvb2xlYW4oYWN0aXZlU2lkZVBhbmVsKTtcblxuICAgIGNvbnN0IF9vbk9wZW5PckNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4gdG9nZ2xlU2lkZVBhbmVsKGFjdGl2ZVNpZGVQYW5lbCA/IG51bGwgOiAnbGF5ZXInKSwgW1xuICAgICAgYWN0aXZlU2lkZVBhbmVsLFxuICAgICAgdG9nZ2xlU2lkZVBhbmVsXG4gICAgXSk7XG5cbiAgICBjb25zdCBvbkNsaWNrRXhwb3J0SW1hZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB0b2dnbGVNb2RhbChFWFBPUlRfSU1BR0VfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrRXhwb3J0RGF0YSA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEVYUE9SVF9EQVRBX0lEKSwgW3RvZ2dsZU1vZGFsXSk7XG4gICAgY29uc3Qgb25DbGlja0V4cG9ydE1hcCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEVYUE9SVF9NQVBfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrU2F2ZVRvU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKCkgPT4gdG9nZ2xlTW9kYWwobWFwU2F2ZWQgPyBPVkVSV1JJVEVfTUFQX0lEIDogU0FWRV9NQVBfSUQpLFxuICAgICAgW21hcFNhdmVkLCB0b2dnbGVNb2RhbF1cbiAgICApO1xuICAgIGNvbnN0IG9uQ2xpY2tTYXZlQXNUb1N0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBzZXRNYXBJbmZvKHtcbiAgICAgICAgdGl0bGU6IGAke3RpdGxlIHx8ICdLZXBsZXIuZ2wnfSAoQ29weSlgXG4gICAgICB9KTtcblxuICAgICAgdG9nZ2xlTW9kYWwoU0FWRV9NQVBfSUQpO1xuICAgIH0sIFt0aXRsZSwgc2V0TWFwSW5mbywgdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrU2hhcmVNYXAgPSB1c2VDYWxsYmFjaygoKSA9PiB0b2dnbGVNb2RhbChTSEFSRV9NQVBfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvblNob3dEYXRhc2V0VGFibGUgPSB1c2VDYWxsYmFjayhkYXRhSWQgPT4gc2hvd0RhdGFzZXRUYWJsZShkYXRhSWQpLCBbc2hvd0RhdGFzZXRUYWJsZV0pO1xuICAgIGNvbnN0IG9uU2hvd0FkZERhdGFNb2RhbCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEFERF9EQVRBX0lEKSwgW3RvZ2dsZU1vZGFsXSk7XG4gICAgY29uc3Qgb25TaG93QWRkTWFwU3R5bGVNb2RhbCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEFERF9NQVBfU1RZTEVfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvblJlbW92ZURhdGFzZXQgPSB1c2VDYWxsYmFjayhkYXRhSWQgPT4gb3BlbkRlbGV0ZU1vZGFsKGRhdGFJZCksIFtvcGVuRGVsZXRlTW9kYWxdKTtcbiAgICBjb25zdCBvblNhdmVUb1N0b3JhZ2UgPSB1c2VNZW1vKCgpID0+ICgoaGFzU3RvcmFnZSA/IG9uQ2xpY2tTYXZlVG9TdG9yYWdlIDogbnVsbCkpLCBbXG4gICAgICBoYXNTdG9yYWdlLFxuICAgICAgb25DbGlja1NhdmVUb1N0b3JhZ2VcbiAgICBdKTtcbiAgICBjb25zdCBvblNhdmVBc1RvU3RvcmFnZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoKGhhc1N0b3JhZ2UgJiYgbWFwU2F2ZWQgPyBvbkNsaWNrU2F2ZUFzVG9TdG9yYWdlIDogbnVsbCkpLFxuICAgICAgW2hhc1N0b3JhZ2UsIG1hcFNhdmVkLCBvbkNsaWNrU2F2ZUFzVG9TdG9yYWdlXVxuICAgICk7XG4gICAgY29uc3QgY3VycmVudFBhbmVsID0gdXNlTWVtbygoKSA9PiBwYW5lbHMuZmluZCgoe2lkfSkgPT4gaWQgPT09IGFjdGl2ZVNpZGVQYW5lbCkgfHwge30sIFtcbiAgICAgIGFjdGl2ZVNpZGVQYW5lbCxcbiAgICAgIHBhbmVsc1xuICAgIF0pO1xuICAgIGNvbnN0IG9uU2hhcmVNYXAgPSB1c2VNZW1vKCgpID0+ICgoaGFzU2hhcmUgPyBvbkNsaWNrU2hhcmVNYXAgOiBudWxsKSksIFtcbiAgICAgIGhhc1NoYXJlLFxuICAgICAgb25DbGlja1NoYXJlTWFwXG4gICAgXSk7XG4gICAgY29uc3QgY3VzdG9tUGFuZWxQcm9wcyA9IHVzZU1lbW8oKCkgPT4gZ2V0Q3VzdG9tUGFuZWxQcm9wcyhwcm9wcyksIFtwcm9wc10pO1xuXG4gICAgY29uc3QgUGFuZWxDb21wb25lbnQgPSBjdXJyZW50UGFuZWwuY29tcG9uZW50O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTaWRlYmFyIHdpZHRoPXt3aWR0aH0gaXNPcGVuPXtpc09wZW59IG1pbmlmaWVkV2lkdGg9ezB9IG9uT3Blbk9yQ2xvc2U9e19vbk9wZW5PckNsb3NlfT5cbiAgICAgICAgPFBhbmVsSGVhZGVyXG4gICAgICAgICAgYXBwTmFtZT17YXBwTmFtZX1cbiAgICAgICAgICB2ZXJzaW9uPXt2ZXJzaW9ufVxuICAgICAgICAgIGFwcFdlYnNpdGU9e2FwcFdlYnNpdGV9XG4gICAgICAgICAgdmlzaWJsZURyb3Bkb3duPXt1aVN0YXRlLnZpc2libGVEcm9wZG93bn1cbiAgICAgICAgICBzaG93RXhwb3J0RHJvcGRvd249e3VpU3RhdGVBY3Rpb25zLnNob3dFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICBoaWRlRXhwb3J0RHJvcGRvd249e3VpU3RhdGVBY3Rpb25zLmhpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICBvbkV4cG9ydEltYWdlPXtvbkNsaWNrRXhwb3J0SW1hZ2V9XG4gICAgICAgICAgb25FeHBvcnREYXRhPXtvbkNsaWNrRXhwb3J0RGF0YX1cbiAgICAgICAgICBvbkV4cG9ydE1hcD17b25DbGlja0V4cG9ydE1hcH1cbiAgICAgICAgICBvblNhdmVNYXA9e29uU2F2ZU1hcH1cbiAgICAgICAgICBvblNhdmVUb1N0b3JhZ2U9e29uU2F2ZVRvU3RvcmFnZX1cbiAgICAgICAgICBvblNhdmVBc1RvU3RvcmFnZT17b25TYXZlQXNUb1N0b3JhZ2V9XG4gICAgICAgICAgb25TaGFyZU1hcD17b25TaGFyZU1hcH1cbiAgICAgICAgLz5cbiAgICAgICAgey8qIHRoZSBuZXh0IHR3byBjb21wb25lbnRzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIG9uZSAqL31cbiAgICAgICAgey8qIGJ1dCBpIGFtIGtlZXBpbmcgdGhlbSBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi99XG4gICAgICAgIDxQYW5lbFRvZ2dsZVxuICAgICAgICAgIHBhbmVscz17cGFuZWxzfVxuICAgICAgICAgIGFjdGl2ZVBhbmVsPXthY3RpdmVTaWRlUGFuZWx9XG4gICAgICAgICAgdG9nZ2xlUGFuZWw9e3VpU3RhdGVBY3Rpb25zLnRvZ2dsZVNpZGVQYW5lbH1cbiAgICAgICAgLz5cbiAgICAgICAgPFN0eWxlZFNpZGVQYW5lbENvbnRlbnQgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fY29udGVudF9faW5uZXJcIj5cbiAgICAgICAgICAgIDxQYW5lbFRpdGxlIGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX2NvbnRlbnRfX3RpdGxlXCI+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtjdXJyZW50UGFuZWwubGFiZWx9IC8+XG4gICAgICAgICAgICA8L1BhbmVsVGl0bGU+XG4gICAgICAgICAgICB7UGFuZWxDb21wb25lbnQgPyAoXG4gICAgICAgICAgICAgIDxQYW5lbENvbXBvbmVudFxuICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgICAgIGxheWVyQ2xhc3Nlcz17bGF5ZXJDbGFzc2VzfVxuICAgICAgICAgICAgICAgIGxheWVyT3JkZXI9e2xheWVyT3JkZXJ9XG4gICAgICAgICAgICAgICAgbGF5ZXJCbGVuZGluZz17bGF5ZXJCbGVuZGluZ31cbiAgICAgICAgICAgICAgICBtYXBTdHlsZT17bWFwU3R5bGV9XG4gICAgICAgICAgICAgICAgbWFwU3R5bGVBY3Rpb25zPXttYXBTdHlsZUFjdGlvbnN9XG4gICAgICAgICAgICAgICAgbWFwU3RhdGVBY3Rpb25zPXttYXBTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWc9e2ludGVyYWN0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgIHJlbW92ZURhdGFzZXQ9e29uUmVtb3ZlRGF0YXNldH1cbiAgICAgICAgICAgICAgICBzaG93RGF0YXNldFRhYmxlPXtvblNob3dEYXRhc2V0VGFibGV9XG4gICAgICAgICAgICAgICAgc2hvd0FkZERhdGFNb2RhbD17b25TaG93QWRkRGF0YU1vZGFsfVxuICAgICAgICAgICAgICAgIHNob3dBZGRNYXBTdHlsZU1vZGFsPXtvblNob3dBZGRNYXBTdHlsZU1vZGFsfVxuICAgICAgICAgICAgICAgIHVpU3RhdGVBY3Rpb25zPXt1aVN0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgICB2aXNTdGF0ZUFjdGlvbnM9e3Zpc1N0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPEN1c3RvbVBhbmVscyB7Li4uY3VzdG9tUGFuZWxQcm9wc30gYWN0aXZlU2lkZVBhbmVsPXthY3RpdmVTaWRlUGFuZWx9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkU2lkZVBhbmVsQ29udGVudD5cbiAgICAgIDwvU2lkZWJhcj5cbiAgICApO1xuICB9O1xuXG4gIFNpZGVQYW5lbC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgcGFuZWxzOiBmdWxsUGFuZWxzLFxuICAgIHNpZGViYXJDb21wb25lbnRzOiBTSURFQkFSX0NPTVBPTkVOVFMsXG4gICAgdWlTdGF0ZToge30sXG4gICAgdmlzU3RhdGVBY3Rpb25zOiB7fSxcbiAgICBtYXBTdHlsZUFjdGlvbnM6IHt9LFxuICAgIHVpU3RhdGVBY3Rpb25zOiB7fSxcbiAgICBhdmFpbGFibGVQcm92aWRlcnM6IHt9LFxuICAgIG1hcEluZm86IHt9XG4gIH07XG5cbiAgcmV0dXJuIFNpZGVQYW5lbDtcbn1cbiJdfQ==