UNPKG

kepler.gl

Version:

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

147 lines (144 loc) 20.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.LisaToolComponent = LisaToolComponent; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"); var _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib"); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/actions/src"); var _utils = require("./utils"); var _layerCreationTool = require("./kepler-tools/layer-creation-tool"); 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Use LisaToolComponent adding a customized Lisa map layer to kepler.gl */ function LisaToolComponent(props) { var datasets = (0, _lib.useSelector)(function (state) { return state.demo.keplerGl.map.visState.datasets; }); var layers = (0, _lib.useSelector)(function (state) { return state.demo.keplerGl.map.visState.layers; }); var dispatch = (0, _lib.useDispatch)(); var originalDatasetName = props.originalDatasetName, datasetName = props.datasetName, significanceThreshold = props.significanceThreshold, clusters = props.clusters, lagValues = props.lagValues, pValues = props.pValues, lisaValues = props.lisaValues, sigCategories = props.sigCategories, nn = props.nn, labels = props.labels, colors = props.colors; // save the result from lisa tool to a new lisa dataset (0, _react.useEffect)(function () { if (!clusters || !lagValues || !pValues || !lisaValues || !sigCategories || !nn || !labels || !colors) { return; } var lisaData = { clusters: clusters, lagValues: lagValues, pValues: pValues, lisaValues: lisaValues, sigCategories: sigCategories, nn: nn, fillColor: clusters.map(function (cluster, index) { return pValues[index] < significanceThreshold ? colors[cluster] : colors[0]; }), label: clusters.map(function (cluster, index) { return pValues[index] < significanceThreshold ? labels[cluster] : labels[0]; }) }; // create a new geojson layer using clusters with ordinal color scale and customColorScale and colors var newDataset = (0, _utils.saveAsDataset)(datasets, layers, originalDatasetName, datasetName, lisaData); if (newDataset) { // add the new dataset to the map dispatch((0, _src.addDataToMap)({ datasets: [newDataset], options: { autoCreateLayers: false, centerMap: false } })); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // create a LISA layer for the new lisa dataset (0, _react.useEffect)(function () { var datasetId = Object.keys(datasets).find(function (dataId) { return datasets[dataId].label === datasetName; }); if (!datasetId || !colors || !labels) return; var newDataset = datasets[datasetId]; if (newDataset) { var layerId = "".concat(datasetName, "_lisa"); // check if the layer already exists? if (layers.find(function (l) { return l.id === layerId; })) { return; } // add a new layer for the new dataset var layer = (0, _layerCreationTool.guessDefaultLayer)(newDataset, 'geojson'); if (!layer) return; var colorField = { name: 'clusters', type: 'integer' }; var colorDomain = Array.from({ length: colors.length }, function (_, i) { return i; }); var colorLegends = {}; for (var i = 0; i < colors.length; i++) { colorLegends[colors[i]] = labels[i]; } var colorMap = colors.map(function (color, index) { return [index, color]; }); var newLayer = { id: layerId, type: layer.type, config: _objectSpread(_objectSpread({}, layer.config), {}, { dataId: datasetId, columns: Object.keys(layer.config.columns).reduce(function (acc, key) { acc[key] = layer.config.columns[key].value; return acc; }, {}), colorScale: 'customOrdinal', colorField: colorField, strokeColorDomain: colorDomain, strokeColorField: colorField, strokeColorScale: 'customOrdinal', visConfig: _objectSpread(_objectSpread({}, layer.config.visConfig), {}, { colorRange: _objectSpread(_objectSpread({}, layer.config.visConfig.colorRange), {}, { colorDomain: colorDomain, colors: colors, colorMap: colorMap, colorLegends: colorLegends }), strokeColorRange: { category: 'Custom', name: 'custom', colors: colors, colorMap: colorMap }, strokeOpacity: 1, stroked: true, strokedWidth: 0.5 }) }) }; dispatch((0, _src.addLayer)(newLayer, datasetId)); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasets]); return null; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2xpYiIsIl9zcmMiLCJfdXRpbHMiLCJfbGF5ZXJDcmVhdGlvblRvb2wiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkxpc2FUb29sQ29tcG9uZW50IiwicHJvcHMiLCJkYXRhc2V0cyIsInVzZVNlbGVjdG9yIiwic3RhdGUiLCJkZW1vIiwia2VwbGVyR2wiLCJtYXAiLCJ2aXNTdGF0ZSIsImxheWVycyIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJvcmlnaW5hbERhdGFzZXROYW1lIiwiZGF0YXNldE5hbWUiLCJzaWduaWZpY2FuY2VUaHJlc2hvbGQiLCJjbHVzdGVycyIsImxhZ1ZhbHVlcyIsInBWYWx1ZXMiLCJsaXNhVmFsdWVzIiwic2lnQ2F0ZWdvcmllcyIsIm5uIiwibGFiZWxzIiwiY29sb3JzIiwidXNlRWZmZWN0IiwibGlzYURhdGEiLCJmaWxsQ29sb3IiLCJjbHVzdGVyIiwiaW5kZXgiLCJsYWJlbCIsIm5ld0RhdGFzZXQiLCJzYXZlQXNEYXRhc2V0IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJkYXRhc2V0SWQiLCJmaW5kIiwiZGF0YUlkIiwibGF5ZXJJZCIsImNvbmNhdCIsImwiLCJpZCIsImxheWVyIiwiZ3Vlc3NEZWZhdWx0TGF5ZXIiLCJjb2xvckZpZWxkIiwibmFtZSIsInR5cGUiLCJjb2xvckRvbWFpbiIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiY29sb3JMZWdlbmRzIiwiY29sb3JNYXAiLCJjb2xvciIsIm5ld0xheWVyIiwiY29uZmlnIiwiY29sdW1ucyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiY29sb3JTY2FsZSIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yU2NhbGUiLCJ2aXNDb25maWciLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsImNhdGVnb3J5Iiwic3Ryb2tlT3BhY2l0eSIsInN0cm9rZWQiLCJzdHJva2VkV2lkdGgiLCJhZGRMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9haS1hc3Npc3RhbnQvc3JjL3Rvb2xzL2xpc2EtdG9vbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHt1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2gsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2FkZERhdGFUb01hcCwgYWRkTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0xpc2FBZGRpdGlvbmFsRGF0YX0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZ2VvZGEnO1xuaW1wb3J0IHtzYXZlQXNEYXRhc2V0fSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7Z3Vlc3NEZWZhdWx0TGF5ZXJ9IGZyb20gJy4va2VwbGVyLXRvb2xzL2xheWVyLWNyZWF0aW9uLXRvb2wnO1xuaW1wb3J0IHtTdGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9haS1hc3Npc3RhbnQtbWFuYWdlcic7XG5cbi8qKlxuICogVXNlIExpc2FUb29sQ29tcG9uZW50IGFkZGluZyBhIGN1c3RvbWl6ZWQgTGlzYSBtYXAgbGF5ZXIgdG8ga2VwbGVyLmdsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMaXNhVG9vbENvbXBvbmVudChwcm9wczogTGlzYUFkZGl0aW9uYWxEYXRhKSB7XG4gIGNvbnN0IGRhdGFzZXRzID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5rZXBsZXJHbC5tYXAudmlzU3RhdGUuZGF0YXNldHMpO1xuICBjb25zdCBsYXllcnMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5sYXllcnMpO1xuICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG5cbiAgY29uc3Qge1xuICAgIG9yaWdpbmFsRGF0YXNldE5hbWUsXG4gICAgZGF0YXNldE5hbWUsXG4gICAgc2lnbmlmaWNhbmNlVGhyZXNob2xkLFxuICAgIGNsdXN0ZXJzLFxuICAgIGxhZ1ZhbHVlcyxcbiAgICBwVmFsdWVzLFxuICAgIGxpc2FWYWx1ZXMsXG4gICAgc2lnQ2F0ZWdvcmllcyxcbiAgICBubixcbiAgICBsYWJlbHMsXG4gICAgY29sb3JzXG4gIH0gPSBwcm9wcztcblxuICAvLyBzYXZlIHRoZSByZXN1bHQgZnJvbSBsaXNhIHRvb2wgdG8gYSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWNsdXN0ZXJzIHx8XG4gICAgICAhbGFnVmFsdWVzIHx8XG4gICAgICAhcFZhbHVlcyB8fFxuICAgICAgIWxpc2FWYWx1ZXMgfHxcbiAgICAgICFzaWdDYXRlZ29yaWVzIHx8XG4gICAgICAhbm4gfHxcbiAgICAgICFsYWJlbHMgfHxcbiAgICAgICFjb2xvcnNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaXNhRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHtcbiAgICAgIGNsdXN0ZXJzLFxuICAgICAgbGFnVmFsdWVzLFxuICAgICAgcFZhbHVlcyxcbiAgICAgIGxpc2FWYWx1ZXMsXG4gICAgICBzaWdDYXRlZ29yaWVzLFxuICAgICAgbm4sXG4gICAgICBmaWxsQ29sb3I6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gY29sb3JzW2NsdXN0ZXJdIDogY29sb3JzWzBdXG4gICAgICApLFxuICAgICAgbGFiZWw6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gbGFiZWxzW2NsdXN0ZXJdIDogbGFiZWxzWzBdXG4gICAgICApXG4gICAgfTtcbiAgICAvLyBjcmVhdGUgYSBuZXcgZ2VvanNvbiBsYXllciB1c2luZyBjbHVzdGVycyB3aXRoIG9yZGluYWwgY29sb3Igc2NhbGUgYW5kIGN1c3RvbUNvbG9yU2NhbGUgYW5kIGNvbG9yc1xuICAgIGNvbnN0IG5ld0RhdGFzZXQgPSBzYXZlQXNEYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIG9yaWdpbmFsRGF0YXNldE5hbWUsIGRhdGFzZXROYW1lLCBsaXNhRGF0YSk7XG4gICAgaWYgKG5ld0RhdGFzZXQpIHtcbiAgICAgIC8vIGFkZCB0aGUgbmV3IGRhdGFzZXQgdG8gdGhlIG1hcFxuICAgICAgZGlzcGF0Y2goXG4gICAgICAgIGFkZERhdGFUb01hcCh7ZGF0YXNldHM6IFtuZXdEYXRhc2V0XSwgb3B0aW9uczoge2F1dG9DcmVhdGVMYXllcnM6IGZhbHNlLCBjZW50ZXJNYXA6IGZhbHNlfX0pXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBjcmVhdGUgYSBMSVNBIGxheWVyIGZvciB0aGUgbmV3IGxpc2EgZGF0YXNldFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGRhdGFzZXRJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKGRhdGFJZCA9PiBkYXRhc2V0c1tkYXRhSWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZSk7XG4gICAgaWYgKCFkYXRhc2V0SWQgfHwgIWNvbG9ycyB8fCAhbGFiZWxzKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdEYXRhc2V0ID0gZGF0YXNldHNbZGF0YXNldElkXTtcbiAgICBpZiAobmV3RGF0YXNldCkge1xuICAgICAgY29uc3QgbGF5ZXJJZCA9IGAke2RhdGFzZXROYW1lfV9saXNhYDtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBsYXllciBhbHJlYWR5IGV4aXN0cz9cbiAgICAgIGlmIChsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxheWVySWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGFkZCBhIG5ldyBsYXllciBmb3IgdGhlIG5ldyBkYXRhc2V0XG4gICAgICBjb25zdCBsYXllciA9IGd1ZXNzRGVmYXVsdExheWVyKG5ld0RhdGFzZXQsICdnZW9qc29uJyk7XG4gICAgICBpZiAoIWxheWVyKSByZXR1cm47XG4gICAgICBjb25zdCBjb2xvckZpZWxkID0ge1xuICAgICAgICBuYW1lOiAnY2x1c3RlcnMnLFxuICAgICAgICB0eXBlOiAnaW50ZWdlcidcbiAgICAgIH07XG4gICAgICBjb25zdCBjb2xvckRvbWFpbiA9IEFycmF5LmZyb20oe2xlbmd0aDogY29sb3JzLmxlbmd0aH0sIChfLCBpKSA9PiBpKTtcbiAgICAgIGNvbnN0IGNvbG9yTGVnZW5kcyA9IHt9O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29sb3JMZWdlbmRzW2NvbG9yc1tpXV0gPSBsYWJlbHNbaV07XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xvck1hcCA9IGNvbG9ycy5tYXAoKGNvbG9yLCBpbmRleCkgPT4gW2luZGV4LCBjb2xvcl0pO1xuICAgICAgY29uc3QgbmV3TGF5ZXIgPSB7XG4gICAgICAgIGlkOiBsYXllcklkLFxuICAgICAgICB0eXBlOiBsYXllci50eXBlLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAuLi5sYXllci5jb25maWcsXG4gICAgICAgICAgZGF0YUlkOiBkYXRhc2V0SWQsXG4gICAgICAgICAgY29sdW1uczogT2JqZWN0LmtleXMobGF5ZXIuY29uZmlnLmNvbHVtbnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbGF5ZXIuY29uZmlnLmNvbHVtbnNba2V5XS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pLFxuICAgICAgICAgIGNvbG9yU2NhbGU6ICdjdXN0b21PcmRpbmFsJyxcbiAgICAgICAgICBjb2xvckZpZWxkLFxuICAgICAgICAgIHN0cm9rZUNvbG9yRG9tYWluOiBjb2xvckRvbWFpbixcbiAgICAgICAgICBzdHJva2VDb2xvckZpZWxkOiBjb2xvckZpZWxkLFxuICAgICAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdjdXN0b21PcmRpbmFsJyxcbiAgICAgICAgICB2aXNDb25maWc6IHtcbiAgICAgICAgICAgIC4uLmxheWVyLmNvbmZpZy52aXNDb25maWcsXG4gICAgICAgICAgICBjb2xvclJhbmdlOiB7XG4gICAgICAgICAgICAgIC4uLmxheWVyLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZSxcbiAgICAgICAgICAgICAgY29sb3JEb21haW4sXG4gICAgICAgICAgICAgIGNvbG9ycyxcbiAgICAgICAgICAgICAgY29sb3JNYXAsXG4gICAgICAgICAgICAgIGNvbG9yTGVnZW5kc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yUmFuZ2U6IHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdDdXN0b20nLFxuICAgICAgICAgICAgICBuYW1lOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgY29sb3JzLFxuICAgICAgICAgICAgICBjb2xvck1hcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6IDEsXG4gICAgICAgICAgICBzdHJva2VkOiB0cnVlLFxuICAgICAgICAgICAgc3Ryb2tlZFdpZHRoOiAwLjVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBkaXNwYXRjaChhZGRMYXllcihuZXdMYXllciwgZGF0YXNldElkKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2RhdGFzZXRzXSk7XG4gIHJldHVybiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLElBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGtCQUFBLEdBQUFKLE9BQUE7QUFBcUUsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUEsSUFSckU7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNPLFNBQVNvQixpQkFBaUJBLENBQUNDLEtBQXlCLEVBQUU7RUFDM0QsSUFBTUMsUUFBUSxHQUFHLElBQUFDLGdCQUFXLEVBQUMsVUFBQ0MsS0FBWTtJQUFBLE9BQUtBLEtBQUssQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDTixRQUFRO0VBQUEsRUFBQztFQUN6RixJQUFNTyxNQUFNLEdBQUcsSUFBQU4sZ0JBQVcsRUFBQyxVQUFDQyxLQUFZO0lBQUEsT0FBS0EsS0FBSyxDQUFDQyxJQUFJLENBQUNDLFFBQVEsQ0FBQ0MsR0FBRyxDQUFDQyxRQUFRLENBQUNDLE1BQU07RUFBQSxFQUFDO0VBQ3JGLElBQU1DLFFBQVEsR0FBRyxJQUFBQyxnQkFBVyxFQUFDLENBQUM7RUFFOUIsSUFDRUMsbUJBQW1CLEdBV2pCWCxLQUFLLENBWFBXLG1CQUFtQjtJQUNuQkMsV0FBVyxHQVVUWixLQUFLLENBVlBZLFdBQVc7SUFDWEMscUJBQXFCLEdBU25CYixLQUFLLENBVFBhLHFCQUFxQjtJQUNyQkMsUUFBUSxHQVFOZCxLQUFLLENBUlBjLFFBQVE7SUFDUkMsU0FBUyxHQU9QZixLQUFLLENBUFBlLFNBQVM7SUFDVEMsT0FBTyxHQU1MaEIsS0FBSyxDQU5QZ0IsT0FBTztJQUNQQyxVQUFVLEdBS1JqQixLQUFLLENBTFBpQixVQUFVO0lBQ1ZDLGFBQWEsR0FJWGxCLEtBQUssQ0FKUGtCLGFBQWE7SUFDYkMsRUFBRSxHQUdBbkIsS0FBSyxDQUhQbUIsRUFBRTtJQUNGQyxNQUFNLEdBRUpwQixLQUFLLENBRlBvQixNQUFNO0lBQ05DLE1BQU0sR0FDSnJCLEtBQUssQ0FEUHFCLE1BQU07O0VBR1I7RUFDQSxJQUFBQyxnQkFBUyxFQUFDLFlBQU07SUFDZCxJQUNFLENBQUNSLFFBQVEsSUFDVCxDQUFDQyxTQUFTLElBQ1YsQ0FBQ0MsT0FBTyxJQUNSLENBQUNDLFVBQVUsSUFDWCxDQUFDQyxhQUFhLElBQ2QsQ0FBQ0MsRUFBRSxJQUNILENBQUNDLE1BQU0sSUFDUCxDQUFDQyxNQUFNLEVBQ1A7TUFDQTtJQUNGO0lBRUEsSUFBTUUsUUFBbUMsR0FBRztNQUMxQ1QsUUFBUSxFQUFSQSxRQUFRO01BQ1JDLFNBQVMsRUFBVEEsU0FBUztNQUNUQyxPQUFPLEVBQVBBLE9BQU87TUFDUEMsVUFBVSxFQUFWQSxVQUFVO01BQ1ZDLGFBQWEsRUFBYkEsYUFBYTtNQUNiQyxFQUFFLEVBQUZBLEVBQUU7TUFDRkssU0FBUyxFQUFFVixRQUFRLENBQUNSLEdBQUcsQ0FBQyxVQUFDbUIsT0FBTyxFQUFFQyxLQUFLO1FBQUEsT0FDckNWLE9BQU8sQ0FBQ1UsS0FBSyxDQUFDLEdBQUdiLHFCQUFxQixHQUFHUSxNQUFNLENBQUNJLE9BQU8sQ0FBQyxHQUFHSixNQUFNLENBQUMsQ0FBQyxDQUFDO01BQUEsQ0FDdEUsQ0FBQztNQUNETSxLQUFLLEVBQUViLFFBQVEsQ0FBQ1IsR0FBRyxDQUFDLFVBQUNtQixPQUFPLEVBQUVDLEtBQUs7UUFBQSxPQUNqQ1YsT0FBTyxDQUFDVSxLQUFLLENBQUMsR0FBR2IscUJBQXFCLEdBQUdPLE1BQU0sQ0FBQ0ssT0FBTyxDQUFDLEdBQUdMLE1BQU0sQ0FBQyxDQUFDLENBQUM7TUFBQSxDQUN0RTtJQUNGLENBQUM7SUFDRDtJQUNBLElBQU1RLFVBQVUsR0FBRyxJQUFBQyxvQkFBYSxFQUFDNUIsUUFBUSxFQUFFTyxNQUFNLEVBQUVHLG1CQUFtQixFQUFFQyxXQUFXLEVBQUVXLFFBQVEsQ0FBQztJQUM5RixJQUFJSyxVQUFVLEVBQUU7TUFDZDtNQUNBbkIsUUFBUSxDQUNOLElBQUFxQixpQkFBWSxFQUFDO1FBQUM3QixRQUFRLEVBQUUsQ0FBQzJCLFVBQVUsQ0FBQztRQUFFRyxPQUFPLEVBQUU7VUFBQ0MsZ0JBQWdCLEVBQUUsS0FBSztVQUFFQyxTQUFTLEVBQUU7UUFBSztNQUFDLENBQUMsQ0FDN0YsQ0FBQztJQUNIO0lBQ0E7RUFDRixDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVOO0VBQ0EsSUFBQVgsZ0JBQVMsRUFBQyxZQUFNO0lBQ2QsSUFBTVksU0FBUyxHQUFHcEQsTUFBTSxDQUFDQyxJQUFJLENBQUNrQixRQUFRLENBQUMsQ0FBQ2tDLElBQUksQ0FBQyxVQUFBQyxNQUFNO01BQUEsT0FBSW5DLFFBQVEsQ0FBQ21DLE1BQU0sQ0FBQyxDQUFDVCxLQUFLLEtBQUtmLFdBQVc7SUFBQSxFQUFDO0lBQzlGLElBQUksQ0FBQ3NCLFNBQVMsSUFBSSxDQUFDYixNQUFNLElBQUksQ0FBQ0QsTUFBTSxFQUFFO0lBRXRDLElBQU1RLFVBQVUsR0FBRzNCLFFBQVEsQ0FBQ2lDLFNBQVMsQ0FBQztJQUN0QyxJQUFJTixVQUFVLEVBQUU7TUFDZCxJQUFNUyxPQUFPLE1BQUFDLE1BQUEsQ0FBTTFCLFdBQVcsVUFBTztNQUNyQztNQUNBLElBQUlKLE1BQU0sQ0FBQzJCLElBQUksQ0FBQyxVQUFBSSxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDQyxFQUFFLEtBQUtILE9BQU87TUFBQSxFQUFDLEVBQUU7UUFDdEM7TUFDRjtNQUNBO01BQ0EsSUFBTUksS0FBSyxHQUFHLElBQUFDLG9DQUFpQixFQUFDZCxVQUFVLEVBQUUsU0FBUyxDQUFDO01BQ3RELElBQUksQ0FBQ2EsS0FBSyxFQUFFO01BQ1osSUFBTUUsVUFBVSxHQUFHO1FBQ2pCQyxJQUFJLEVBQUUsVUFBVTtRQUNoQkMsSUFBSSxFQUFFO01BQ1IsQ0FBQztNQUNELElBQU1DLFdBQVcsR0FBR0MsS0FBSyxDQUFDQyxJQUFJLENBQUM7UUFBQ3ZELE1BQU0sRUFBRTRCLE1BQU0sQ0FBQzVCO01BQU0sQ0FBQyxFQUFFLFVBQUN3RCxDQUFDLEVBQUVDLENBQUM7UUFBQSxPQUFLQSxDQUFDO01BQUEsRUFBQztNQUNwRSxJQUFNQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO01BQ3ZCLEtBQUssSUFBSUQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHN0IsTUFBTSxDQUFDNUIsTUFBTSxFQUFFeUQsQ0FBQyxFQUFFLEVBQUU7UUFDdENDLFlBQVksQ0FBQzlCLE1BQU0sQ0FBQzZCLENBQUMsQ0FBQyxDQUFDLEdBQUc5QixNQUFNLENBQUM4QixDQUFDLENBQUM7TUFDckM7TUFDQSxJQUFNRSxRQUFRLEdBQUcvQixNQUFNLENBQUNmLEdBQUcsQ0FBQyxVQUFDK0MsS0FBSyxFQUFFM0IsS0FBSztRQUFBLE9BQUssQ0FBQ0EsS0FBSyxFQUFFMkIsS0FBSyxDQUFDO01BQUEsRUFBQztNQUM3RCxJQUFNQyxRQUFRLEdBQUc7UUFDZmQsRUFBRSxFQUFFSCxPQUFPO1FBQ1hRLElBQUksRUFBRUosS0FBSyxDQUFDSSxJQUFJO1FBQ2hCVSxNQUFNLEVBQUFoRSxhQUFBLENBQUFBLGFBQUEsS0FDRGtELEtBQUssQ0FBQ2MsTUFBTTtVQUNmbkIsTUFBTSxFQUFFRixTQUFTO1VBQ2pCc0IsT0FBTyxFQUFFMUUsTUFBTSxDQUFDQyxJQUFJLENBQUMwRCxLQUFLLENBQUNjLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDLENBQUNDLE1BQU0sQ0FBQyxVQUFDQyxHQUFHLEVBQUVDLEdBQUcsRUFBSztZQUM5REQsR0FBRyxDQUFDQyxHQUFHLENBQUMsR0FBR2xCLEtBQUssQ0FBQ2MsTUFBTSxDQUFDQyxPQUFPLENBQUNHLEdBQUcsQ0FBQyxDQUFDQyxLQUFLO1lBQzFDLE9BQU9GLEdBQUc7VUFDWixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDTkcsVUFBVSxFQUFFLGVBQWU7VUFDM0JsQixVQUFVLEVBQVZBLFVBQVU7VUFDVm1CLGlCQUFpQixFQUFFaEIsV0FBVztVQUM5QmlCLGdCQUFnQixFQUFFcEIsVUFBVTtVQUM1QnFCLGdCQUFnQixFQUFFLGVBQWU7VUFDakNDLFNBQVMsRUFBQTFFLGFBQUEsQ0FBQUEsYUFBQSxLQUNKa0QsS0FBSyxDQUFDYyxNQUFNLENBQUNVLFNBQVM7WUFDekJDLFVBQVUsRUFBQTNFLGFBQUEsQ0FBQUEsYUFBQSxLQUNMa0QsS0FBSyxDQUFDYyxNQUFNLENBQUNVLFNBQVMsQ0FBQ0MsVUFBVTtjQUNwQ3BCLFdBQVcsRUFBWEEsV0FBVztjQUNYekIsTUFBTSxFQUFOQSxNQUFNO2NBQ04rQixRQUFRLEVBQVJBLFFBQVE7Y0FDUkQsWUFBWSxFQUFaQTtZQUFZLEVBQ2I7WUFDRGdCLGdCQUFnQixFQUFFO2NBQ2hCQyxRQUFRLEVBQUUsUUFBUTtjQUNsQnhCLElBQUksRUFBRSxRQUFRO2NBQ2R2QixNQUFNLEVBQU5BLE1BQU07Y0FDTitCLFFBQVEsRUFBUkE7WUFDRixDQUFDO1lBQ0RpQixhQUFhLEVBQUUsQ0FBQztZQUNoQkMsT0FBTyxFQUFFLElBQUk7WUFDYkMsWUFBWSxFQUFFO1VBQUc7UUFDbEI7TUFFTCxDQUFDO01BQ0Q5RCxRQUFRLENBQUMsSUFBQStELGFBQVEsRUFBQ2xCLFFBQVEsRUFBRXBCLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDO0lBQ0E7RUFDRixDQUFDLEVBQUUsQ0FBQ2pDLFFBQVEsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxJQUFJO0FBQ2IiLCJpZ25vcmVMaXN0IjpbXX0=