UNPKG

kepler.gl.geoiq

Version:

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

364 lines (304 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"] = exports.ExternalDatasetsUpload = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 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 _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactRedux = require("react-redux"); var _datasetActions = require("../../../store/actions/datasetActions"); var _styles = require("@material-ui/core/styles"); var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); var _Paper = _interopRequireDefault(require("@material-ui/core/Paper")); var _Button = _interopRequireDefault(require("@material-ui/core/Button")); var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); var _materialUiFlatPagination = _interopRequireDefault(require("material-ui-flat-pagination")); var _loadingSpinner = _interopRequireDefault(require("../loading-spinner")); var _Radio = _interopRequireDefault(require("@material-ui/core/Radio")); 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; } } var styles = function styles(theme) { return { root: { flexGrow: 1, height: '320px' }, button: { margin: theme.spacing.unit, maxHeight: '30px' } }; }; /* Inspired by https://github.com/okonet/react-dropzone/blob/master/src/index.js */ var ExternalDatasetsUpload = exports.ExternalDatasetsUpload = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(ExternalDatasetsUpload, _Component); var _super = _createSuper(ExternalDatasetsUpload); function ExternalDatasetsUpload() { var _this; (0, _classCallCheck2["default"])(this, ExternalDatasetsUpload); 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", { currentPage: 1, datasetsPerPage: 4, offset: 0, datasetFilter: '', filteredDatasets: [], selectedValue: '' }); // static propTypes = { // onUpload: PropTypes.func.isRequired // }; // _setState = s => { // this.setState({ [s]: true }); // }; (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handlePageChange", function (offset, page) { // console.log("active page is" + page); // console.log(offset, page); _this.setState({ offset: offset, currentPage: page }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMount", function (datasets) { return datasets.map(function (dataset) { return _this.setState((0, _defineProperty2["default"])({}, dataset.id, false)); }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_downloadDataset", function (dataset) { _this.props.dispatch((0, _datasetActions.externalDatasetDownload)(dataset)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_files", function () { var files = []; var datasetId = _this.state; var _loop = function _loop() { var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2), key = _Object$entries$_i[0], value = _Object$entries$_i[1]; if (value === true) { var datasets = _this.props.dataset.externalDatasets; datasets.map(function (dataset) { if (dataset.id === key) { // console.log("reached") return _this._downloadDataset(dataset); // console.log(dataset); } return dataset; }); } }; for (var _i = 0, _Object$entries = Object.entries(datasetId); _i < _Object$entries.length; _i++) { _loop(); } return files; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onClick", function () { // return this._files(); var dataset = _this.props.dataset.externalDatasets.map(function (dataset) { if (dataset.id === _this.state.selectedValue) { return _this._downloadDataset(dataset); } }); return dataset; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onChange", function (_ref) { var files = _ref.target.files; files = _this.props.dataset.listDatasets; if (!files) { return; } _this.props.onUpload(files); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleChange", function (name) { return function (event) { _this.setState((0, _defineProperty2["default"])({}, name, event.target.checked)); }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRadioChange", function (event) { _this.setState({ selectedValue: event.target.value }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_filterDatasets", function (datasetFilter) { // console.log(datasetFilter); var externalDatasets = _this.props.dataset.externalDatasets; var filteredDatasets = externalDatasets.filter(function (dataset) { var datasetName = dataset.name.toLowerCase(); return datasetName.indexOf(datasetFilter.toLowerCase()) !== -1; }); _this.setState({ filteredDatasets: filteredDatasets }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFilterChange", function (e) { _this.setState({ datasetFilter: e.target.value }); _this._filterDatasets(e.target.value); }); return _this; } (0, _createClass2["default"])(ExternalDatasetsUpload, [{ key: "componentDidMount", value: function componentDidMount() { // console.log(this.state); // this.setState({datasets: this.props.dataset.datasets}) var datasets = this.props.dataset.externalDatasets; if (datasets) { this._onMount(datasets); } } }, { key: "_loadData", value: function _loadData(response, file) { return file; } }, { key: "render", value: function render() { var _this2 = this; var classes = this.props.classes; var externalDatasets = this.props.dataset.externalDatasets; var _this$state = this.state, currentPage = _this$state.currentPage, datasetsPerPage = _this$state.datasetsPerPage, filteredDatasets = _this$state.filteredDatasets, datasetFilter = _this$state.datasetFilter; // const filtercurrentExternalDatasets = [{ name: "shishir" }]; var indexOfLastDataset = currentPage * datasetsPerPage; var indexOfFirstDataset = indexOfLastDataset - datasetsPerPage; // console.log("filtered datasets", filteredDatasets); // console.log(filtercurrentExternalDatasets); var currentExternalDatasets = []; // console.log(datasetFilter.length); if (datasetFilter.length === 0) { currentExternalDatasets = externalDatasets.slice(indexOfFirstDataset, indexOfLastDataset); } else { currentExternalDatasets = filteredDatasets.slice(indexOfFirstDataset, indexOfLastDataset); externalDatasets = filteredDatasets; } // console.log(currentExternalDatasets); var renderExternalDatasets = currentExternalDatasets.map(function (dataset) { var ID = dataset.id.toString(); // console.log(ID); return (/*#__PURE__*/_react["default"].createElement(_Grid["default"], { key: dataset.id, item: true, xs: 12, style: { paddingBottom: '0px', width: '100%' } }, /*#__PURE__*/_react["default"].createElement(_Paper["default"], { className: classes.paper }, /*#__PURE__*/_react["default"].createElement(_Grid["default"], { container: true, wrap: "nowrap", spacing: 16, style: { margin: 'auto' } }, /*#__PURE__*/_react["default"].createElement(_Grid["default"], { item: true, style: { padding: '0px' } }, /*#__PURE__*/_react["default"].createElement(_Radio["default"], { checked: _this2.state.selectedValue === ID, onChange: _this2.handleRadioChange, value: dataset.id, name: "radio-button-demo", "aria-label": "A" })), /*#__PURE__*/_react["default"].createElement(_Grid["default"], { item: true, xs: true, style: { margin: 'auto' } }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], null, dataset.name))))) ); }); var _renderButton = function _renderButton() { if (_this2.props.ui.progressAddDataStatus === 'OPEN') { return (/*#__PURE__*/_react["default"].createElement("div", { style: { margin: 'auto' } }, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], null)) ); } return (/*#__PURE__*/_react["default"].createElement(_Button["default"], { className: classes.button, onClick: _this2._onClick }, "Add Data") ); }; return (/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { className: classes.root, style: { display: 'grid' } }, /*#__PURE__*/_react["default"].createElement("div", { style: { marginLeft: '12px' } }, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "filter" }, "Search: "), /*#__PURE__*/_react["default"].createElement("input", { style: { borderTopStyle: 'hidden', borderLeftStyle: 'hidden', borderRightStyle: 'hidden', borderBottomStyle: 'solid', borderBottomWidth: 'thin', borderBottomColor: 'lightgray' }, type: "text", id: "filter", value: this.state.datasetFilter, onChange: this._handleFilterChange })), /*#__PURE__*/_react["default"].createElement(_Grid["default"], { container: true, spacing: 24, style: { display: 'inline-block', margin: 'auto', width: '100%', minHeight: '240px' } }, renderExternalDatasets), /*#__PURE__*/_react["default"].createElement(_materialUiFlatPagination["default"], { style: { margin: 'auto' }, otherPageColor: "black", activePage: this.state.currentPage, limit: this.state.datasetsPerPage, offset: this.state.offset, total: externalDatasets.length, onClick: function onClick(e, offset, page) { return _this2._handlePageChange(offset, page); } }), _renderButton())) ); } }]); return ExternalDatasetsUpload; }(_react.Component); ExternalDatasetsUpload.propTypes = { classes: _propTypes["default"].object.isRequired }; var mapStateToProps = function mapStateToProps(state) { return state; }; var _default = exports["default"] = (0, _reactRedux.connect)(mapStateToProps, null)((0, _styles.withStyles)(styles)(ExternalDatasetsUpload)); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2V4dGVybmFsLWRhdGFzZXQtdXBsb2FkLmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsInRoZW1lIiwicm9vdCIsImZsZXhHcm93IiwiaGVpZ2h0IiwiYnV0dG9uIiwibWFyZ2luIiwic3BhY2luZyIsInVuaXQiLCJtYXhIZWlnaHQiLCJFeHRlcm5hbERhdGFzZXRzVXBsb2FkIiwiY3VycmVudFBhZ2UiLCJkYXRhc2V0c1BlclBhZ2UiLCJvZmZzZXQiLCJkYXRhc2V0RmlsdGVyIiwiZmlsdGVyZWREYXRhc2V0cyIsInNlbGVjdGVkVmFsdWUiLCJwYWdlIiwic2V0U3RhdGUiLCJkYXRhc2V0cyIsIm1hcCIsImRhdGFzZXQiLCJpZCIsInByb3BzIiwiZGlzcGF0Y2giLCJmaWxlcyIsImRhdGFzZXRJZCIsInN0YXRlIiwia2V5IiwidmFsdWUiLCJleHRlcm5hbERhdGFzZXRzIiwiX2Rvd25sb2FkRGF0YXNldCIsIk9iamVjdCIsImVudHJpZXMiLCJ0YXJnZXQiLCJsaXN0RGF0YXNldHMiLCJvblVwbG9hZCIsIm5hbWUiLCJldmVudCIsImNoZWNrZWQiLCJmaWx0ZXIiLCJkYXRhc2V0TmFtZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsImUiLCJfZmlsdGVyRGF0YXNldHMiLCJfb25Nb3VudCIsInJlc3BvbnNlIiwiZmlsZSIsImNsYXNzZXMiLCJpbmRleE9mTGFzdERhdGFzZXQiLCJpbmRleE9mRmlyc3REYXRhc2V0IiwiY3VycmVudEV4dGVybmFsRGF0YXNldHMiLCJsZW5ndGgiLCJzbGljZSIsInJlbmRlckV4dGVybmFsRGF0YXNldHMiLCJJRCIsInRvU3RyaW5nIiwicGFkZGluZ0JvdHRvbSIsIndpZHRoIiwicGFwZXIiLCJwYWRkaW5nIiwiaGFuZGxlUmFkaW9DaGFuZ2UiLCJfcmVuZGVyQnV0dG9uIiwidWkiLCJwcm9ncmVzc0FkZERhdGFTdGF0dXMiLCJfb25DbGljayIsImRpc3BsYXkiLCJtYXJnaW5MZWZ0IiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiX2hhbmRsZUZpbHRlckNoYW5nZSIsIm1pbkhlaWdodCIsIl9oYW5kbGVQYWdlQ2hhbmdlIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsIm1hcFN0YXRlVG9Qcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBRUEsSUFBTUEsTUFBTSxHQUFHLFNBQVRBLE1BQVMsQ0FBQUMsS0FBSztBQUFBLFNBQUs7QUFDdkJDLElBQUFBLElBQUksRUFBRTtBQUNKQyxNQUFBQSxRQUFRLEVBQUUsQ0FETjtBQUVKQyxNQUFBQSxNQUFNLEVBQUU7QUFGSixLQURpQjtBQUt2QkMsSUFBQUEsTUFBTSxFQUFFO0FBQ05DLE1BQUFBLE1BQU0sRUFBRUwsS0FBSyxDQUFDTSxPQUFOLENBQWNDLElBRGhCO0FBRU5DLE1BQUFBLFNBQVMsRUFBRTtBQUZMO0FBTGUsR0FBTDtBQUFBLENBQXBCO0FBVUE7Ozs7O0lBR2FDLHNCOzs7Ozs7Ozs7Ozs7Ozs7OEZBQ0g7QUFDTkMsTUFBQUEsV0FBVyxFQUFFLENBRFA7QUFFTkMsTUFBQUEsZUFBZSxFQUFFLENBRlg7QUFHTkMsTUFBQUEsTUFBTSxFQUFFLENBSEY7QUFJTkMsTUFBQUEsYUFBYSxFQUFFLEVBSlQ7QUFLTkMsTUFBQUEsZ0JBQWdCLEVBQUUsRUFMWjtBQU1OQyxNQUFBQSxhQUFhLEVBQUU7QUFOVCxLO0FBUVI7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzBHQUVvQixVQUFDSCxNQUFELEVB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RUFBRSxpQkFBQ1QsQ0FBRCxFQUFJL0IsTUFBSixFQUFZSSxJQUFaO0FBQUEsbUJBQXFCLE1BQUksQ0FBQzRELGlCQUFMLENBQXVCaEUsTUFBdkIsRUFBK0JJLElBQS9CLENBQXJCO0FBQUE7QUFQWCxVQXZDRixFQWdERzhDLGFBQWEsRUFoRGhCLENBREY7QUFERjtBQXNERDs7O0VBcFB5Q2UsZ0I7O0FBdVA1Q3BFLHNCQUFzQixDQUFDcUUsU0FBdkIsR0FBbUM7QUFDakM5QixFQUFBQSxPQUFPLEVBQUUrQixzQkFBVUMsTUFBVixDQUFpQkM7QUFETyxDQUFuQzs7QUFJQSxJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUF4RCxLQUFLO0FBQUEsU0FBSUEsS0FBSjtBQUFBLENBQTdCOztvQ0FFZSx5QkFDYndELGVBRGEsRUFFYixJQUZhLEVBR2Isd0JBQVduRixNQUFYLEVBQW1CVSxzQkFBbkIsQ0FIYSxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuLy8gaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtleHRlcm5hbERhdGFzZXREb3dubG9hZH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvYWN0aW9ucy9kYXRhc2V0QWN0aW9ucyc7XG5pbXBvcnQge3dpdGhTdHlsZXN9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgR3JpZCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9HcmlkJztcbmltcG9ydCBQYXBlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9QYXBlcic7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0J1dHRvbic7XG4vLyBpbXBvcnQgQXZhdGFyIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9BdmF0YXJcIjtcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL1R5cG9ncmFwaHknO1xuLy8gaW1wb3J0IFJlYWN0UGFnaW5hdGUgZnJvbSBcInJlYWN0LXBhZ2luYXRlXCI7XG5pbXBvcnQgUGFnaW5hdGlvbiBmcm9tICdtYXRlcmlhbC11aS1mbGF0LXBhZ2luYXRpb24nO1xuaW1wb3J0IExvYWRpbmdTcGlubmVyIGZyb20gJy4uL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQgUmFkaW8gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvUmFkaW8nO1xuXG5jb25zdCBzdHlsZXMgPSB0aGVtZSA9PiAoe1xuICByb290OiB7XG4gICAgZmxleEdyb3c6IDEsXG4gICAgaGVpZ2h0OiAnMzIwcHgnXG4gIH0sXG4gIGJ1dHRvbjoge1xuICAgIG1hcmdpbjogdGhlbWUuc3BhY2luZy51bml0LFxuICAgIG1heEhlaWdodDogJzMwcHgnXG4gIH1cbn0pO1xuLypcbkluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvcmVhY3QtZHJvcHpvbmUvYmxvYi9tYXN0ZXIvc3JjL2luZGV4LmpzXG4qL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsRGF0YXNldHNVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBkYXRhc2V0c1BlclBhZ2U6IDQsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGRhdGFzZXRGaWx0ZXI6ICcnLFxuICAgIGZpbHRlcmVkRGF0YXNldHM6IFtdLFxuICAgIHNlbGVjdGVkVmFsdWU6ICcnXG4gIH07XG4gIC8vIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gIC8vICAgb25VcGxvYWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgLy8gfTtcblxuICAvLyAgIF9zZXRTdGF0ZSA9IHMgPT4ge1xuICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IFtzXTogdHJ1ZSB9KTtcbiAgLy8gICB9O1xuXG4gIF9oYW5kbGVQYWdlQ2hhbmdlID0gKG9mZnNldCwgcGFnZSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0aXZlIHBhZ2UgaXNcIiArIHBhZ2UpO1xuICAgIC8vIGNvbnNvbGUubG9nKG9mZnNldCwgcGFnZSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7b2Zmc2V0LCBjdXJyZW50UGFnZTogcGFnZX0pO1xuICB9O1xuXG4gIF9vbk1vdW50ID0gZGF0YXNldHMgPT4ge1xuICAgIHJldHVybiBkYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB0aGlzLnNldFN0YXRlKHtbZGF0YXNldC5pZF06IGZhbHNlfSkpO1xuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3RhdGUpO1xuICAgIC8vICAgdGhpcy5zZXRTdGF0ZSh7ZGF0YXNldHM6IHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0c30pXG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLnByb3BzLmRhdGFzZXQuZXh0ZXJuYWxEYXRhc2V0cztcbiAgICBpZiAoZGF0YXNldHMpIHtcbiAgICAgIHRoaXMuX29uTW91bnQoZGF0YXNldHMpO1xuICAgIH1cbiAgfVxuXG4gIF9sb2FkRGF0YShyZXNwb25zZSwgZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgX2Rvd25sb2FkRGF0YXNldCA9IGRhdGFzZXQgPT4ge1xuICAgIHRoaXMucHJvcHMuZGlzcGF0Y2goZXh0ZXJuYWxEYXRhc2V0RG93bmxvYWQoZGF0YXNldCkpO1xuICB9O1xuXG4gIF9maWxlcyA9ICgpID0+IHtcbiAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICBjb25zdCBkYXRhc2V0SWQgPSB0aGlzLnN0YXRlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGFzZXRJZCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMucHJvcHMuZGF0YXNldC5leHRlcm5hbERhdGFzZXRzO1xuICAgICAgICBkYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFzZXQuaWQgPT09IGtleSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWFjaGVkXCIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhc2V0KGRhdGFzZXQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YXNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzO1xuICB9O1xuXG4gIF9vbkNsaWNrID0gKCkgPT4ge1xuICAgIC8vIHJldHVybiB0aGlzLl9maWxlcygpO1xuXG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMucHJvcHMuZGF0YXNldC5leHRlcm5hbERhdGFzZXRzLm1hcChkYXRhc2V0ID0+IHtcbiAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfTtcblxuICBfb25DaGFuZ2UgPSAoe3RhcmdldDoge2ZpbGVzfX0pID0+IHtcbiAgICBmaWxlcyA9IHRoaXMucHJvcHMuZGF0YXNldC5saXN0RGF0YXNldHM7XG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25VcGxvYWQoZmlsZXMpO1xuICB9O1xuXG4gIF9oYW5kbGVDaGFuZ2UgPSBuYW1lID0+IGV2ZW50ID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IGV2ZW50LnRhcmdldC5jaGVja2VkfSk7XG4gIH07XG5cbiAgaGFuZGxlUmFkaW9DaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWRWYWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlfSk7XG4gIH07XG5cbiAgX2ZpbHRlckRhdGFzZXRzID0gZGF0YXNldEZpbHRlciA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coZGF0YXNldEZpbHRlcik7XG4gICAgY29uc3Qge2V4dGVybmFsRGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBleHRlcm5hbERhdGFzZXRzLmZpbHRlcihkYXRhc2V0ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gZGF0YXNldC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gZGF0YXNldE5hbWUuaW5kZXhPZihkYXRhc2V0RmlsdGVyLnRvTG93ZXJDYXNlKCkpICE9PSAtMTtcbiAgICB9KTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGZpbHRlcmVkRGF0YXNldHNcbiAgICB9KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsdGVyQ2hhbmdlID0gZSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhc2V0RmlsdGVyOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMuX2ZpbHRlckRhdGFzZXRzKGUudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzZXN9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQge2V4dGVybmFsRGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRQYWdlLFxuICAgICAgZGF0YXNldHNQZXJQYWdlLFxuICAgICAgZmlsdGVyZWREYXRhc2V0cyxcbiAgICAgIGRhdGFzZXRGaWx0ZXJcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBjb25zdCBmaWx0ZXJjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cyA9IFt7IG5hbWU6IFwic2hpc2hpclwiIH1dO1xuXG4gICAgY29uc3QgaW5kZXhPZkxhc3REYXRhc2V0ID0gY3VycmVudFBhZ2UgKiBkYXRhc2V0c1BlclBhZ2U7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0RGF0YXNldCA9IGluZGV4T2ZMYXN0RGF0YXNldCAtIGRhdGFzZXRzUGVyUGFnZTtcbiAgICAvLyBjb25zb2xlLmxvZyhcImZpbHRlcmVkIGRhdGFzZXRzXCIsIGZpbHRlcmVkRGF0YXNldHMpO1xuICAgIC8vIGNvbnNvbGUubG9nKGZpbHRlcmN1cnJlbnRFeHRlcm5hbERhdGFzZXRzKTtcbiAgICBsZXQgY3VycmVudEV4dGVybmFsRGF0YXNldHMgPSBbXTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0RmlsdGVyLmxlbmd0aCk7XG4gICAgaWYgKGRhdGFzZXRGaWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cyA9IGV4dGVybmFsRGF0YXNldHMuc2xpY2UoXG4gICAgICAgIGluZGV4T2ZGaXJzdERhdGFzZXQsXG4gICAgICAgIGluZGV4T2ZMYXN0RGF0YXNldFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEV4dGVybmFsRGF0YXNldHMgPSBmaWx0ZXJlZERhdGFzZXRzLnNsaWNlKFxuICAgICAgICBpbmRleE9mRmlyc3REYXRhc2V0LFxuICAgICAgICBpbmRleE9mTGFzdERhdGFzZXRcbiAgICAgICk7XG4gICAgICBleHRlcm5hbERhdGFzZXRzID0gZmlsdGVyZWREYXRhc2V0cztcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coY3VycmVudEV4dGVybmFsRGF0YXNldHMpO1xuICAgIGNvbnN0IHJlbmRlckV4dGVybmFsRGF0YXNldHMgPSBjdXJyZW50RXh0ZXJuYWxEYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICBjb25zdCBJRCA9IGRhdGFzZXQuaWQudG9TdHJpbmcoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKElEKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxHcmlkXG4gICAgICAgICAga2V5PXtkYXRhc2V0LmlkfVxuICAgICAgICAgIGl0ZW1cbiAgICAgICAgICB4cz17MTJ9XG4gICAgICAgICAgc3R5bGU9e3twYWRkaW5nQm90dG9tOiAnMHB4Jywgd2lkdGg6ICcxMDAlJ319XG4gICAgICAgID5cbiAgICAgICAgICA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT5cbiAgICAgICAgICAgIDxHcmlkIGNvbnRhaW5lciB3cmFwPVwibm93cmFwXCIgc3BhY2luZz17MTZ9IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPEdyaWQgaXRlbSBzdHlsZT17e3BhZGRpbmc6ICcwcHgnfX0+XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUgPT09IElEfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlUmFkaW9DaGFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5pZH1cbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJyYWRpby1idXR0b24tZGVtb1wiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAvLyBjaGVja2VkPXtkYXRhc2V0LmlkfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX2hhbmRsZUNoYW5nZShJRCl9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5uYW1lfVxuICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDxHcmlkIGl0ZW0geHMgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5PntkYXRhc2V0Lm5hbWV9PC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPC9QYXBlcj5cbiAgICAgICAgPC9HcmlkPlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IF9yZW5kZXJCdXR0b24gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy51aS5wcm9ncmVzc0FkZERhdGFTdGF0dXMgPT09ICdPUEVOJykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9IFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn0gb25DbGljaz17dGhpcy5fb25DbGlja30+XG4gICAgICAgICAgICBBZGQgRGF0YVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICApO1xuICAgICAgXG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fSBzdHlsZT17e2Rpc3BsYXk6ICdncmlkJ319PlxuICAgICAgICAgIHsvKiA8Q3VzdG9tSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ9XCJTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT17dGhpcy5faGFuZGxlRmlsdGVyQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sUHJvcHM9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5MZWZ0OiAnMTJweCd9fT5cbiAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwiZmlsdGVyXCI+U2VhcmNoOiA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wU3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckxlZnRTdHlsZTogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmlnaHRTdHlsZTogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tU3R5bGU6ICdzb2xpZCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tV2lkdGg6ICd0aGluJyxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogJ2xpZ2h0Z3JheSdcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBpZD1cImZpbHRlclwiXG4gICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmRhdGFzZXRGaWx0ZXJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLl9oYW5kbGVGaWx0ZXJDaGFuZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxHcmlkXG4gICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgIHNwYWNpbmc9ezI0fVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICBtaW5IZWlnaHQ6ICcyNDBweCdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3JlbmRlckV4dGVybmFsRGF0YXNldHN9XG4gICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDxQYWdpbmF0aW9uXG4gICAgICAgICAgICBzdHlsZT17e21hcmdpbjogJ2F1dG8nfX1cbiAgICAgICAgICAgIG90aGVyUGFnZUNvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgYWN0aXZlUGFnZT17dGhpcy5zdGF0ZS5jdXJyZW50UGFnZX1cbiAgICAgICAgICAgIGxpbWl0PXt0aGlzLnN0YXRlLmRhdGFzZXRzUGVyUGFnZX1cbiAgICAgICAgICAgIG9mZnNldD17dGhpcy5zdGF0ZS5vZmZzZXR9XG4gICAgICAgICAgICB0b3RhbD17ZXh0ZXJuYWxEYXRhc2V0cy5sZW5ndGh9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSwgb2Zmc2V0LCBwYWdlKSA9PiB0aGlzLl9oYW5kbGVQYWdlQ2hhbmdlKG9mZnNldCwgcGFnZSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7X3JlbmRlckJ1dHRvbigpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5FeHRlcm5hbERhdGFzZXRzVXBsb2FkLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBzdGF0ZSA9PiBzdGF0ZTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAgbWFwU3RhdGVUb1Byb3BzLFxuICBudWxsXG4pKHdpdGhTdHlsZXMoc3R5bGVzKShFeHRlcm5hbERhdGFzZXRzVXBsb2FkKSk7XG4iXX0=