kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
264 lines (262 loc) • 46.1 kB
JavaScript
"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.DatasetTabs = exports.DatasetModalTab = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireDefault(require("react"));
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _datasetLabel = _interopRequireDefault(require("../common/dataset-label"));
var _dataTable = _interopRequireDefault(require("../common/data-table"));
var _reselect = require("reselect");
var _cellSize = require("../common/data-table/cell-size");
var _canvas = _interopRequireDefault(require("../common/data-table/canvas"));
var _icons = require("../common/icons");
var _portaled = _interopRequireDefault(require("../common/portaled"));
var _displayFormat = _interopRequireDefault(require("../common/data-table/display-format"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var MIN_STATS_CELL_SIZE = 122;
var DEFAULT_SORT_COLUMN = {};
// sidePadding changes from 38 to 68, 30px for configuration button
var dgSettings = {
sidePadding: '68px',
verticalPadding: '16px',
height: '36px'
};
var StyledModal = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n min-height: 85vh;\n overflow: hidden;\n display: flex;\n"])));
var DatasetCatalog = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n padding: ", " ", " 0 0;\n\n .overflow-horizontal {\n display: flex;\n overflow-x: auto;\n overflow-y: hidden;\n flex-direction: row;\n ", "\n }\n"])), dgSettings.verticalPadding, dgSettings.sidePadding, function (props) {
return props.theme.modalScrollBar;
});
var DatasetModalTab = exports.DatasetModalTab = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-bottom: 3px solid ", ";\n cursor: pointer;\n display: flex;\n height: 35px;\n margin: 0 3px;\n padding: 0 5px;\n\n &:hover {\n border-bottom: 3px solid black;\n }\n"])), function (props) {
return props.active ? 'black' : 'transparent';
});
var StyledConfigureButton = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: flex-end;\n position: absolute;\n top: 24px;\n right: 48px;\n svg {\n stroke: black;\n }\n cursor: pointer;\n"])));
var DatasetTabsUnmemoized = function DatasetTabsUnmemoized(_ref) {
var activeDataset = _ref.activeDataset,
datasets = _ref.datasets,
showDatasetTable = _ref.showDatasetTable;
return /*#__PURE__*/_react["default"].createElement(DatasetCatalog, {
className: "dataset-modal-catalog"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "overflow-horizontal"
}, Object.values(datasets).map(function (dataset) {
return /*#__PURE__*/_react["default"].createElement(DatasetModalTab, {
className: "dataset-modal-tab",
active: dataset === activeDataset,
key: dataset.id,
onClick: function onClick() {
return showDatasetTable(dataset.id);
}
}, /*#__PURE__*/_react["default"].createElement(_datasetLabel["default"], {
dataset: dataset
}));
})));
};
var DatasetTabs = exports.DatasetTabs = /*#__PURE__*/_react["default"].memo(DatasetTabsUnmemoized);
DatasetTabs.displayName = 'DatasetTabs';
DataTableModalFactory.deps = [_dataTable["default"], _displayFormat["default"]];
var TableContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n min-height: 100%;\n max-height: 100%;\n max-width: 100%;\n"])));
function DataTableModalFactory(DataTable, DataTableConfig) {
var DataTableModal = /*#__PURE__*/function (_React$Component) {
function DataTableModal() {
var _this;
(0, _classCallCheck2["default"])(this, DataTableModal);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, DataTableModal, [].concat(args));
(0, _defineProperty2["default"])(_this, "state", {
showConfig: false
});
(0, _defineProperty2["default"])(_this, "datasetCellSizeCache", {});
(0, _defineProperty2["default"])(_this, "dataId", function (_ref2) {
var _ref2$dataId = _ref2.dataId,
dataId = _ref2$dataId === void 0 ? '' : _ref2$dataId;
return dataId;
});
(0, _defineProperty2["default"])(_this, "datasets", function (props) {
return props.datasets;
});
(0, _defineProperty2["default"])(_this, "fields", function (_ref3) {
var datasets = _ref3.datasets,
_ref3$dataId = _ref3.dataId,
dataId = _ref3$dataId === void 0 ? '' : _ref3$dataId;
return (datasets[dataId] || {}).fields;
});
(0, _defineProperty2["default"])(_this, "columns", (0, _reselect.createSelector)(_this.fields, function (fields) {
return fields.map(function (f) {
return f.name;
});
}));
(0, _defineProperty2["default"])(_this, "colMeta", (0, _reselect.createSelector)([_this.fields, _this.datasets], function (fields) {
return fields.reduce(function (acc, _ref4) {
var name = _ref4.name,
displayName = _ref4.displayName,
type = _ref4.type,
filterProps = _ref4.filterProps,
format = _ref4.format,
displayFormat = _ref4.displayFormat;
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, name, _objectSpread(_objectSpread(_objectSpread({
name: displayName || name,
type: type
}, format ? {
format: format
} : {}), displayFormat ? {
displayFormat: displayFormat
} : {}), filterProps !== null && filterProps !== void 0 && filterProps.columnStats ? {
columnStats: filterProps.columnStats
} : {})));
}, {});
}));
(0, _defineProperty2["default"])(_this, "cellSizeCache", (0, _reselect.createSelector)(_this.dataId, _this.datasets, function (dataId, datasets) {
if (!datasets[dataId]) {
return {};
}
var _datasets$dataId = datasets[dataId],
fields = _datasets$dataId.fields,
dataContainer = _datasets$dataId.dataContainer;
var showCalculate = null;
if (!_this.datasetCellSizeCache[dataId]) {
showCalculate = true;
} else if (_this.datasetCellSizeCache[dataId].fields !== fields || _this.datasetCellSizeCache[dataId].dataContainer !== dataContainer) {
showCalculate = true;
}
if (!showCalculate) {
return _this.datasetCellSizeCache[dataId].cellSizeCache;
}
var cellSizeCache = fields.reduce(function (acc, field, colIdx) {
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, field.name, (0, _cellSize.renderedSize)({
text: {
dataContainer: dataContainer,
column: field.displayName
},
colIdx: colIdx,
type: field.type,
fontSize: _this.props.theme.cellFontSize,
font: _this.props.theme.fontFamily,
minCellSize: MIN_STATS_CELL_SIZE
})));
}, {});
// save it to cache
_this.datasetCellSizeCache[dataId] = {
cellSizeCache: cellSizeCache,
fields: fields,
dataContainer: dataContainer
};
return cellSizeCache;
}));
(0, _defineProperty2["default"])(_this, "copyTableColumn", function (column) {
var _this$props = _this.props,
_this$props$dataId = _this$props.dataId,
dataId = _this$props$dataId === void 0 ? '' : _this$props$dataId,
copyTableColumn = _this$props.copyTableColumn;
copyTableColumn(dataId, column);
});
(0, _defineProperty2["default"])(_this, "pinTableColumn", function (column) {
var _this$props2 = _this.props,
_this$props2$dataId = _this$props2.dataId,
dataId = _this$props2$dataId === void 0 ? '' : _this$props2$dataId,
pinTableColumn = _this$props2.pinTableColumn;
pinTableColumn(dataId, column);
});
(0, _defineProperty2["default"])(_this, "sortTableColumn", function (column, mode) {
var _this$props3 = _this.props,
_this$props3$dataId = _this$props3.dataId,
dataId = _this$props3$dataId === void 0 ? '' : _this$props3$dataId,
sortTableColumn = _this$props3.sortTableColumn;
sortTableColumn(dataId, column, mode);
});
(0, _defineProperty2["default"])(_this, "setColumnDisplayFormat", function (formats) {
var _this$props4 = _this.props,
dataId = _this$props4.dataId,
setColumnDisplayFormat = _this$props4.setColumnDisplayFormat;
if (dataId) setColumnDisplayFormat(dataId, formats);
});
(0, _defineProperty2["default"])(_this, "onOpenConfig", function () {
_this.setState({
showConfig: true
});
});
(0, _defineProperty2["default"])(_this, "onCloseConfig", function () {
_this.setState({
showConfig: false
});
});
return _this;
}
(0, _inherits2["default"])(DataTableModal, _React$Component);
return (0, _createClass2["default"])(DataTableModal, [{
key: "render",
value: function render() {
var _this$props5 = this.props,
datasets = _this$props5.datasets,
dataId = _this$props5.dataId,
showDatasetTable = _this$props5.showDatasetTable,
_this$props5$showTab = _this$props5.showTab,
showTab = _this$props5$showTab === void 0 ? true : _this$props5$showTab;
if (!datasets || !dataId) {
return null;
}
var activeDataset = datasets[dataId];
var columns = this.columns(this.props);
var colMeta = this.colMeta(this.props);
var cellSizeCache = this.cellSizeCache(this.props);
return /*#__PURE__*/_react["default"].createElement(StyledModal, {
className: "dataset-modal",
id: "dataset-modal"
}, /*#__PURE__*/_react["default"].createElement(_canvas["default"], null), /*#__PURE__*/_react["default"].createElement(TableContainer, null, showTab ? /*#__PURE__*/_react["default"].createElement(DatasetTabs, {
activeDataset: activeDataset,
datasets: datasets,
showDatasetTable: showDatasetTable
}) : null, /*#__PURE__*/_react["default"].createElement(StyledConfigureButton, {
className: "display-config-button"
}, /*#__PURE__*/_react["default"].createElement(_icons.Gear, {
onClick: this.onOpenConfig
}), /*#__PURE__*/_react["default"].createElement(_portaled["default"], {
right: 240,
top: 20,
isOpened: this.state.showConfig,
onClose: this.onCloseConfig
}, /*#__PURE__*/_react["default"].createElement(DataTableConfig, {
columns: columns,
colMeta: colMeta,
setColumnDisplayFormat: this.setColumnDisplayFormat,
onClose: this.onCloseConfig
}))), datasets[dataId] ? /*#__PURE__*/_react["default"].createElement(DataTable, {
key: dataId,
dataId: dataId,
columns: columns,
colMeta: colMeta,
cellSizeCache: cellSizeCache,
dataContainer: activeDataset.dataContainer,
pinnedColumns: activeDataset.pinnedColumns,
sortOrder: activeDataset.sortOrder,
sortColumn: activeDataset.sortColumn || DEFAULT_SORT_COLUMN,
copyTableColumn: this.copyTableColumn,
pinTableColumn: this.pinTableColumn,
sortTableColumn: this.sortTableColumn,
setColumnDisplayFormat: this.setColumnDisplayFormat,
hasStats: false
}) : null));
}
}]);
}(_react["default"].Component); // @ts-expect-error figure out the proper way to type
return (0, _styledComponents.withTheme)(DataTableModal);
}
var _default = exports["default"] = DataTableModalFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfZGF0YXNldExhYmVsIiwiX2RhdGFUYWJsZSIsIl9yZXNlbGVjdCIsIl9jZWxsU2l6ZSIsIl9jYW52YXMiLCJfaWNvbnMiLCJfcG9ydGFsZWQiLCJfZGlzcGxheUZvcm1hdCIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIk1JTl9TVEFUU19DRUxMX1NJWkUiLCJERUZBVUxUX1NPUlRfQ09MVU1OIiwiZGdTZXR0aW5ncyIsInNpZGVQYWRkaW5nIiwidmVydGljYWxQYWRkaW5nIiwiaGVpZ2h0IiwiU3R5bGVkTW9kYWwiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIkRhdGFzZXRDYXRhbG9nIiwicHJvcHMiLCJ0aGVtZSIsIm1vZGFsU2Nyb2xsQmFyIiwiRGF0YXNldE1vZGFsVGFiIiwiZXhwb3J0cyIsImFjdGl2ZSIsIlN0eWxlZENvbmZpZ3VyZUJ1dHRvbiIsIkRhdGFzZXRUYWJzVW5tZW1vaXplZCIsIl9yZWYiLCJhY3RpdmVEYXRhc2V0IiwiZGF0YXNldHMiLCJzaG93RGF0YXNldFRhYmxlIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInZhbHVlcyIsIm1hcCIsImRhdGFzZXQiLCJrZXkiLCJpZCIsIm9uQ2xpY2siLCJEYXRhc2V0VGFicyIsIlJlYWN0IiwibWVtbyIsImRpc3BsYXlOYW1lIiwiRGF0YVRhYmxlTW9kYWxGYWN0b3J5IiwiZGVwcyIsIkRhdGFUYWJsZUZhY3RvcnkiLCJEYXRhVGFibGVDb25maWdGYWN0b3J5IiwiVGFibGVDb250YWluZXIiLCJEYXRhVGFibGUiLCJEYXRhVGFibGVDb25maWciLCJEYXRhVGFibGVNb2RhbCIsIl9SZWFjdCRDb21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsInNob3dDb25maWciLCJfcmVmMiIsIl9yZWYyJGRhdGFJZCIsImRhdGFJZCIsIl9yZWYzIiwiX3JlZjMkZGF0YUlkIiwiZmllbGRzIiwiY3JlYXRlU2VsZWN0b3IiLCJmIiwibmFtZSIsInJlZHVjZSIsImFjYyIsIl9yZWY0IiwidHlwZSIsImZpbHRlclByb3BzIiwiZm9ybWF0IiwiZGlzcGxheUZvcm1hdCIsImNvbHVtblN0YXRzIiwiX2RhdGFzZXRzJGRhdGFJZCIsImRhdGFDb250YWluZXIiLCJzaG93Q2FsY3VsYXRlIiwiZGF0YXNldENlbGxTaXplQ2FjaGUiLCJjZWxsU2l6ZUNhY2hlIiwiZmllbGQiLCJjb2xJZHgiLCJyZW5kZXJlZFNpemUiLCJ0ZXh0IiwiY29sdW1uIiwiZm9udFNpemUiLCJjZWxsRm9udFNpemUiLCJmb250IiwiZm9udEZhbWlseSIsIm1pbkNlbGxTaXplIiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRwcm9wcyRkYXRhSWQiLCJjb3B5VGFibGVDb2x1bW4iLCJfdGhpcyRwcm9wczIiLCJfdGhpcyRwcm9wczIkZGF0YUlkIiwicGluVGFibGVDb2x1bW4iLCJtb2RlIiwiX3RoaXMkcHJvcHMzIiwiX3RoaXMkcHJvcHMzJGRhdGFJZCIsInNvcnRUYWJsZUNvbHVtbiIsImZvcm1hdHMiLCJfdGhpcyRwcm9wczQiLCJzZXRDb2x1bW5EaXNwbGF5Rm9ybWF0Iiwic2V0U3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHM1IiwiX3RoaXMkcHJvcHM1JHNob3dUYWIiLCJzaG93VGFiIiwiY29sdW1ucyIsImNvbE1ldGEiLCJHZWFyIiwib25PcGVuQ29uZmlnIiwicmlnaHQiLCJ0b3AiLCJpc09wZW5lZCIsInN0YXRlIiwib25DbG9zZSIsIm9uQ2xvc2VDb25maWciLCJwaW5uZWRDb2x1bW5zIiwic29ydE9yZGVyIiwic29ydENvbHVtbiIsImhhc1N0YXRzIiwiQ29tcG9uZW50Iiwid2l0aFRoZW1lIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kYWxzL2RhdGEtdGFibGUtbW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lLCBJU3R5bGVkQ29tcG9uZW50fSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgRGF0YXNldExhYmVsIGZyb20gJy4uL2NvbW1vbi9kYXRhc2V0LWxhYmVsJztcbmltcG9ydCBEYXRhVGFibGVGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9kYXRhLXRhYmxlJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCB7cmVuZGVyZWRTaXplfSBmcm9tICcuLi9jb21tb24vZGF0YS10YWJsZS9jZWxsLXNpemUnO1xuaW1wb3J0IENhbnZhc0hhY2sgZnJvbSAnLi4vY29tbW9uL2RhdGEtdGFibGUvY2FudmFzJztcbmltcG9ydCBLZXBsZXJUYWJsZSwge0RhdGFzZXRzfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7VUlTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1VpU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtHZWFyfSBmcm9tICcuLi9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFBvcnRhbGVkIGZyb20gJy4uL2NvbW1vbi9wb3J0YWxlZCc7XG5pbXBvcnQgRGF0YVRhYmxlQ29uZmlnRmFjdG9yeSBmcm9tICcuLi9jb21tb24vZGF0YS10YWJsZS9kaXNwbGF5LWZvcm1hdCc7XG5pbXBvcnQge0Jhc2VDb21wb25lbnRQcm9wc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBNSU5fU1RBVFNfQ0VMTF9TSVpFID0gMTIyO1xuY29uc3QgREVGQVVMVF9TT1JUX0NPTFVNTiA9IHt9O1xuXG4vLyBzaWRlUGFkZGluZyBjaGFuZ2VzIGZyb20gMzggdG8gNjgsIDMwcHggZm9yIGNvbmZpZ3VyYXRpb24gYnV0dG9uXG5jb25zdCBkZ1NldHRpbmdzID0ge1xuICBzaWRlUGFkZGluZzogJzY4cHgnLFxuICB2ZXJ0aWNhbFBhZGRpbmc6ICcxNnB4JyxcbiAgaGVpZ2h0OiAnMzZweCdcbn07XG5cbmNvbnN0IFN0eWxlZE1vZGFsID0gc3R5bGVkLmRpdmBcbiAgbWluLWhlaWdodDogODV2aDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZGlzcGxheTogZmxleDtcbmA7XG5cbmNvbnN0IERhdGFzZXRDYXRhbG9nID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZzogJHtkZ1NldHRpbmdzLnZlcnRpY2FsUGFkZGluZ30gJHtkZ1NldHRpbmdzLnNpZGVQYWRkaW5nfSAwIDA7XG5cbiAgLm92ZXJmbG93LWhvcml6b250YWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfVxuICB9XG5gO1xuXG5leHBvcnQgdHlwZSBEYXRhc2V0TW9kYWxUYWJQcm9wcyA9IEJhc2VDb21wb25lbnRQcm9wcyAmIHtcbiAgYWN0aXZlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEYXRhc2V0TW9kYWxUYWI6IElTdHlsZWRDb21wb25lbnQ8XG4gICd3ZWInLFxuICBEYXRhc2V0TW9kYWxUYWJQcm9wc1xuPiA9IHN0eWxlZC5kaXY8RGF0YXNldE1vZGFsVGFiUHJvcHM+YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItYm90dG9tOiAzcHggc29saWQgJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gJ2JsYWNrJyA6ICd0cmFuc3BhcmVudCcpfTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDM1cHg7XG4gIG1hcmdpbjogMCAzcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xuXG4gICY6aG92ZXIge1xuICAgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCBibGFjaztcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkQ29uZmlndXJlQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDI0cHg7XG4gIHJpZ2h0OiA0OHB4O1xuICBzdmcge1xuICAgIHN0cm9rZTogYmxhY2s7XG4gIH1cbiAgY3Vyc29yOiBwb2ludGVyO1xuYDtcblxuaW50ZXJmYWNlIERhdGFzZXRUYWJzVW5tZW1vaXplZFByb3BzIHtcbiAgYWN0aXZlRGF0YXNldDogS2VwbGVyVGFibGU7XG4gIGRhdGFzZXRzOiBEYXRhc2V0cztcbiAgc2hvd0RhdGFzZXRUYWJsZTogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmNvbnN0IERhdGFzZXRUYWJzVW5tZW1vaXplZDogUmVhY3QuRkM8RGF0YXNldFRhYnNVbm1lbW9pemVkUHJvcHM+ID0gKHtcbiAgYWN0aXZlRGF0YXNldCxcbiAgZGF0YXNldHMsXG4gIHNob3dEYXRhc2V0VGFibGVcbn0pID0+IChcbiAgPERhdGFzZXRDYXRhbG9nIGNsYXNzTmFtZT1cImRhdGFzZXQtbW9kYWwtY2F0YWxvZ1wiPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3ctaG9yaXpvbnRhbFwiPlxuICAgICAge09iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcCgoZGF0YXNldDogS2VwbGVyVGFibGUpID0+IChcbiAgICAgICAgPERhdGFzZXRNb2RhbFRhYlxuICAgICAgICAgIGNsYXNzTmFtZT1cImRhdGFzZXQtbW9kYWwtdGFiXCJcbiAgICAgICAgICBhY3RpdmU9e2RhdGFzZXQgPT09IGFjdGl2ZURhdGFzZXR9XG4gICAgICAgICAga2V5PXtkYXRhc2V0LmlkfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNob3dEYXRhc2V0VGFibGUoZGF0YXNldC5pZCl9XG4gICAgICAgID5cbiAgICAgICAgICA8RGF0YXNldExhYmVsIGRhdGFzZXQ9e2RhdGFzZXR9IC8+XG4gICAgICAgIDwvRGF0YXNldE1vZGFsVGFiPlxuICAgICAgKSl9XG4gICAgPC9kaXY+XG4gIDwvRGF0YXNldENhdGFsb2c+XG4pO1xuXG5leHBvcnQgY29uc3QgRGF0YXNldFRhYnMgPSBSZWFjdC5tZW1vKERhdGFzZXRUYWJzVW5tZW1vaXplZCk7XG5cbkRhdGFzZXRUYWJzLmRpc3BsYXlOYW1lID0gJ0RhdGFzZXRUYWJzJztcblxuRGF0YVRhYmxlTW9kYWxGYWN0b3J5LmRlcHMgPSBbRGF0YVRhYmxlRmFjdG9yeSwgRGF0YVRhYmxlQ29uZmlnRmFjdG9yeV07XG5cbmNvbnN0IFRhYmxlQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC1ncm93OiAxO1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xuICBtYXgtd2lkdGg6IDEwMCU7XG5gO1xuXG5pbnRlcmZhY2UgRGF0YVRhYmxlTW9kYWxQcm9wcyB7XG4gIHRoZW1lOiBhbnk7XG4gIGRhdGFJZD86IHN0cmluZztcbiAgc29ydFRhYmxlQ29sdW1uOiAoaWQ6IHN0cmluZywgY29sdW1uOiBzdHJpbmcsIG1vZGU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHBpblRhYmxlQ29sdW1uOiAoaWQ6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNvcHlUYWJsZUNvbHVtbjogKGlkOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKSA9PiB2b2lkO1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIHNob3dEYXRhc2V0VGFibGU6IChpZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG93VGFiPzogYm9vbGVhbjtcbiAgc2V0Q29sdW1uRGlzcGxheUZvcm1hdDogKFxuICAgIGRhdGFJZDogc3RyaW5nLFxuICAgIGZvcm1hdHM6IHtcbiAgICAgIGNvbHVtbjogc3RyaW5nO1xuICAgICAgZGlzcGxheUZvcm1hdDogc3RyaW5nO1xuICAgIH1cbiAgKSA9PiB2b2lkO1xuICB1aVN0YXRlQWN0aW9uczogdHlwZW9mIFVJU3RhdGVBY3Rpb25zO1xuICB1aVN0YXRlOiBVaVN0YXRlO1xufVxuXG5mdW5jdGlvbiBEYXRhVGFibGVNb2RhbEZhY3RvcnkoXG4gIERhdGFUYWJsZTogUmV0dXJuVHlwZTx0eXBlb2YgRGF0YVRhYmxlRmFjdG9yeT4sXG4gIERhdGFUYWJsZUNvbmZpZzogUmV0dXJuVHlwZTx0eXBlb2YgRGF0YVRhYmxlQ29uZmlnRmFjdG9yeT5cbik6IFJlYWN0LkNvbXBvbmVudFR5cGU8T21pdDxEYXRhVGFibGVNb2RhbFByb3BzLCAndGhlbWUnPj4ge1xuICBjbGFzcyBEYXRhVGFibGVNb2RhbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxEYXRhVGFibGVNb2RhbFByb3BzPiB7XG4gICAgc3RhdGUgPSB7XG4gICAgICBzaG93Q29uZmlnOiBmYWxzZVxuICAgIH07XG5cbiAgICBkYXRhc2V0Q2VsbFNpemVDYWNoZSA9IHt9O1xuICAgIGRhdGFJZCA9ICh7ZGF0YUlkID0gJyd9OiBEYXRhVGFibGVNb2RhbFByb3BzKSA9PiBkYXRhSWQ7XG4gICAgZGF0YXNldHMgPSAocHJvcHM6IERhdGFUYWJsZU1vZGFsUHJvcHMpID0+IHByb3BzLmRhdGFzZXRzO1xuICAgIGZpZWxkcyA9ICh7ZGF0YXNldHMsIGRhdGFJZCA9ICcnfTogRGF0YVRhYmxlTW9kYWxQcm9wcykgPT4gKGRhdGFzZXRzW2RhdGFJZF0gfHwge30pLmZpZWxkcztcbiAgICBjb2x1bW5zID0gY3JlYXRlU2VsZWN0b3IodGhpcy5maWVsZHMsIGZpZWxkcyA9PiBmaWVsZHMubWFwKGYgPT4gZi5uYW1lKSk7XG4gICAgY29sTWV0YSA9IGNyZWF0ZVNlbGVjdG9yKFt0aGlzLmZpZWxkcywgdGhpcy5kYXRhc2V0c10sIGZpZWxkcyA9PlxuICAgICAgZmllbGRzLnJlZHVjZShcbiAgICAgICAgKGFjYywge25hbWUsIGRpc3BsYXlOYW1lLCB0eXBlLCBmaWx0ZXJQcm9wcywgZm9ybWF0LCBkaXNwbGF5Rm9ybWF0fSkgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICBuYW1lOiBkaXNwbGF5TmFtZSB8fCBuYW1lLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIC4uLihmb3JtYXQgPyB7Zm9ybWF0fSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihkaXNwbGF5Rm9ybWF0ID8ge2Rpc3BsYXlGb3JtYXR9IDoge30pLFxuICAgICAgICAgICAgLi4uKGZpbHRlclByb3BzPy5jb2x1bW5TdGF0cyA/IHtjb2x1bW5TdGF0czogZmlsdGVyUHJvcHMuY29sdW1uU3RhdHN9IDoge30pXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICApO1xuXG4gICAgY2VsbFNpemVDYWNoZSA9IGNyZWF0ZVNlbGVjdG9yKHRoaXMuZGF0YUlkLCB0aGlzLmRhdGFzZXRzLCAoZGF0YUlkLCBkYXRhc2V0cykgPT4ge1xuICAgICAgaWYgKCFkYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtmaWVsZHMsIGRhdGFDb250YWluZXJ9ID0gZGF0YXNldHNbZGF0YUlkXTtcblxuICAgICAgbGV0IHNob3dDYWxjdWxhdGU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5kYXRhc2V0Q2VsbFNpemVDYWNoZVtkYXRhSWRdKSB7XG4gICAgICAgIHNob3dDYWxjdWxhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5kYXRhc2V0Q2VsbFNpemVDYWNoZVtkYXRhSWRdLmZpZWxkcyAhPT0gZmllbGRzIHx8XG4gICAgICAgIHRoaXMuZGF0YXNldENlbGxTaXplQ2FjaGVbZGF0YUlkXS5kYXRhQ29udGFpbmVyICE9PSBkYXRhQ29udGFpbmVyXG4gICAgICApIHtcbiAgICAgICAgc2hvd0NhbGN1bGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvd0NhbGN1bGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0Q2VsbFNpemVDYWNoZVtkYXRhSWRdLmNlbGxTaXplQ2FjaGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxTaXplQ2FjaGUgPSBmaWVsZHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBmaWVsZCwgY29sSWR4KSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbZmllbGQubmFtZV06IHJlbmRlcmVkU2l6ZSh7XG4gICAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICAgIGRhdGFDb250YWluZXIsXG4gICAgICAgICAgICAgIGNvbHVtbjogZmllbGQuZGlzcGxheU5hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xJZHgsXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgZm9udFNpemU6IHRoaXMucHJvcHMudGhlbWUuY2VsbEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogdGhpcy5wcm9wcy50aGVtZS5mb250RmFtaWx5LFxuICAgICAgICAgICAgbWluQ2VsbFNpemU6IE1JTl9TVEFUU19DRUxMX1NJWkVcbiAgICAgICAgICB9KVxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgICAvLyBzYXZlIGl0IHRvIGNhY2hlXG4gICAgICB0aGlzLmRhdGFzZXRDZWxsU2l6ZUNhY2hlW2RhdGFJZF0gPSB7XG4gICAgICAgIGNlbGxTaXplQ2FjaGUsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgZGF0YUNvbnRhaW5lclxuICAgICAgfTtcbiAgICAgIHJldHVybiBjZWxsU2l6ZUNhY2hlO1xuICAgIH0pO1xuXG4gICAgY29weVRhYmxlQ29sdW1uID0gKGNvbHVtbjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YUlkID0gJycsIGNvcHlUYWJsZUNvbHVtbn0gPSB0aGlzLnByb3BzO1xuICAgICAgY29weVRhYmxlQ29sdW1uKGRhdGFJZCwgY29sdW1uKTtcbiAgICB9O1xuXG4gICAgcGluVGFibGVDb2x1bW4gPSAoY29sdW1uOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHtkYXRhSWQgPSAnJywgcGluVGFibGVDb2x1bW59ID0gdGhpcy5wcm9wcztcbiAgICAgIHBpblRhYmxlQ29sdW1uKGRhdGFJZCwgY29sdW1uKTtcbiAgICB9O1xuXG4gICAgc29ydFRhYmxlQ29sdW1uID0gKGNvbHVtbjogc3RyaW5nLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YUlkID0gJycsIHNvcnRUYWJsZUNvbHVtbn0gPSB0aGlzLnByb3BzO1xuICAgICAgc29ydFRhYmxlQ29sdW1uKGRhdGFJZCwgY29sdW1uLCBtb2RlKTtcbiAgICB9O1xuXG4gICAgc2V0Q29sdW1uRGlzcGxheUZvcm1hdCA9IGZvcm1hdHMgPT4ge1xuICAgICAgY29uc3Qge2RhdGFJZCwgc2V0Q29sdW1uRGlzcGxheUZvcm1hdH0gPSB0aGlzLnByb3BzO1xuICAgICAgaWYgKGRhdGFJZCkgc2V0Q29sdW1uRGlzcGxheUZvcm1hdChkYXRhSWQsIGZvcm1hdHMpO1xuICAgIH07XG5cbiAgICBvbk9wZW5Db25maWcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93Q29uZmlnOiB0cnVlfSk7XG4gICAgfTtcblxuICAgIG9uQ2xvc2VDb25maWcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93Q29uZmlnOiBmYWxzZX0pO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7ZGF0YXNldHMsIGRhdGFJZCwgc2hvd0RhdGFzZXRUYWJsZSwgc2hvd1RhYiA9IHRydWV9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghZGF0YXNldHMgfHwgIWRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdGl2ZURhdGFzZXQgPSBkYXRhc2V0c1tkYXRhSWRdO1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucyh0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IGNvbE1ldGEgPSB0aGlzLmNvbE1ldGEodGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjZWxsU2l6ZUNhY2hlID0gdGhpcy5jZWxsU2l6ZUNhY2hlKHRoaXMucHJvcHMpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkTW9kYWwgY2xhc3NOYW1lPVwiZGF0YXNldC1tb2RhbFwiIGlkPVwiZGF0YXNldC1tb2RhbFwiPlxuICAgICAgICAgIDxDYW52YXNIYWNrIC8+XG4gICAgICAgICAgPFRhYmxlQ29udGFpbmVyPlxuICAgICAgICAgICAge3Nob3dUYWIgPyAoXG4gICAgICAgICAgICAgIDxEYXRhc2V0VGFic1xuICAgICAgICAgICAgICAgIGFjdGl2ZURhdGFzZXQ9e2FjdGl2ZURhdGFzZXR9XG4gICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgIHNob3dEYXRhc2V0VGFibGU9e3Nob3dEYXRhc2V0VGFibGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxTdHlsZWRDb25maWd1cmVCdXR0b24gY2xhc3NOYW1lPVwiZGlzcGxheS1jb25maWctYnV0dG9uXCI+XG4gICAgICAgICAgICAgIDxHZWFyIG9uQ2xpY2s9e3RoaXMub25PcGVuQ29uZmlnfSAvPlxuICAgICAgICAgICAgICA8UG9ydGFsZWRcbiAgICAgICAgICAgICAgICByaWdodD17MjQwfVxuICAgICAgICAgICAgICAgIHRvcD17MjB9XG4gICAgICAgICAgICAgICAgaXNPcGVuZWQ9e3RoaXMuc3RhdGUuc2hvd0NvbmZpZ31cbiAgICAgICAgICAgICAgICBvbkNsb3NlPXt0aGlzLm9uQ2xvc2VDb25maWd9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8RGF0YVRhYmxlQ29uZmlnXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfVxuICAgICAgICAgICAgICAgICAgY29sTWV0YT17Y29sTWV0YX1cbiAgICAgICAgICAgICAgICAgIHNldENvbHVtbkRpc3BsYXlGb3JtYXQ9e3RoaXMuc2V0Q29sdW1uRGlzcGxheUZvcm1hdH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMub25DbG9zZUNvbmZpZ31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1BvcnRhbGVkPlxuICAgICAgICAgICAgPC9TdHlsZWRDb25maWd1cmVCdXR0b24+XG4gICAgICAgICAgICB7ZGF0YXNldHNbZGF0YUlkXSA/IChcbiAgICAgICAgICAgICAgPERhdGFUYWJsZVxuICAgICAgICAgICAgICAgIGtleT17ZGF0YUlkfVxuICAgICAgICAgICAgICAgIGRhdGFJZD17ZGF0YUlkfVxuICAgICAgICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgICAgICAgY29sTWV0YT17Y29sTWV0YX1cbiAgICAgICAgICAgICAgICBjZWxsU2l6ZUNhY2hlPXtjZWxsU2l6ZUNhY2hlfVxuICAgICAgICAgICAgICAgIGRhdGFDb250YWluZXI9e2FjdGl2ZURhdGFzZXQuZGF0YUNvbnRhaW5lcn1cbiAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zPXthY3RpdmVEYXRhc2V0LnBpbm5lZENvbHVtbnN9XG4gICAgICAgICAgICAgICAgc29ydE9yZGVyPXthY3RpdmVEYXRhc2V0LnNvcnRPcmRlcn1cbiAgICAgICAgICAgICAgICBzb3J0Q29sdW1uPXthY3RpdmVEYXRhc2V0LnNvcnRDb2x1bW4gfHwgREVGQVVMVF9TT1JUX0NPTFVNTn1cbiAgICAgICAgICAgICAgICBjb3B5VGFibGVDb2x1bW49e3RoaXMuY29weVRhYmxlQ29sdW1ufVxuICAgICAgICAgICAgICAgIHBpblRhYmxlQ29sdW1uPXt0aGlzLnBpblRhYmxlQ29sdW1ufVxuICAgICAgICAgICAgICAgIHNvcnRUYWJsZUNvbHVtbj17dGhpcy5zb3J0VGFibGVDb2x1bW59XG4gICAgICAgICAgICAgICAgc2V0Q29sdW1uRGlzcGxheUZvcm1hdD17dGhpcy5zZXRDb2x1bW5EaXNwbGF5Rm9ybWF0fVxuICAgICAgICAgICAgICAgIGhhc1N0YXRzPXtmYWxzZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvVGFibGVDb250YWluZXI+XG4gICAgICAgIDwvU3R5bGVkTW9kYWw+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgZmlndXJlIG91dCB0aGUgcHJvcGVyIHdheSB0byB0eXBlXG4gIHJldHVybiB3aXRoVGhlbWUoRGF0YVRhYmxlTW9kYWwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRhVGFibGVNb2RhbEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxTQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFJQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxTQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxjQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFBeUUsSUFBQVcsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWZ6RTtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEs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