UNPKG

kepler.gl.geoiq

Version:

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

413 lines (347 loc) 42.3 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.ListUpload = 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 _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox")); 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; } } // import CircularProgress from "@material-ui/core/CircularProgress"; 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 ListUpload = exports.ListUpload = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(ListUpload, _Component); var _super = _createSuper(ListUpload); function ListUpload() { var _this; (0, _classCallCheck2["default"])(this, ListUpload); 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); _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 (datasets) { _this.props.dispatch((0, _datasetActions.listDatasetDownload)(datasets)); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_files", function () { var files = []; var datasetId = _this.state; // console.log(datasetId); for (var _i = 0, _Object$entries = Object.entries(datasetId); _i < _Object$entries.length; _i++) { var _Object$entries$_i2 = (0, _slicedToArray2["default"])(_Object$entries[_i], 2), key = _Object$entries$_i2[0], value = _Object$entries$_i2[1]; if (value === true) { var datasets = _this.props.dataset.datasets; datasets.map(function (dataset) { if (dataset.id === _this.state.selectedValue) { // console.log(dataset); files.push(dataset); // console.log(files); return _this._downloadDataset(dataset); } return dataset; }); } } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onClick", function () { // return this._files(); var dataset = _this.props.dataset.datasets.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.props.dataset.datasets.map(function (dataset) { // console.log(dataset.id); var id = dataset.id.toString(); _this.setState((0, _defineProperty2["default"])({}, id, false)); }); // console.log(this.state); _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) { var datasets = _this.props.dataset.datasets; var filteredDatasets = datasets.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"])(ListUpload, [{ key: "componentDidMount", value: function componentDidMount() { // console.log(this.state); // this.setState({datasets: this.props.dataset.datasets}) var datasets = this.props.dataset.datasets; if (datasets) { this._onMount(datasets); } } }, { key: "_blobToFile", value: function _blobToFile(theBlob, fileName) { // A Blob() is almost a File() - it's just missing the two properties below which we will add // console.log(theBlob); theBlob.lastModifiedDate = new Date(); theBlob.name = fileName; return theBlob; } }, { key: "_loadData", value: function _loadData(response, file) { return file; } }, { key: "_renderNoDatasetMessage", value: function _renderNoDatasetMessage() { return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", null, "you have no file(s) in Datahub ")) ); } }, { key: "render", value: function render() { var _this2 = this; var classes = this.props.classes; var datasets = this.props.dataset.datasets; var _this$state = this.state, currentPage = _this$state.currentPage, datasetsPerPage = _this$state.datasetsPerPage, filteredDatasets = _this$state.filteredDatasets, datasetFilter = _this$state.datasetFilter; var indexOfLastDataset = currentPage * datasetsPerPage; var indexOfFirstDataset = indexOfLastDataset - datasetsPerPage; var currentDatasets = []; if (datasetFilter.length === 0) { currentDatasets = datasets.slice(indexOfFirstDataset, indexOfLastDataset); } else { currentDatasets = filteredDatasets.slice(indexOfFirstDataset, indexOfLastDataset); datasets = filteredDatasets; } // const currentDatasets = datasets.slice( // indexOfFirstDataset, // indexOfLastDataset // ); var renderDatasets = currentDatasets.map(function (dataset) { var ID = dataset.id.toString(); // console.log(this.state[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, "-", dataset.availabilityStatus))))) ); }); var _renderNoDatasetMessage = function _renderNoDatasetMessage() { return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("p", { style: { fontSize: '14px', marginBottom: '12px', color: 'black' } }, "You have no files in Datahub", ' ')) ); }; // const loading = "OPEN"; var _renderButton = function _renderButton() { var datasets = _this2.props.dataset.datasets; // const loadingDataset = true; if (datasets.length) { if (_this2.props.ui.progressAddDataStatus === 'OPEN') { // if (loading === "OPEN") { return (/*#__PURE__*/_react["default"].createElement("div", { style: { margin: 'auto' } }, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], null)) ); } return (/*#__PURE__*/_react["default"].createElement(_Button["default"] // disabled={loadingDataset} , { className: classes.button, onClick: _this2._onClick }, "Add Data") ); } return _renderNoDatasetMessage(); }; // console.log(datasets); 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' } }, renderDatasets), /*#__PURE__*/_react["default"].createElement(_materialUiFlatPagination["default"], { otherPageColor: "black", style: { margin: 'auto' }, activePage: this.state.currentPage, limit: this.state.datasetsPerPage, offset: this.state.offset, total: datasets.length, onClick: function onClick(e, offset, page) { return _this2.handlePageChange(offset, page); } }), _renderButton())) ); } }]); return ListUpload; }(_react.Component); ListUpload.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)(ListUpload)); // <Wrapper> // <input // type="file" // ref={ref => {this._fileInput = ref}} // style={{display: 'none'}} // onChange={this._onChange} // /> // <span onClick={this._onClick}>{this.props.children}</span> // </Wrapper> //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2xpc3QtdXBsb2FkLmpzIl0sIm5hbWVzIjpbInN0eWxlcyIsInRoZW1lIiwicm9vdCIsImZsZXhHcm93IiwiaGVpZ2h0IiwiYnV0dG9uIiwibWFyZ2luIiwic3BhY2luZyIsInVuaXQiLCJtYXhIZWlnaHQiLCJMaXN0VXBsb2FkIiwiY3VycmVudFBhZ2UiLCJkYXRhc2V0c1BlclBhZ2UiLCJvZmZzZXQiLCJkYXRhc2V0RmlsdGVyIiwiZmlsdGVyZWREYXRhc2V0cyIsInNlbGVjdGVkVmFsdWUiLCJwYWdlIiwic2V0U3RhdGUiLCJkYXRhc2V0cyIsIm1hcCIsImRhdGFzZXQiLCJpZCIsInByb3BzIiwiZGlzcGF0Y2giLCJmaWxlcyIsImRhdGFzZXRJZCIsInN0YXRlIiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsInZhbHVlIiwicHVzaCIsIl9kb3dubG9hZERhdGFzZXQiLCJ0YXJnZXQiLCJsaXN0RGF0YXNldHMiLCJvblVwbG9hZCIsIm5hbWUiLCJldmVudCIsInRvU3RyaW5nIiwiY2hlY2tlZCIsImZpbHRlciIsImRhdGFzZXROYW1lIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiZSIsIl9maWx0ZXJEYXRhc2V0cyIsIl9vbk1vdW50IiwidGhlQmxvYiIsImZpbGVOYW1lIiwibGFzdE1vZGlmaWVkRGF0ZSIsIkRhdGUiLCJyZXNwb25zZSIsImZpbGUiLCJjbGFzc2VzIiwiaW5kZXhPZkxhc3REYXRhc2V0IiwiaW5kZXhPZkZpcnN0RGF0YXNldCIsImN1cnJlbnREYXRhc2V0cyIsImxlbmd0aCIsInNsaWNlIiwicmVuZGVyRGF0YXNldHMiLCJJRCIsInBhZGRpbmdCb3R0b20iLCJ3aWR0aCIsInBhcGVyIiwicGFkZGluZyIsImhhbmRsZVJhZGlvQ2hhbmdlIiwiYXZhaWxhYmlsaXR5U3RhdHVzIiwiX3JlbmRlck5vRGF0YXNldE1lc3NhZ2UiLCJmb250U2l6ZSIsIm1hcmdpbkJvdHRvbSIsImNvbG9yIiwiX3JlbmRlckJ1dHRvbiIsInVpIiwicHJvZ3Jlc3NBZGREYXRhU3RhdHVzIiwiX29uQ2xpY2siLCJkaXNwbGF5IiwibWFyZ2luTGVmdCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJCb3R0b21Db2xvciIsIl9oYW5kbGVGaWx0ZXJDaGFuZ2UiLCJtaW5IZWlnaHQiLCJoYW5kbGVQYWdlQ2hhbmdlIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsIm1hcFN0YXRlVG9Qcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBQ0E7QUFFQSxJQUFNQSxNQUFNLEdBQUcsU0FBVEEsTUFBUyxDQUFBQyxLQUFLO0FBQUEsU0FBSztBQUN2QkMsSUFBQUEsSUFBSSxFQUFFO0FBQ0pDLE1BQUFBLFFBQVEsRUFBRSxDQUROO0FBRUpDLE1BQUFBLE1BQU0sRUFBRTtBQUZKLEtBRGlCO0FBS3ZCQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkMsTUFBQUEsTUFBTSxFQUFFTCxLQUFLLENBQUNNLE9BQU4sQ0FBY0MsSUFEaEI7QUFFTkMsTUFBQUEsU0FBUyxFQUFFO0FBRkw7QUFMZSxHQUFMO0FBQUEsQ0FBcEI7QUFVQTs7Ozs7SUFHYUMsVTs7Ozs7Ozs7Ozs7Ozs7OzhGQUNIO0FBQ05DLE1BQUFBLFdBQVcsRUFBRSxDQURQO0FBRU5DLE1BQUFBLGVBQWUsRUFBRSxDQUZYO0FBR05DLE1BQUFBLE1BQU0sRUFBRSxDQUhGO0FBSU5DLE1BQUFBLGFBQWEsRUFBRSxFQUpUO0FBS05DLE1BQUFBLGdCQUFnQixFQUFF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LE1BQUosRUFBWUksSUFBWjtBQUFBLG1CQUFxQixNQUFJLENBQUNxRSxnQkFBTCxDQUFzQnpFLE1BQXRCLEVBQThCSSxJQUE5QixDQUFyQjtBQUFBO0FBUFgsVUE5QkYsRUF1Q0d1RCxhQUFhLEVBdkNoQixDQURGO0FBREY7QUE2Q0Q7OztFQTVSNkJlLGdCOztBQStSaEM3RSxVQUFVLENBQUM4RSxTQUFYLEdBQXVCO0FBQ3JCbEMsRUFBQUEsT0FBTyxFQUFFbUMsc0JBQVVDLE1BQVYsQ0FBaUJDO0FBREwsQ0FBdkI7O0FBSUEsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFBakUsS0FBSztBQUFBLFNBQUlBLEtBQUo7QUFBQSxDQUE3Qjs7b0NBRWUseUJBQVFpRSxlQUFSLEVBQXlCLElBQXpCLEVBQStCLHdCQUFXNUYsTUFBWCxFQUFtQlUsVUFBbkIsQ0FBL0IsQyxFQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbi8vIGltcG9ydCBzdHlsZWQgZnJvbSBcInN0eWxlZC1jb21wb25lbnRzXCI7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7bGlzdERhdGFzZXREb3dubG9hZH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvYWN0aW9ucy9kYXRhc2V0QWN0aW9ucyc7XG5pbXBvcnQge3dpdGhTdHlsZXN9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgR3JpZCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9HcmlkJztcbmltcG9ydCBQYXBlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9QYXBlcic7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQ2hlY2tib3gnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9CdXR0b24nO1xuLy8gaW1wb3J0IEF2YXRhciBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvQXZhdGFyXCI7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9UeXBvZ3JhcGh5JztcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJ21hdGVyaWFsLXVpLWZsYXQtcGFnaW5hdGlvbic7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSAnLi4vbG9hZGluZy1zcGlubmVyJztcbmltcG9ydCBSYWRpbyBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9SYWRpbyc7XG4vLyBpbXBvcnQgQ2lyY3VsYXJQcm9ncmVzcyBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvQ2lyY3VsYXJQcm9ncmVzc1wiO1xuXG5jb25zdCBzdHlsZXMgPSB0aGVtZSA9PiAoe1xuICByb290OiB7XG4gICAgZmxleEdyb3c6IDEsXG4gICAgaGVpZ2h0OiAnMzIwcHgnXG4gIH0sXG4gIGJ1dHRvbjoge1xuICAgIG1hcmdpbjogdGhlbWUuc3BhY2luZy51bml0LFxuICAgIG1heEhlaWdodDogJzMwcHgnXG4gIH1cbn0pO1xuLypcbkluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvcmVhY3QtZHJvcHpvbmUvYmxvYi9tYXN0ZXIvc3JjL2luZGV4LmpzXG4qL1xuZXhwb3J0IGNsYXNzIExpc3RVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBkYXRhc2V0c1BlclBhZ2U6IDQsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGRhdGFzZXRGaWx0ZXI6ICcnLFxuICAgIGZpbHRlcmVkRGF0YXNldHM6IFtdLFxuICAgIHNlbGVjdGVkVmFsdWU6ICcnXG4gIH07XG4gIC8vIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gIC8vICAgb25VcGxvYWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgLy8gfTtcblxuICAvLyAgIF9zZXRTdGF0ZSA9IHMgPT4ge1xuICAvLyAgICAgdGhpcy5zZXRTdGF0ZSh7IFtzXTogdHJ1ZSB9KTtcbiAgLy8gICB9O1xuICBoYW5kbGVQYWdlQ2hhbmdlID0gKG9mZnNldCwgcGFnZSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0aXZlIHBhZ2UgaXNcIiArIHBhZ2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe29mZnNldCwgY3VycmVudFBhZ2U6IHBhZ2V9KTtcbiAgfTtcblxuICBfb25Nb3VudCA9IGRhdGFzZXRzID0+IHtcbiAgICByZXR1cm4gZGF0YXNldHMubWFwKGRhdGFzZXQgPT4gdGhpcy5zZXRTdGF0ZSh7W2RhdGFzZXQuaWRdOiBmYWxzZX0pKTtcbiAgfTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN0YXRlKTtcbiAgICAvLyAgIHRoaXMuc2V0U3RhdGUoe2RhdGFzZXRzOiB0aGlzLnByb3BzLmRhdGFzZXQuZGF0YXNldHN9KVxuICAgIGNvbnN0IGRhdGFzZXRzID0gdGhpcy5wcm9wcy5kYXRhc2V0LmRhdGFzZXRzO1xuICAgIGlmIChkYXRhc2V0cykge1xuICAgICAgdGhpcy5fb25Nb3VudChkYXRhc2V0cyk7XG4gICAgfVxuICB9XG5cbiAgX2Jsb2JUb0ZpbGUodGhlQmxvYiwgZmlsZU5hbWUpIHtcbiAgICAvLyBBIEJsb2IoKSBpcyBhbG1vc3QgYSBGaWxlKCkgLSBpdCdzIGp1c3QgbWlzc2luZyB0aGUgdHdvIHByb3BlcnRpZXMgYmVsb3cgd2hpY2ggd2Ugd2lsbCBhZGRcbiAgICAvLyBjb25zb2xlLmxvZyh0aGVCbG9iKTtcbiAgICB0aGVCbG9iLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoZUJsb2IubmFtZSA9IGZpbGVOYW1lO1xuICAgIHJldHVybiB0aGVCbG9iO1xuICB9XG4gIF9sb2FkRGF0YShyZXNwb25zZSwgZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgX2Rvd25sb2FkRGF0YXNldCA9IGRhdGFzZXRzID0+IHtcbiAgICB0aGlzLnByb3BzLmRpc3BhdGNoKGxpc3REYXRhc2V0RG93bmxvYWQoZGF0YXNldHMpKTtcbiAgfTtcblxuICBfZmlsZXMgPSAoKSA9PiB7XG4gICAgdmFyIGZpbGVzID0gW107XG4gICAgY29uc3QgZGF0YXNldElkID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0SWQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGFzZXRJZCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0cztcbiAgICAgICAgZGF0YXNldHMubWFwKGRhdGFzZXQgPT4ge1xuICAgICAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGFzZXQpO1xuICAgICAgICAgICAgZmlsZXMucHVzaChkYXRhc2V0KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGZpbGVzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb3dubG9hZERhdGFzZXQoZGF0YXNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX29uQ2xpY2sgPSAoKSA9PiB7XG4gICAgLy8gcmV0dXJuIHRoaXMuX2ZpbGVzKCk7XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5wcm9wcy5kYXRhc2V0LmRhdGFzZXRzLm1hcChkYXRhc2V0ID0+IHtcbiAgICAgIGlmIChkYXRhc2V0LmlkID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfTtcblxuICBfb25DaGFuZ2UgPSAoe3RhcmdldDoge2ZpbGVzfX0pID0+IHtcbiAgICBmaWxlcyA9IHRoaXMucHJvcHMuZGF0YXNldC5saXN0RGF0YXNldHM7XG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25VcGxvYWQoZmlsZXMpO1xuICB9O1xuXG4gIGhhbmRsZUNoYW5nZSA9IG5hbWUgPT4gZXZlbnQgPT4ge1xuICAgIHRoaXMucHJvcHMuZGF0YXNldC5kYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0LmlkKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YXNldC5pZC50b1N0cmluZygpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7W2lkXTogZmFsc2V9KTtcbiAgICB9KTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnNldFN0YXRlKHtbbmFtZV06IGV2ZW50LnRhcmdldC5jaGVja2VkfSk7XG4gIH07XG5cbiAgaGFuZGxlUmFkaW9DaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWRWYWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlfSk7XG4gIH07XG5cbiAgX3JlbmRlck5vRGF0YXNldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxwPnlvdSBoYXZlIG5vIGZpbGUocykgaW4gRGF0YWh1YiA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgX2ZpbHRlckRhdGFzZXRzID0gZGF0YXNldEZpbHRlciA9PiB7XG4gICAgY29uc3Qge2RhdGFzZXRzfSA9IHRoaXMucHJvcHMuZGF0YXNldDtcbiAgICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gZGF0YXNldHMuZmlsdGVyKGRhdGFzZXQgPT4ge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBkYXRhc2V0Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBkYXRhc2V0TmFtZS5pbmRleE9mKGRhdGFzZXRGaWx0ZXIudG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe2ZpbHRlcmVkRGF0YXNldHN9KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsdGVyQ2hhbmdlID0gZSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhc2V0RmlsdGVyOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMuX2ZpbHRlckRhdGFzZXRzKGUudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzZXN9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQge2RhdGFzZXRzfSA9IHRoaXMucHJvcHMuZGF0YXNldDtcbiAgICBjb25zdCB7XG4gICAgICBjdXJyZW50UGFnZSxcbiAgICAgIGRhdGFzZXRzUGVyUGFnZSxcbiAgICAgIGZpbHRlcmVkRGF0YXNldHMsXG4gICAgICBkYXRhc2V0RmlsdGVyXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaW5kZXhPZkxhc3REYXRhc2V0ID0gY3VycmVudFBhZ2UgKiBkYXRhc2V0c1BlclBhZ2U7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0RGF0YXNldCA9IGluZGV4T2ZMYXN0RGF0YXNldCAtIGRhdGFzZXRzUGVyUGFnZTtcblxuICAgIGxldCBjdXJyZW50RGF0YXNldHMgPSBbXTtcblxuICAgIGlmIChkYXRhc2V0RmlsdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY3VycmVudERhdGFzZXRzID0gZGF0YXNldHMuc2xpY2UoaW5kZXhPZkZpcnN0RGF0YXNldCwgaW5kZXhPZkxhc3REYXRhc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudERhdGFzZXRzID0gZmlsdGVyZWREYXRhc2V0cy5zbGljZShcbiAgICAgICAgaW5kZXhPZkZpcnN0RGF0YXNldCxcbiAgICAgICAgaW5kZXhPZkxhc3REYXRhc2V0XG4gICAgICApO1xuICAgICAgZGF0YXNldHMgPSBmaWx0ZXJlZERhdGFzZXRzO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGN1cnJlbnREYXRhc2V0cyA9IGRhdGFzZXRzLnNsaWNlKFxuICAgIC8vICAgaW5kZXhPZkZpcnN0RGF0YXNldCxcbiAgICAvLyAgIGluZGV4T2ZMYXN0RGF0YXNldFxuICAgIC8vICk7XG5cbiAgICBjb25zdCByZW5kZXJEYXRhc2V0cyA9IGN1cnJlbnREYXRhc2V0cy5tYXAoZGF0YXNldCA9PiB7XG4gICAgICBjb25zdCBJRCA9IGRhdGFzZXQuaWQudG9TdHJpbmcoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3RhdGVbSURdKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxHcmlkXG4gICAgICAgICAga2V5PXtkYXRhc2V0LmlkfVxuICAgICAgICAgIGl0ZW1cbiAgICAgICAgICB4cz17MTJ9XG4gICAgICAgICAgc3R5bGU9e3twYWRkaW5nQm90dG9tOiAnMHB4Jywgd2lkdGg6ICcxMDAlJ319XG4gICAgICAgID5cbiAgICAgICAgICA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT5cbiAgICAgICAgICAgIDxHcmlkIGNvbnRhaW5lciB3cmFwPVwibm93cmFwXCIgc3BhY2luZz17MTZ9IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPEdyaWQgaXRlbSBzdHlsZT17e3BhZGRpbmc6ICcwcHgnfX0+XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlLnNlbGVjdGVkVmFsdWUgPT09IElEfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlUmFkaW9DaGFuZ2V9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5pZH1cbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJyYWRpby1idXR0b24tZGVtb1wiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAvLyBzdHlsZT17eyBjaGVja2VkOiBbdGhpcy5zdGF0ZVtJRF1dIH19XG4gICAgICAgICAgICAgICAgICAvLyBjaGVja2VkSWNvbj17dGhpcy5zdGF0ZVtJRF19XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLnN0YXRlW0lEXX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUNoYW5nZShJRCl9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YXNldC5uYW1lfVxuICAgICAgICAgICAgICAgIC8+ICovfVxuICAgICAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgICAgIDxHcmlkIGl0ZW0geHMgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319PlxuICAgICAgICAgICAgICAgIDxUeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgICAge2RhdGFzZXQubmFtZX0te2RhdGFzZXQuYXZhaWxhYmlsaXR5U3RhdHVzfVxuICAgICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgICAgPC9HcmlkPlxuICAgICAgICAgIDwvUGFwZXI+XG4gICAgICAgIDwvR3JpZD5cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBfcmVuZGVyTm9EYXRhc2V0TWVzc2FnZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHAgc3R5bGU9e3tmb250U2l6ZTogJzE0cHgnLCBtYXJnaW5Cb3R0b206ICcxMnB4JywgY29sb3I6ICdibGFjayd9fT5cbiAgICAgICAgICAgIFlvdSBoYXZlIG5vIGZpbGVzIGluIERhdGFodWJ7JyAnfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG4gICAgLy8gY29uc3QgbG9hZGluZyA9IFwiT1BFTlwiO1xuICAgIGNvbnN0IF9yZW5kZXJCdXR0b24gPSAoKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YXNldHN9ID0gdGhpcy5wcm9wcy5kYXRhc2V0O1xuICAgICAgLy8gY29uc3QgbG9hZGluZ0RhdGFzZXQgPSB0cnVlO1xuICAgICAgaWYgKGRhdGFzZXRzLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy51aS5wcm9ncmVzc0FkZERhdGFTdGF0dXMgPT09ICdPUEVOJykge1xuICAgICAgICAgIC8vIGlmIChsb2FkaW5nID09PSBcIk9QRU5cIikge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luOiAnYXV0byd9fT5cbiAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApO1xuICAgICAgICB9IFxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIC8vIGRpc2FibGVkPXtsb2FkaW5nRGF0YXNldH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cbiAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5fb25DbGlja31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQWRkIERhdGFcbiAgICAgICAgICAgICAgey8qIHtsb2FkaW5nRGF0YXNldCAmJiAoXG4gICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzXG4gICAgICAgICAgICAgICAgc2l6ZT17NjB9XG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzPXszfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy50YWJsZVByb2dyZXNzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX0gKi99XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICApO1xuICAgICAgICBcbiAgICAgIH0gXG4gICAgICAgIHJldHVybiBfcmVuZGVyTm9EYXRhc2V0TWVzc2FnZSgpO1xuICAgICAgXG4gICAgfTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhc2V0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXMucm9vdH0gc3R5bGU9e3tkaXNwbGF5OiAnZ3JpZCd9fT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luTGVmdDogJzEycHgnfX0+XG4gICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cImZpbHRlclwiPlNlYXJjaDogPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcFN0eWxlOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBib3JkZXJMZWZ0U3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0U3R5bGU6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVN0eWxlOiAnc29saWQnLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVdpZHRoOiAndGhpbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6ICdsaWdodGdyYXknXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhc2V0RmlsdGVyfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlRmlsdGVyQ2hhbmdlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8R3JpZFxuICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICBzcGFjaW5nPXsyNH1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICBtYXJnaW46ICdhdXRvJyxcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnMjQwcHgnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtyZW5kZXJEYXRhc2V0c31cbiAgICAgICAgICA8L0dyaWQ+XG4gICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgIG90aGVyUGFnZUNvbG9yPVwiYmxhY2tcIlxuICAgICAgICAgICAgc3R5bGU9e3ttYXJnaW46ICdhdXRvJ319XG4gICAgICAgICAgICBhY3RpdmVQYWdlPXt0aGlzLnN0YXRlLmN1cnJlbnRQYWdlfVxuICAgICAgICAgICAgbGltaXQ9e3RoaXMuc3RhdGUuZGF0YXNldHNQZXJQYWdlfVxuICAgICAgICAgICAgb2Zmc2V0PXt0aGlzLnN0YXRlLm9mZnNldH1cbiAgICAgICAgICAgIHRvdGFsPXtkYXRhc2V0cy5sZW5ndGh9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSwgb2Zmc2V0LCBwYWdlKSA9PiB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2Uob2Zmc2V0LCBwYWdlKX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtfcmVuZGVyQnV0dG9uKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICApO1xuICB9XG59XG5cbkxpc3RVcGxvYWQucHJvcFR5cGVzID0ge1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IHN0YXRlID0+IHN0YXRlO1xuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbnVsbCkod2l0aFN0eWxlcyhzdHlsZXMpKExpc3RVcGxvYWQpKTtcblxuLy8gPFdyYXBwZXI+XG4vLyAgICAgICAgIDxpbnB1dFxuLy8gICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbi8vICAgICAgICAgICByZWY9e3JlZiA9PiB7dGhpcy5fZmlsZUlucHV0ID0gcmVmfX1cbi8vICAgICAgICAgICBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319XG4vLyAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uQ2hhbmdlfVxuLy8gICAgICAgICAvPlxuLy8gICAgICAgICA8c3BhbiBvbkNsaWNrPXt0aGlzLl9vbkNsaWNrfT57dGhpcy5wcm9wcy5jaGlsZHJlbn08L3NwYW4+XG4vLyAgICAgICA8L1dyYXBwZXI+XG4iXX0=