kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
521 lines (457 loc) • 70.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.DataTable = exports.TableSection = exports.Container = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _reactVirtualized = require("react-virtualized");
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _classnames3 = _interopRequireDefault(require("classnames"));
var _reselect = require("reselect");
var _lodash = _interopRequireDefault(require("lodash.get"));
var _lodash2 = _interopRequireDefault(require("lodash.debounce"));
var _optionDropdown = _interopRequireDefault(require("./option-dropdown"));
var _grid = _interopRequireDefault(require("./grid"));
var _button = _interopRequireDefault(require("./button"));
var _icons = require("../icons");
var _fieldToken = _interopRequireDefault(require("../field-token"));
var _dataUtils = require("../../../utils/data-utils");
var _cellSize = require("./cell-size");
var _defaultSettings = require("../../../constants/default-settings");
var _fieldToAlignRight;
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; }
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-size: 11px;\n flex-grow: 1;\n color: ", ";\n width: 100%;\n\n .ReactVirtualized__Grid:focus,\n .ReactVirtualized__Grid:active {\n outline: 0;\n }\n\n .cell {\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n *:focus {\n outline: 0;\n }\n\n .results-table-wrapper {\n position: relative;\n min-height: 100%;\n max-height: 100%;\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n overflow: hidden;\n border-top: none;\n\n .scroll-in-ui-thread::after {\n content: '';\n height: 100%;\n left: 0;\n position: absolute;\n pointer-events: none;\n top: 0;\n width: 100%;\n }\n\n .grid-row {\n position: relative;\n display: flex;\n flex-direction: row;\n }\n .grid-column {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n }\n .pinned-grid-container {\n flex: 0 0 75px;\n z-index: 10;\n position: absolute;\n left: 0;\n top: 0;\n border-right: 2px solid ", ";\n }\n\n .header-grid {\n overflow: hidden !important;\n }\n\n .body-grid {\n overflow: overlay !important;\n }\n\n .pinned-grid {\n overflow: overlay !important;\n }\n\n .even-row {\n background-color: ", ";\n }\n .odd-row {\n background-color: ", ";\n }\n .cell,\n .header-cell {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n text-align: center;\n overflow: hidden;\n\n .n-sort-idx {\n font-size: 9px;\n }\n }\n .cell {\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n white-space: nowrap;\n overflow: auto;\n padding: 0 ", "px;\n font-size: ", "px;\n\n .result-link {\n text-decoration: none;\n }\n }\n .cell.end-cell,\n .header-cell.end-cell {\n border-right: none;\n padding-right: ", "px;\n }\n .cell.first-cell,\n .header-cell.first-cell {\n padding-left: ", "px;\n }\n .cell.bottom-cell {\n border-bottom: none;\n }\n .cell.align-right {\n align-items: flex-end;\n }\n .header-cell {\n border-bottom: 1px solid ", ";\n border-top: 1px solid ", ";\n padding-top: ", "px;\n padding-right: 0;\n padding-bottom: ", "px;\n padding-left: ", "px;\n align-items: center;\n justify-content: space-between;\n display: flex;\n flex-direction: row;\n background-color: ", ";\n\n &:hover {\n .more {\n color: ", ";\n }\n }\n .n-sort-idx {\n font-size: 9px;\n }\n .details {\n font-weight: 500;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n height: 100%;\n overflow: hidden;\n flex-grow: 1;\n .col-name {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n .col-name__left {\n display: flex;\n align-items: center;\n overflow: hidden;\n svg {\n margin-left: 6px;\n }\n }\n .col-name__name {\n overflow: hidden;\n white-space: nowrap;\n }\n .col-name__sort {\n cursor: pointer;\n }\n }\n }\n\n .more {\n color: transparent;\n margin-left: 5px;\n }\n }\n }\n\n :focus {\n outline: none;\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var defaultHeaderRowHeight = 55;
var defaultRowHeight = 32;
var overscanColumnCount = 10;
var overscanRowCount = 10;
var fieldToAlignRight = (_fieldToAlignRight = {}, (0, _defineProperty2["default"])(_fieldToAlignRight, _defaultSettings.ALL_FIELD_TYPES.integer, true), (0, _defineProperty2["default"])(_fieldToAlignRight, _defaultSettings.ALL_FIELD_TYPES.real, true), _fieldToAlignRight);
var Container = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.textColorLT;
}, function (props) {
return props.theme.pinnedGridBorderColor;
}, function (props) {
return props.theme.evenRowBackground;
}, function (props) {
return props.theme.oddRowBackground;
}, function (props) {
return props.theme.cellBorderColor;
}, function (props) {
return props.theme.cellBorderColor;
}, function (props) {
return props.theme.cellPaddingSide;
}, function (props) {
return props.theme.cellFontSize;
}, function (props) {
return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide;
}, function (props) {
return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide;
}, function (props) {
return props.theme.headerCellBorderColor;
}, function (props) {
return props.theme.headerCellBorderColor;
}, function (props) {
return props.theme.headerPaddingTop;
}, function (props) {
return props.theme.headerPaddingBottom;
}, function (props) {
return props.theme.cellPaddingSide;
}, function (props) {
return props.theme.headerCellBackground;
}, function (props) {
return props.theme.headerCellIconColor;
});
exports.Container = Container;
var defaultColumnWidth = 200;
var columnWidthFunction = function columnWidthFunction(columns, cellSizeCache, ghost) {
return function (_ref) {
var index = _ref.index;
return (columns[index] || {}).ghost ? ghost : cellSizeCache[columns[index]] || defaultColumnWidth;
};
};
/*
* This is an accessor method used to generalize getting a cell from a data row
*/
var getRowCell = function getRowCell(_ref2) {
var rows = _ref2.rows,
columns = _ref2.columns,
column = _ref2.column,
colMeta = _ref2.colMeta,
rowIndex = _ref2.rowIndex,
sortColumn = _ref2.sortColumn,
sortOrder = _ref2.sortOrder;
var rowIdx = sortOrder && sortOrder.length ? (0, _lodash["default"])(sortOrder, rowIndex) : rowIndex;
var type = colMeta[column];
return (0, _dataUtils.parseFieldValue)((0, _lodash["default"])(rows, [rowIdx, columns.indexOf(column)], 'Err'), type);
};
var renderHeaderCell = function renderHeaderCell(columns, isPinned, props, toggleMoreOptions, moreOptionsColumn) {
// eslint-disable-next-line react/display-name
return function (cellInfo) {
var _classnames;
var columnIndex = cellInfo.columnIndex,
key = cellInfo.key,
style = cellInfo.style;
var colMeta = props.colMeta,
sortColumn = props.sortColumn,
_sortTableColumn = props.sortTableColumn,
unsortColumn = props.unsortColumn,
_pinTableColumn = props.pinTableColumn,
_copyTableColumn = props.copyTableColumn,
dataId = props.dataId;
var column = columns[columnIndex];
var isGhost = column.ghost;
var isSorted = sortColumn[column];
var firstCell = columnIndex === 0;
return _react["default"].createElement("div", {
className: (0, _classnames3["default"])('header-cell', (_classnames = {}, (0, _defineProperty2["default"])(_classnames, "column-".concat(columnIndex), true), (0, _defineProperty2["default"])(_classnames, 'pinned-header-cell', isPinned), (0, _defineProperty2["default"])(_classnames, 'first-cell', firstCell), _classnames)),
key: key,
style: style,
onClick: function onClick(e) {
e.shiftKey ? _sortTableColumn(dataId, column) : null;
},
onDoubleClick: function onDoubleClick() {
return _sortTableColumn(dataId, column);
},
title: column
}, isGhost ? _react["default"].createElement("div", null) : _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("section", {
className: "details"
}, _react["default"].createElement("div", {
className: "col-name"
}, _react["default"].createElement("div", {
className: "col-name__left"
}, _react["default"].createElement("div", {
className: "col-name__name"
}, column), _react["default"].createElement(_button["default"], {
className: "col-name__sort",
onClick: function onClick() {
return _sortTableColumn(dataId, column);
}
}, isSorted ? isSorted === _defaultSettings.SORT_ORDER.ASCENDING ? _react["default"].createElement(_icons.ArrowUp, {
height: "14px"
}) : _react["default"].createElement(_icons.ArrowDown, {
height: "14px"
}) : null)), _react["default"].createElement(_button["default"], {
className: "more",
onClick: function onClick() {
return toggleMoreOptions(column);
}
}, _react["default"].createElement(_icons.VertThreeDots, {
height: "14px"
}))), _react["default"].createElement(_fieldToken["default"], {
type: colMeta[column]
})), _react["default"].createElement("section", {
className: "options"
}, _react["default"].createElement(_optionDropdown["default"], {
isOpened: moreOptionsColumn === column,
type: colMeta[column],
column: column,
toggleMoreOptions: toggleMoreOptions,
sortTableColumn: function sortTableColumn(mode) {
return _sortTableColumn(dataId, column, mode);
},
sortMode: sortColumn && sortColumn[column],
pinTableColumn: function pinTableColumn() {
return _pinTableColumn(dataId, column);
},
copyTableColumn: function copyTableColumn() {
return _copyTableColumn(dataId, column);
},
isSorted: isSorted,
isPinned: isPinned,
unsortColumn: unsortColumn
}))));
};
};
var renderDataCell = function renderDataCell(columns, isPinned, props) {
return function (cellInfo) {
var _classnames2;
var columnIndex = cellInfo.columnIndex,
key = cellInfo.key,
style = cellInfo.style,
rowIndex = cellInfo.rowIndex;
var rows = props.rows,
colMeta = props.colMeta;
var column = columns[columnIndex];
var isGhost = column.ghost;
var rowCell = isGhost ? '' : getRowCell(_objectSpread({}, props, {
column: column,
rowIndex: rowIndex
}));
var type = isGhost ? null : colMeta[column];
var endCell = columnIndex === columns.length - 1;
var firstCell = columnIndex === 0;
var bottomCell = rowIndex === rows.length - 1;
var alignRight = fieldToAlignRight[type];
var cell = _react["default"].createElement("div", {
className: (0, _classnames3["default"])('cell', (_classnames2 = {}, (0, _defineProperty2["default"])(_classnames2, rowIndex % 2 === 0 ? 'even-row' : 'odd-row', true), (0, _defineProperty2["default"])(_classnames2, "row-".concat(rowIndex), true), (0, _defineProperty2["default"])(_classnames2, 'pinned-cell', isPinned), (0, _defineProperty2["default"])(_classnames2, 'first-cell', firstCell), (0, _defineProperty2["default"])(_classnames2, 'end-cell', endCell), (0, _defineProperty2["default"])(_classnames2, 'bottom-cell', bottomCell), (0, _defineProperty2["default"])(_classnames2, 'align-right', alignRight), _classnames2)),
key: key,
style: style,
title: isGhost ? undefined : rowCell
}, "".concat(rowCell).concat(endCell ? '\n' : '\t'));
return cell;
};
};
var TableSection = function TableSection(_ref3) {
var classList = _ref3.classList,
isPinned = _ref3.isPinned,
columns = _ref3.columns,
headerGridProps = _ref3.headerGridProps,
fixedWidth = _ref3.fixedWidth,
fixedHeight = _ref3.fixedHeight,
onScroll = _ref3.onScroll,
scrollTop = _ref3.scrollTop,
dataGridProps = _ref3.dataGridProps,
columnWidth = _ref3.columnWidth,
setGridRef = _ref3.setGridRef,
headerCellRender = _ref3.headerCellRender,
dataCellRender = _ref3.dataCellRender,
scrollLeft = _ref3.scrollLeft;
return _react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref4) {
var width = _ref4.width,
height = _ref4.height;
var gridDimension = {
columnCount: columns.length,
columnWidth: columnWidth,
width: fixedWidth || width
};
var dataGridHeight = fixedHeight || height;
return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("div", {
className: (0, _classnames3["default"])('scroll-in-ui-thread', classList.header)
}, _react["default"].createElement(_grid["default"], (0, _extends2["default"])({
cellRenderer: headerCellRender
}, headerGridProps, gridDimension, {
scrollLeft: scrollLeft
}))), _react["default"].createElement("div", {
className: (0, _classnames3["default"])('scroll-in-ui-thread', classList.rows),
style: {
top: headerGridProps.height
}
}, _react["default"].createElement(_grid["default"], (0, _extends2["default"])({
cellRenderer: dataCellRender
}, dataGridProps, gridDimension, {
className: isPinned ? 'pinned-grid' : 'body-grid',
height: dataGridHeight - headerGridProps.height,
onScroll: onScroll,
scrollTop: scrollTop,
setGridRef: setGridRef
}))));
});
};
exports.TableSection = TableSection;
var DataTable =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(DataTable, _Component);
function DataTable() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, DataTable);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(DataTable)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
cellSizeCache: {},
moreOptionsColumn: null
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "root", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "columns", function (props) {
return props.columns;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "pinnedColumns", function (props) {
return props.pinnedColumns;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "unpinnedColumns", (0, _reselect.createSelector)(_this.columns, _this.pinnedColumns, function (columns, pinnedColumns) {
return !Array.isArray(pinnedColumns) ? columns : columns.filter(function (c) {
return !pinnedColumns.includes(c);
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleMoreOptions", function (moreOptionsColumn) {
return _this.setState({
moreOptionsColumn: _this.state.moreOptionsColumn === moreOptionsColumn ? null : moreOptionsColumn
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getCellSizeCache", function () {
var _this$props = _this.props,
propsCache = _this$props.cellSizeCache,
fixedWidth = _this$props.fixedWidth,
pinnedColumns = _this$props.pinnedColumns;
var unpinnedColumns = _this.unpinnedColumns(_this.props);
var width = fixedWidth ? fixedWidth : _this.root.current ? _this.root.current.clientWidth : 0; // pin column border is 2 pixel vs 1 pixel
var adjustWidth = pinnedColumns.length ? width - 1 : width;
var _adjustCellsToContain = (0, _cellSize.adjustCellsToContainer)(adjustWidth, propsCache, pinnedColumns, unpinnedColumns),
cellSizeCache = _adjustCellsToContain.cellSizeCache,
ghost = _adjustCellsToContain.ghost;
return {
cellSizeCache: cellSizeCache,
ghost: ghost
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "doScaleCellsToWidth", function () {
_this.setState(_this.getCellSizeCache());
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scaleCellsToWidth", (0, _lodash2["default"])(_this.doScaleCellsToWidth, 300));
return _this;
}
(0, _createClass2["default"])(DataTable, [{
key: "componentDidMount",
value: function componentDidMount() {
window.addEventListener('resize', this.scaleCellsToWidth);
this.scaleCellsToWidth();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (this.props.cellSizeCache !== prevProps.cellSizeCache || this.props.pinnedColumns !== prevProps.pinnedColumns) {
this.scaleCellsToWidth();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
window.removeEventListener('resize', this.scaleCellsToWidth);
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props2 = this.props,
rows = _this$props2.rows,
pinnedColumns = _this$props2.pinnedColumns,
_this$props2$theme = _this$props2.theme,
theme = _this$props2$theme === void 0 ? {} : _this$props2$theme,
fixedWidth = _this$props2.fixedWidth,
fixedHeight = _this$props2.fixedHeight;
var unpinnedColumns = this.unpinnedColumns(this.props);
var _this$state = this.state,
cellSizeCache = _this$state.cellSizeCache,
moreOptionsColumn = _this$state.moreOptionsColumn,
ghost = _this$state.ghost;
var unpinnedColumnsGhost = ghost ? [].concat((0, _toConsumableArray2["default"])(unpinnedColumns), [{
ghost: true
}]) : unpinnedColumns;
var pinnedColumnsWidth = pinnedColumns.reduce(function (acc, val) {
return acc + (0, _lodash["default"])(cellSizeCache, val, 0);
}, 0);
var hasPinnedColumns = Boolean(pinnedColumns.length);
var _theme$headerRowHeigh = theme.headerRowHeight,
headerRowHeight = _theme$headerRowHeigh === void 0 ? defaultHeaderRowHeight : _theme$headerRowHeigh,
_theme$rowHeight = theme.rowHeight,
rowHeight = _theme$rowHeight === void 0 ? defaultRowHeight : _theme$rowHeight;
var headerGridProps = {
cellSizeCache: cellSizeCache,
className: 'header-grid',
height: headerRowHeight,
rowCount: 1,
rowHeight: headerRowHeight
};
var dataGridProps = {
cellSizeCache: cellSizeCache,
overscanColumnCount: overscanColumnCount,
overscanRowCount: overscanRowCount,
rowCount: (rows || []).length,
rowHeight: rowHeight
};
return _react["default"].createElement(Container, {
className: "data-table-container",
ref: this.root
}, Object.keys(cellSizeCache).length && _react["default"].createElement(_reactVirtualized.ScrollSync, null, function (_ref5) {
var _onScroll = _ref5.onScroll,
scrollLeft = _ref5.scrollLeft,
scrollTop = _ref5.scrollTop;
return _react["default"].createElement("div", {
className: "results-table-wrapper"
}, hasPinnedColumns && _react["default"].createElement("div", {
key: "pinned-columns",
className: "pinned-columns grid-row"
}, _react["default"].createElement(TableSection, {
classList: {
header: 'pinned-columns--header pinned-grid-container',
rows: 'pinned-columns--rows pinned-grid-container'
},
isPinned: true,
columns: pinnedColumns,
headerGridProps: headerGridProps,
fixedWidth: pinnedColumnsWidth,
onScroll: function onScroll(args) {
return _onScroll(_objectSpread({}, args, {
scrollLeft: scrollLeft
}));
},
scrollTop: scrollTop,
dataGridProps: dataGridProps,
setGridRef: function setGridRef(pinnedGrid) {
return _this2.pinnedGrid = pinnedGrid;
},
columnWidth: columnWidthFunction(pinnedColumns, cellSizeCache),
headerCellRender: renderHeaderCell(pinnedColumns, true, _this2.props, _this2.toggleMoreOptions, moreOptionsColumn),
dataCellRender: renderDataCell(pinnedColumns, true, _this2.props)
})), _react["default"].createElement("div", {
key: "unpinned-columns",
style: {
marginLeft: "".concat(hasPinnedColumns ? "".concat(pinnedColumnsWidth, "px") : '0')
},
className: "unpinned-columns grid-column"
}, _react["default"].createElement(TableSection, {
classList: {
header: 'unpinned-columns--header unpinned-grid-container',
rows: 'unpinned-columns--rows unpinned-grid-container'
},
isPinned: false,
columns: unpinnedColumnsGhost,
ghost: ghost,
headerGridProps: headerGridProps,
fixedWidth: fixedWidth,
fixedHeight: fixedHeight,
onScroll: _onScroll,
scrollTop: scrollTop,
scrollLeft: scrollLeft,
dataGridProps: dataGridProps,
setGridRef: function setGridRef(unpinnedGrid) {
return _this2.unpinnedGrid = unpinnedGrid;
},
columnWidth: columnWidthFunction(unpinnedColumnsGhost, cellSizeCache, ghost),
headerCellRender: renderHeaderCell(unpinnedColumnsGhost, false, _this2.props, _this2.toggleMoreOptions, moreOptionsColumn),
dataCellRender: renderDataCell(unpinnedColumnsGhost, false, _this2.props)
})));
}));
}
}]);
return DataTable;
}(_react.Component);
exports.DataTable = DataTable;
(0, _defineProperty2["default"])(DataTable, "defaultProps", {
rows: [],
pinnedColumns: [],
colMeta: {},
cellSizeCache: {},
sortColumn: {},
fixedWidth: null,
fixedHeight: null,
theme: {}
});
function DataTableFactory() {
return (0, _styledComponents.withTheme)(DataTable);
}
var _default = DataTableFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9kYXRhLXRhYmxlL2luZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHRIZWFkZXJSb3dIZWlnaHQiLCJkZWZhdWx0Um93SGVpZ2h0Iiwib3ZlcnNjYW5Db2x1bW5Db3VudCIsIm92ZXJzY2FuUm93Q291bnQiLCJmaWVsZFRvQWxpZ25SaWdodCIsIkFMTF9GSUVMRF9UWVBFUyIsImludGVnZXIiLCJyZWFsIiwiQ29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwicHJvcHMiLCJ0aGVtZSIsInRleHRDb2xvckxUIiwicGlubmVkR3JpZEJvcmRlckNvbG9yIiwiZXZlblJvd0JhY2tncm91bmQiLCJvZGRSb3dCYWNrZ3JvdW5kIiwiY2VsbEJvcmRlckNvbG9yIiwiY2VsbFBhZGRpbmdTaWRlIiwiY2VsbEZvbnRTaXplIiwiZWRnZUNlbGxQYWRkaW5nU2lkZSIsImhlYWRlckNlbGxCb3JkZXJDb2xvciIsImhlYWRlclBhZGRpbmdUb3AiLCJoZWFkZXJQYWRkaW5nQm90dG9tIiwiaGVhZGVyQ2VsbEJhY2tncm91bmQiLCJoZWFkZXJDZWxsSWNvbkNvbG9yIiwiZGVmYXVsdENvbHVtbldpZHRoIiwiY29sdW1uV2lkdGhGdW5jdGlvbiIsImNvbHVtbnMiLCJjZWxsU2l6ZUNhY2hlIiwiZ2hvc3QiLCJpbmRleCIsImdldFJvd0NlbGwiLCJyb3dzIiwiY29sdW1uIiwiY29sTWV0YSIsInJvd0luZGV4Iiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsInJvd0lkeCIsImxlbmd0aCIsInR5cGUiLCJpbmRleE9mIiwicmVuZGVySGVhZGVyQ2VsbCIsImlzUGlubmVkIiwidG9nZ2xlTW9yZU9wdGlvbnMiLCJtb3JlT3B0aW9uc0NvbHVtbiIsImNlbGxJbmZvIiwiY29sdW1uSW5kZXgiLCJrZXkiLCJzdHlsZSIsInNvcnRUYWJsZUNvbHVtbiIsInVuc29ydENvbHVtbiIsInBpblRhYmxlQ29sdW1uIiwiY29weVRhYmxlQ29sdW1uIiwiZGF0YUlkIiwiaXNHaG9zdCIsImlzU29ydGVkIiwiZmlyc3RDZWxsIiwiZSIsInNoaWZ0S2V5IiwiU09SVF9PUkRFUiIsIkFTQ0VORElORyIsIm1vZGUiLCJyZW5kZXJEYXRhQ2VsbCIsInJvd0NlbGwiLCJlbmRDZWxsIiwiYm90dG9tQ2VsbCIsImFsaWduUmlnaHQiLCJjZWxsIiwidW5kZWZpbmVkIiwiVGFibGVTZWN0aW9uIiwiY2xhc3NMaXN0IiwiaGVhZGVyR3JpZFByb3BzIiwiZml4ZWRXaWR0aCIsImZpeGVkSGVpZ2h0Iiwib25TY3JvbGwiLCJzY3JvbGxUb3AiLCJkYXRhR3JpZFByb3BzIiwiY29sdW1uV2lkdGgiLCJzZXRHcmlkUmVmIiwiaGVhZGVyQ2VsbFJlbmRlciIsImRhdGFDZWxsUmVuZGVyIiwic2Nyb2xsTGVmdCIsIndpZHRoIiwiaGVpZ2h0IiwiZ3JpZERpbWVuc2lvbiIsImNvbHVtbkNvdW50IiwiZGF0YUdyaWRIZWlnaHQiLCJoZWFkZXIiLCJ0b3AiLCJEYXRhVGFibGUiLCJwaW5uZWRDb2x1bW5zIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwiYyIsImluY2x1ZGVzIiwic2V0U3RhdGUiLCJzdGF0ZSIsInByb3BzQ2FjaGUiLCJ1bnBpbm5lZENvbHVtbnMiLCJyb290IiwiY3VycmVudCIsImNsaWVudFdpZHRoIiwiYWRqdXN0V2lkdGgiLCJnZXRDZWxsU2l6ZUNhY2hlIiwiZG9TY2FsZUNlbGxzVG9XaWR0aCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzY2FsZUNlbGxzVG9XaWR0aCIsInByZXZQcm9wcyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1bnBpbm5lZENvbHVtbnNHaG9zdCIsInBpbm5lZENvbHVtbnNXaWR0aCIsInJlZHVjZSIsImFjYyIsInZhbCIsImhhc1Bpbm5lZENvbHVtbnMiLCJCb29sZWFuIiwiaGVhZGVyUm93SGVpZ2h0Iiwicm93SGVpZ2h0IiwiY2xhc3NOYW1lIiwicm93Q291bnQiLCJPYmplY3QiLCJrZXlzIiwiYXJncyIsInBpbm5lZEdyaWQiLCJtYXJnaW5MZWZ0IiwidW5waW5uZWRHcmlkIiwiQ29tcG9uZW50IiwiRGF0YVRhYmxlRmFjdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsc0JBQXNCLEdBQUcsRUFBL0I7QUFDQSxJQUFNQyxnQkFBZ0IsR0FBRyxFQUF6QjtBQUNBLElBQU1DLG1CQUFtQixHQUFHLEVBQTVCO0FBQ0EsSUFBTUMsZ0JBQWdCLEdBQUcsRUFBekI7QUFDQSxJQUFNQyxpQkFBaUIsa0ZBQ3BCQyxpQ0FBZ0JDLE9BREksRUFDTSxJQUROLHdEQUVwQkQsaUNBQWdCRSxJQUZJLEVBRUcsSUFGSCxzQkFBdkI7O0FBS08sSUFBTUMsU0FBUyxHQUFHQyw2QkFBT0MsR0FBVixvQkFJWCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFdBQWhCO0FBQUEsQ0FKTSxFQTBEVSxVQUFBRixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlFLHFCQUFoQjtBQUFBLENBMURmLEVBMEVJLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsaUJBQWhCO0FBQUEsQ0ExRVQsRUE2RUksVUFBQUosS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZSSxnQkFBaEI7QUFBQSxDQTdFVCxFQStGVyxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLGVBQWhCO0FBQUEsQ0EvRmhCLEVBZ0dVLFVBQUFOLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUssZUFBaEI7QUFBQSxDQWhHZixFQW1HSCxVQUFBTixLQUFLO0FBQUEsU0FBSUEsS0FBSyxD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QUFhLEVBQUUsRUFGSztBQUdwQnpELEVBQUFBLE9BQU8sRUFBRSxFQUhXO0FBSXBCTixFQUFBQSxhQUFhLEVBQUUsRUFKSztBQUtwQlEsRUFBQUEsVUFBVSxFQUFFLEVBTFE7QUFNcEJxQyxFQUFBQSxVQUFVLEVBQUUsSUFOUTtBQU9wQkMsRUFBQUEsV0FBVyxFQUFFLElBUE87QUFRcEIvRCxFQUFBQSxLQUFLLEVBQUU7QUFSYSxDOztBQW9MeEIsU0FBU3VILGdCQUFULEdBQTRCO0FBQzFCLFNBQU8saUNBQVV4QyxTQUFWLENBQVA7QUFDRDs7ZUFFY3dDLGdCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U2Nyb2xsU3luYywgQXV0b1NpemVyfSBmcm9tICdyZWFjdC12aXJ0dWFsaXplZCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcblxuaW1wb3J0IE9wdGlvbkRyb3Bkb3duIGZyb20gJy4vb3B0aW9uLWRyb3Bkb3duJztcblxuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHtBcnJvd1VwLCBBcnJvd0Rvd259IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCB7VmVydFRocmVlRG90c30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IEZpZWxkVG9rZW4gZnJvbSAnY29tcG9uZW50cy9jb21tb24vZmllbGQtdG9rZW4nO1xuXG5pbXBvcnQge3BhcnNlRmllbGRWYWx1ZX0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge2FkanVzdENlbGxzVG9Db250YWluZXJ9IGZyb20gJy4vY2VsbC1zaXplJztcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIFNPUlRfT1JERVJ9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgZGVmYXVsdEhlYWRlclJvd0hlaWdodCA9IDU1O1xuY29uc3QgZGVmYXVsdFJvd0hlaWdodCA9IDMyO1xuY29uc3Qgb3ZlcnNjYW5Db2x1bW5Db3VudCA9IDEwO1xuY29uc3Qgb3ZlcnNjYW5Sb3dDb3VudCA9IDEwO1xuY29uc3QgZmllbGRUb0FsaWduUmlnaHQgPSB7XG4gIFtBTExfRklFTERfVFlQRVMuaW50ZWdlcl06IHRydWUsXG4gIFtBTExfRklFTERfVFlQRVMucmVhbF06IHRydWVcbn07XG5cbmV4cG9ydCBjb25zdCBDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZsZXgtZ3JvdzogMTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yTFR9O1xuICB3aWR0aDogMTAwJTtcblxuICAuUmVhY3RWaXJ0dWFsaXplZF9fR3JpZDpmb2N1cyxcbiAgLlJlYWN0VmlydHVhbGl6ZWRfX0dyaWQ6YWN0aXZlIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG5cbiAgLmNlbGwge1xuICAgICY6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgKjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC5yZXN1bHRzLXRhYmxlLXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG5cbiAgICAuc2Nyb2xsLWluLXVpLXRocmVhZDo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB0b3A6IDA7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZ3JpZC1yb3cge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgfVxuICAgIC5ncmlkLWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIH1cbiAgICAucGlubmVkLWdyaWQtY29udGFpbmVyIHtcbiAgICAgIGZsZXg6IDAgMCA3NXB4O1xuICAgICAgei1pbmRleDogMTA7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgdG9wOiAwO1xuICAgICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5waW5uZWRHcmlkQm9yZGVyQ29sb3J9O1xuICAgIH1cblxuICAgIC5oZWFkZXItZ3JpZCB7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmJvZHktZ3JpZCB7XG4gICAgICBvdmVyZmxvdzogb3ZlcmxheSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5waW5uZWQtZ3JpZCB7XG4gICAgICBvdmVyZmxvdzogb3ZlcmxheSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5ldmVuLXJvdyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmV2ZW5Sb3dCYWNrZ3JvdW5kfTtcbiAgICB9XG4gICAgLm9kZC1yb3cge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5vZGRSb3dCYWNrZ3JvdW5kfTtcbiAgICB9XG4gICAgLmNlbGwsXG4gICAgLmh