UNPKG

kepler.gl

Version:

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

97 lines (90 loc) 15.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getQueryTool = getQueryTool; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _react = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _duckdb = require("@openassistant/duckdb"); var _tables = require("@openassistant/tables"); var _utils = require("@openassistant/utils"); var _utils2 = require("./utils"); var _tableTool = require("./kepler-tools/table-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 function getQueryTool(datasets, layers) { var toolCache = _utils.ToolCache.getInstance(); // context for query tools var getValues = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(datasetName, variableName) { var values; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: values = (0, _utils2.getValuesFromDataset)(datasets, layers, datasetName, variableName); return _context.abrupt("return", values); case 2: case "end": return _context.stop(); } }, _callee); })); return function getValues(_x, _x2) { return _ref.apply(this, arguments); }; }(); // customize some query tools from localQuery tool function QueryToolComponent(props) { return /*#__PURE__*/_react["default"].createElement(_tables.QueryDuckDBComponent, (0, _extends2["default"])({}, props, { getValues: getValues, getDuckDB: _duckdb.getDuckDB })); } // this tool will execute a generic select SQL query against user's dataset var genericQuery = _objectSpread(_objectSpread({}, _duckdb.localQuery), {}, { description: "execute a generic select SQL query in duckdb to answer user's question. Please note:\n1. This tool is NOT for filtering the user dataset.\n2. This tool does NOT support geometry column and geometric operations.\n3. The variableNames should not be empty. If it is not provided, then pick a variable name from the dataset.\n4. There is no need to add a sub-query to add an auto-increment column 'row_index' to the original dataset.\n", context: _objectSpread(_objectSpread({}, _duckdb.localQuery.context), {}, { getValues: getValues }), component: QueryToolComponent }); // customize a filterDataset tool from localQuery tool // this tool will use the selected rows (row indexes) to filter the user dataset and save the result as a new dataset. var filterDataset = _objectSpread(_objectSpread({}, _duckdb.localQuery), {}, { description: "filter the user dataset by using a select SQL query in duckdb and save the result as a new dataset.\nPlease note:\n1. Do not use * to select all columns, instead use all the column names in dataset.\n", context: _objectSpread(_objectSpread({}, _duckdb.localQuery.context), {}, { getValues: getValues }), component: _tableTool.TableToolComponent }); // customize a table tool from localQuery tool to create a new table/dataset in kepler.gl using SQL query var tableTool = _objectSpread(_objectSpread({}, _duckdb.localQuery), {}, { description: "Create a new table/dataset in kepler.gl using SQL query which will\n1. add a new column to the original dataset\n2. delete a column from the original dataset\n3. rename a column in the original dataset\n4. change the column type in the original dataset.\nPlease note:\n1. Do not use * to select all columns, instead use all the column names in dataset.\n2. List all column names the new table or dataset will have.\n", context: _objectSpread(_objectSpread({}, _duckdb.localQuery.context), {}, { getValues: getValues }), component: _tableTool.TableToolComponent }); // customize a mergeTables tool from localQuery tool to merge two datasets into a new dataset var mergeTablesTool = _objectSpread(_objectSpread({}, _duckdb.mergeTables), {}, { context: { getValues: getValues }, onToolCompleted: function onToolCompleted(toolName, additionalData) { toolCache.addDataset(toolName, additionalData); } // component: MergeTablesToolComponent }); return { filterDataset: filterDataset, genericQuery: genericQuery, tableTool: tableTool, mergeTablesTool: mergeTablesTool }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9kdWNrZGIiLCJfdGFibGVzIiwiX3V0aWxzIiwiX3V0aWxzMiIsIl90YWJsZVRvb2wiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImdldFF1ZXJ5VG9vbCIsImRhdGFzZXRzIiwibGF5ZXJzIiwidG9vbENhY2hlIiwiVG9vbENhY2hlIiwiZ2V0SW5zdGFuY2UiLCJnZXRWYWx1ZXMiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJkYXRhc2V0TmFtZSIsInZhcmlhYmxlTmFtZSIsInZhbHVlcyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsImFicnVwdCIsInN0b3AiLCJfeCIsIl94MiIsIlF1ZXJ5VG9vbENvbXBvbmVudCIsInByb3BzIiwiY3JlYXRlRWxlbWVudCIsIlF1ZXJ5RHVja0RCQ29tcG9uZW50IiwiX2V4dGVuZHMyIiwiZ2V0RHVja0RCIiwiZ2VuZXJpY1F1ZXJ5IiwibG9jYWxRdWVyeSIsImRlc2NyaXB0aW9uIiwiY29udGV4dCIsImNvbXBvbmVudCIsImZpbHRlckRhdGFzZXQiLCJUYWJsZVRvb2xDb21wb25lbnQiLCJ0YWJsZVRvb2wiLCJtZXJnZVRhYmxlc1Rvb2wiLCJtZXJnZVRhYmxlcyIsIm9uVG9vbENvbXBsZXRlZCIsInRvb2xOYW1lIiwiYWRkaXRpb25hbERhdGEiLCJhZGREYXRhc2V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FpLWFzc2lzdGFudC9zcmMvdG9vbHMvcXVlcnktdG9vbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgZ2V0RHVja0RCLFxuICBsb2NhbFF1ZXJ5LFxuICBMb2NhbFF1ZXJ5VG9vbCxcbiAgbWVyZ2VUYWJsZXMsXG4gIE1lcmdlVGFibGVzVG9vbFxufSBmcm9tICdAb3BlbmFzc2lzdGFudC9kdWNrZGInO1xuaW1wb3J0IHtRdWVyeUR1Y2tEQkNvbXBvbmVudCwgUXVlcnlEdWNrREJPdXRwdXREYXRhfSBmcm9tICdAb3BlbmFzc2lzdGFudC90YWJsZXMnO1xuaW1wb3J0IHtUb29sQ2FjaGV9IGZyb20gJ0BvcGVuYXNzaXN0YW50L3V0aWxzJztcblxuaW1wb3J0IHtnZXRWYWx1ZXNGcm9tRGF0YXNldH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1RhYmxlVG9vbENvbXBvbmVudH0gZnJvbSAnLi9rZXBsZXItdG9vbHMvdGFibGUtdG9vbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVRvb2woZGF0YXNldHM6IERhdGFzZXRzLCBsYXllcnM6IExheWVyW10pIHtcbiAgY29uc3QgdG9vbENhY2hlID0gVG9vbENhY2hlLmdldEluc3RhbmNlKCk7XG5cbiAgLy8gY29udGV4dCBmb3IgcXVlcnkgdG9vbHNcbiAgY29uc3QgZ2V0VmFsdWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgZGF0YXNldE5hbWUsIHZhcmlhYmxlTmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcblxuICAvLyBjdXN0b21pemUgc29tZSBxdWVyeSB0b29scyBmcm9tIGxvY2FsUXVlcnkgdG9vbFxuICBmdW5jdGlvbiBRdWVyeVRvb2xDb21wb25lbnQocHJvcHM6IFF1ZXJ5RHVja0RCT3V0cHV0RGF0YSkge1xuICAgIHJldHVybiA8UXVlcnlEdWNrREJDb21wb25lbnQgey4uLnByb3BzfSBnZXRWYWx1ZXM9e2dldFZhbHVlc30gZ2V0RHVja0RCPXtnZXREdWNrREJ9IC8+O1xuICB9XG5cbiAgLy8gdGhpcyB0b29sIHdpbGwgZXhlY3V0ZSBhIGdlbmVyaWMgc2VsZWN0IFNRTCBxdWVyeSBhZ2FpbnN0IHVzZXIncyBkYXRhc2V0XG4gIGNvbnN0IGdlbmVyaWNRdWVyeTogTG9jYWxRdWVyeVRvb2wgPSB7XG4gICAgLi4ubG9jYWxRdWVyeSxcbiAgICBkZXNjcmlwdGlvbjogYGV4ZWN1dGUgYSBnZW5lcmljIHNlbGVjdCBTUUwgcXVlcnkgaW4gZHVja2RiIHRvIGFuc3dlciB1c2VyJ3MgcXVlc3Rpb24uIFBsZWFzZSBub3RlOlxuMS4gVGhpcyB0b29sIGlzIE5PVCBmb3IgZmlsdGVyaW5nIHRoZSB1c2VyIGRhdGFzZXQuXG4yLiBUaGlzIHRvb2wgZG9lcyBOT1Qgc3VwcG9ydCBnZW9tZXRyeSBjb2x1bW4gYW5kIGdlb21ldHJpYyBvcGVyYXRpb25zLlxuMy4gVGhlIHZhcmlhYmxlTmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eS4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHBpY2sgYSB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIGRhdGFzZXQuXG40LiBUaGVyZSBpcyBubyBuZWVkIHRvIGFkZCBhIHN1Yi1xdWVyeSB0byBhZGQgYW4gYXV0by1pbmNyZW1lbnQgY29sdW1uICdyb3dfaW5kZXgnIHRvIHRoZSBvcmlnaW5hbCBkYXRhc2V0LlxuYCxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5sb2NhbFF1ZXJ5LmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9LFxuICAgIGNvbXBvbmVudDogUXVlcnlUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgLy8gY3VzdG9taXplIGEgZmlsdGVyRGF0YXNldCB0b29sIGZyb20gbG9jYWxRdWVyeSB0b29sXG4gIC8vIHRoaXMgdG9vbCB3aWxsIHVzZSB0aGUgc2VsZWN0ZWQgcm93cyAocm93IGluZGV4ZXMpIHRvIGZpbHRlciB0aGUgdXNlciBkYXRhc2V0IGFuZCBzYXZlIHRoZSByZXN1bHQgYXMgYSBuZXcgZGF0YXNldC5cbiAgY29uc3QgZmlsdGVyRGF0YXNldDogTG9jYWxRdWVyeVRvb2wgPSB7XG4gICAgLi4ubG9jYWxRdWVyeSxcbiAgICBkZXNjcmlwdGlvbjogYGZpbHRlciB0aGUgdXNlciBkYXRhc2V0IGJ5IHVzaW5nIGEgc2VsZWN0IFNRTCBxdWVyeSBpbiBkdWNrZGIgYW5kIHNhdmUgdGhlIHJlc3VsdCBhcyBhIG5ldyBkYXRhc2V0LlxuUGxlYXNlIG5vdGU6XG4xLiBEbyBub3QgdXNlICogdG8gc2VsZWN0IGFsbCBjb2x1bW5zLCBpbnN0ZWFkIHVzZSBhbGwgdGhlIGNvbHVtbiBuYW1lcyBpbiBkYXRhc2V0LlxuYCxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5sb2NhbFF1ZXJ5LmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9LFxuICAgIGNvbXBvbmVudDogVGFibGVUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgLy8gY3VzdG9taXplIGEgdGFibGUgdG9vbCBmcm9tIGxvY2FsUXVlcnkgdG9vbCB0byBjcmVhdGUgYSBuZXcgdGFibGUvZGF0YXNldCBpbiBrZXBsZXIuZ2wgdXNpbmcgU1FMIHF1ZXJ5XG4gIGNvbnN0IHRhYmxlVG9vbDogTG9jYWxRdWVyeVRvb2wgPSB7XG4gICAgLi4ubG9jYWxRdWVyeSxcbiAgICBkZXNjcmlwdGlvbjogYENyZWF0ZSBhIG5ldyB0YWJsZS9kYXRhc2V0IGluIGtlcGxlci5nbCB1c2luZyBTUUwgcXVlcnkgd2hpY2ggd2lsbFxuMS4gYWRkIGEgbmV3IGNvbHVtbiB0byB0aGUgb3JpZ2luYWwgZGF0YXNldFxuMi4gZGVsZXRlIGEgY29sdW1uIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFzZXRcbjMuIHJlbmFtZSBhIGNvbHVtbiBpbiB0aGUgb3JpZ2luYWwgZGF0YXNldFxuNC4gY2hhbmdlIHRoZSBjb2x1bW4gdHlwZSBpbiB0aGUgb3JpZ2luYWwgZGF0YXNldC5cblBsZWFzZSBub3RlOlxuMS4gRG8gbm90IHVzZSAqIHRvIHNlbGVjdCBhbGwgY29sdW1ucywgaW5zdGVhZCB1c2UgYWxsIHRoZSBjb2x1bW4gbmFtZXMgaW4gZGF0YXNldC5cbjIuIExpc3QgYWxsIGNvbHVtbiBuYW1lcyB0aGUgbmV3IHRhYmxlIG9yIGRhdGFzZXQgd2lsbCBoYXZlLlxuYCxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5sb2NhbFF1ZXJ5LmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9LFxuICAgIGNvbXBvbmVudDogVGFibGVUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgLy8gY3VzdG9taXplIGEgbWVyZ2VUYWJsZXMgdG9vbCBmcm9tIGxvY2FsUXVlcnkgdG9vbCB0byBtZXJnZSB0d28gZGF0YXNldHMgaW50byBhIG5ldyBkYXRhc2V0XG4gIGNvbnN0IG1lcmdlVGFibGVzVG9vbDogTWVyZ2VUYWJsZXNUb29sID0ge1xuICAgIC4uLm1lcmdlVGFibGVzLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIGdldFZhbHVlc1xuICAgIH0sXG4gICAgb25Ub29sQ29tcGxldGVkOiAodG9vbE5hbWU6IHN0cmluZywgYWRkaXRpb25hbERhdGE6IHVua25vd24pID0+IHtcbiAgICAgIHRvb2xDYWNoZS5hZGREYXRhc2V0KHRvb2xOYW1lLCBhZGRpdGlvbmFsRGF0YSk7XG4gICAgfVxuICAgIC8vIGNvbXBvbmVudDogTWVyZ2VUYWJsZXNUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmaWx0ZXJEYXRhc2V0LFxuICAgIGdlbmVyaWNRdWVyeSxcbiAgICB0YWJsZVRvb2wsXG4gICAgbWVyZ2VUYWJsZXNUb29sXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBT0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQTZELFNBQUFNLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FBQWMseUJBQUEsQ0FBQWYsQ0FBQSxLQUFBSCxPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxHQUFBYSxPQUFBLFdBQUFkLENBQUEsSUFBQUUsTUFBQSxDQUFBZ0IsY0FBQSxDQUFBbkIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQU4sQ0FBQSxFQUFBRCxDQUFBLGlCQUFBRCxDQUFBLElBakI3RDtBQUNBO0FBa0JPLFNBQVNvQixZQUFZQSxDQUFDQyxRQUFrQixFQUFFQyxNQUFlLEVBQUU7RUFDaEUsSUFBTUMsU0FBUyxHQUFHQyxnQkFBUyxDQUFDQyxXQUFXLENBQUMsQ0FBQzs7RUFFekM7RUFDQSxJQUFNQyxTQUFTO0lBQUEsSUFBQUMsSUFBQSxPQUFBQyxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQUcsU0FBQUMsUUFBT0MsV0FBbUIsRUFBRUMsWUFBb0I7TUFBQSxJQUFBQyxNQUFBO01BQUEsT0FBQUwsWUFBQSxZQUFBTSxJQUFBLFVBQUFDLFNBQUFDLFFBQUE7UUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1lBQzFETCxNQUFNLEdBQUcsSUFBQU0sNEJBQW9CLEVBQUNuQixRQUFRLEVBQUVDLE1BQU0sRUFBRVUsV0FBVyxFQUFFQyxZQUFZLENBQUM7WUFBQSxPQUFBSSxRQUFBLENBQUFJLE1BQUEsV0FDekVQLE1BQU07VUFBQTtVQUFBO1lBQUEsT0FBQUcsUUFBQSxDQUFBSyxJQUFBO1FBQUE7TUFBQSxHQUFBWCxPQUFBO0lBQUEsQ0FDZDtJQUFBLGdCQUhLTCxTQUFTQSxDQUFBaUIsRUFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQWpCLElBQUEsQ0FBQWhCLEtBQUEsT0FBQUUsU0FBQTtJQUFBO0VBQUEsR0FHZDs7RUFFRDtFQUNBLFNBQVNnQyxrQkFBa0JBLENBQUNDLEtBQTRCLEVBQUU7SUFDeEQsb0JBQU92RCxNQUFBLFlBQUF3RCxhQUFBLENBQUNwRCxPQUFBLENBQUFxRCxvQkFBb0IsTUFBQUMsU0FBQSxpQkFBS0gsS0FBSztNQUFFcEIsU0FBUyxFQUFFQSxTQUFVO01BQUN3QixTQUFTLEVBQUVBO0lBQVUsRUFBRSxDQUFDO0VBQ3hGOztFQUVBO0VBQ0EsSUFBTUMsWUFBNEIsR0FBQXZDLGFBQUEsQ0FBQUEsYUFBQSxLQUM3QndDLGtCQUFVO0lBQ2JDLFdBQVcsbWJBS2Q7SUFDR0MsT0FBTyxFQUFBMUMsYUFBQSxDQUFBQSxhQUFBLEtBQ0Z3QyxrQkFBVSxDQUFDRSxPQUFPO01BQ3JCNUIsU0FBUyxFQUFUQTtJQUFTLEVBQ1Y7SUFDRDZCLFNBQVMsRUFBRVY7RUFBa0IsRUFDOUI7O0VBRUQ7RUFDQTtFQUNBLElBQU1XLGFBQTZCLEdBQUE1QyxhQUFBLENBQUFBLGFBQUEsS0FDOUJ3QyxrQkFBVTtJQUNiQyxXQUFXLDRNQUdkO0lBQ0dDLE9BQU8sRUFBQTFDLGFBQUEsQ0FBQUEsYUFBQSxLQUNGd0Msa0JBQVUsQ0FBQ0UsT0FBTztNQUNyQjVCLFNBQVMsRUFBVEE7SUFBUyxFQUNWO0lBQ0Q2QixTQUFTLEVBQUVFO0VBQWtCLEVBQzlCOztFQUVEO0VBQ0EsSUFBTUMsU0FBeUIsR0FBQTlDLGFBQUEsQ0FBQUEsYUFBQSxLQUMxQndDLGtCQUFVO0lBQ2JDLFdBQVcsb2FBUWQ7SUFDR0MsT0FBTyxFQUFBMUMsYUFBQSxDQUFBQSxhQUFBLEtBQ0Z3QyxrQkFBVSxDQUFDRSxPQUFPO01BQ3JCNUIsU0FBUyxFQUFUQTtJQUFTLEVBQ1Y7SUFDRDZCLFNBQVMsRUFBRUU7RUFBa0IsRUFDOUI7O0VBRUQ7RUFDQSxJQUFNRSxlQUFnQyxHQUFBL0MsYUFBQSxDQUFBQSxhQUFBLEtBQ2pDZ0QsbUJBQVc7SUFDZE4sT0FBTyxFQUFFO01BQ1A1QixTQUFTLEVBQVRBO0lBQ0YsQ0FBQztJQUNEbUMsZUFBZSxFQUFFLFNBQWpCQSxlQUFlQSxDQUFHQyxRQUFnQixFQUFFQyxjQUF1QixFQUFLO01BQzlEeEMsU0FBUyxDQUFDeUMsVUFBVSxDQUFDRixRQUFRLEVBQUVDLGNBQWMsQ0FBQztJQUNoRDtJQUNBO0VBQUEsRUFDRDtFQUVELE9BQU87SUFDTFAsYUFBYSxFQUFiQSxhQUFhO0lBQ2JMLFlBQVksRUFBWkEsWUFBWTtJQUNaTyxTQUFTLEVBQVRBLFNBQVM7SUFDVEMsZUFBZSxFQUFmQTtFQUNGLENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==