kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
335 lines (329 loc) • 44.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getGeoTools = getGeoTools;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _react = _interopRequireWildcard(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 _geoda = require("@openassistant/geoda");
var _osm = require("@openassistant/osm");
var _tables = require("@openassistant/tables");
var _utils = require("@openassistant/utils");
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/actions/src");
var _lisaTool = require("./lisa-tool");
var _utils2 = require("./utils");
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 _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return 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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function getGeoTools(aiAssistant, datasets, layers, layerData) {
// tool cache
var toolCache = _utils.ToolCache.getInstance();
// context for geo 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);
};
}();
var getGeometries = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetName) {
var geoms, dataset;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
geoms = (0, _utils2.getGeometriesFromDataset)(datasets, layers, layerData, datasetName);
if (geoms.length === 0) {
// even though the tool dataset should be saved by 'saveDataToMapTool',
// we still try to get the dataset from tool cache, e.g. route, isochrone etc.
dataset = toolCache.getDataset(datasetName); // check if dataset is a GeoJSON object
if (dataset && dataset.type === 'geojson') {
geoms = dataset.content.features;
}
}
return _context2.abrupt("return", geoms);
case 3:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function getGeometries(_x3) {
return _ref2.apply(this, arguments);
};
}();
var getMapboxToken = function getMapboxToken() {
if (aiAssistant.config.mapboxToken) {
return aiAssistant.config.mapboxToken;
}
throw new Error('Mapbox token is not provided');
};
// onToolCompleted
var onToolCompleted = function onToolCompleted(toolName, result) {
toolCache.addDataset(toolName, result);
};
// geo tools
var classifyTool = _objectSpread(_objectSpread({}, _geoda.dataClassify), {}, {
context: {
getValues: getValues
}
});
var weightsTool = _objectSpread(_objectSpread({}, _geoda.spatialWeights), {}, {
context: {
getGeometries: getGeometries
}
});
var globalMoranTool = _objectSpread(_objectSpread({}, _geoda.globalMoran), {}, {
context: {
getValues: getValues
}
});
var regressionTool = _objectSpread(_objectSpread({}, _geoda.spatialRegression), {}, {
context: {
getValues: getValues
}
});
var lisaTool = _objectSpread(_objectSpread({}, _geoda.lisa), {}, {
context: {
getValues: getValues
},
component: _lisaTool.LisaToolComponent
});
var spatialJoinTool = _objectSpread(_objectSpread({}, _geoda.spatialJoin), {}, {
context: {
getValues: getValues,
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted,
component: _tables.SpatialJoinComponent
});
var spatialFilterTool = _objectSpread(_objectSpread({}, _geoda.spatialFilter), {}, {
context: {
getValues: getValues,
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted,
component: _tables.SpatialJoinComponent
});
var routingTool = _objectSpread(_objectSpread({}, _osm.routing), {}, {
context: {
getMapboxToken: getMapboxToken
},
onToolCompleted: onToolCompleted
});
var isochroneTool = _objectSpread(_objectSpread({}, _osm.isochrone), {}, {
context: {
getMapboxToken: getMapboxToken
},
onToolCompleted: onToolCompleted
});
var bufferTool = _objectSpread(_objectSpread({}, _geoda.buffer), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var centroidTool = _objectSpread(_objectSpread({}, _geoda.centroid), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var dissolveTool = _objectSpread(_objectSpread({}, _geoda.dissolve), {}, {
context: {
getGeometries: getGeometries,
getValues: getValues
},
onToolCompleted: onToolCompleted
});
var roadsTool = _objectSpread(_objectSpread({}, _osm.roads), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var lengthTool = _objectSpread(_objectSpread({}, _geoda.length), {}, {
context: {
getGeometries: getGeometries
}
});
var areaTool = _objectSpread(_objectSpread({}, _geoda.area), {}, {
context: {
getGeometries: getGeometries
}
});
var perimeterTool = _objectSpread(_objectSpread({}, _geoda.perimeter), {}, {
context: {
getGeometries: getGeometries
}
});
var thiessenPolygonsTool = _objectSpread(_objectSpread({}, _geoda.thiessenPolygons), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var minimumSpanningTreeTool = _objectSpread(_objectSpread({}, _geoda.minimumSpanningTree), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var cartogramTool = _objectSpread(_objectSpread({}, _geoda.cartogram), {}, {
context: {
getGeometries: getGeometries,
getValues: getValues
},
onToolCompleted: onToolCompleted
});
var gridTool = _objectSpread(_objectSpread({}, _geoda.grid), {}, {
context: {
getGeometries: getGeometries
},
onToolCompleted: onToolCompleted
});
var getUsStateTool = _objectSpread(_objectSpread({}, _osm.getUsStateGeojson), {}, {
onToolCompleted: onToolCompleted
});
var getUsCountyTool = _objectSpread(_objectSpread({}, _osm.getUsCountyGeojson), {}, {
onToolCompleted: onToolCompleted
});
var getUsZipcodeTool = _objectSpread(_objectSpread({}, _osm.getUsZipcodeGeojson), {}, {
onToolCompleted: onToolCompleted
});
var standardizeVariableTool = _objectSpread(_objectSpread({}, _geoda.standardizeVariable), {}, {
context: {
getValues: getValues
},
component: CustomDataTableComponent
});
var rateTool = _objectSpread(_objectSpread({}, _geoda.rate), {}, {
context: {
getValues: getValues
},
component: CustomDataTableComponent
});
return {
classifyTool: classifyTool,
weightsTool: weightsTool,
globalMoranTool: globalMoranTool,
regressionTool: regressionTool,
lisaTool: lisaTool,
spatialJoinTool: spatialJoinTool,
spatialFilterTool: spatialFilterTool,
gridTool: gridTool,
bufferTool: bufferTool,
centroidTool: centroidTool,
dissolveTool: dissolveTool,
lengthTool: lengthTool,
areaTool: areaTool,
perimeterTool: perimeterTool,
getUsStateTool: getUsStateTool,
getUsCountyTool: getUsCountyTool,
getUsZipcodeTool: getUsZipcodeTool,
queryUSZipcodes: _osm.queryUSZipcodes,
geocoding: _osm.geocoding,
routing: routingTool,
isochrone: isochroneTool,
roads: roadsTool,
standardizeVariable: standardizeVariableTool,
thiessenPolygons: thiessenPolygonsTool,
minimumSpanningTree: minimumSpanningTreeTool,
cartogram: cartogramTool,
rate: rateTool
};
}
/**
* Customize the DataTableComponent for StandardizeVariableTool and RateTool
*/
function CustomDataTableComponent(props) {
var dispatch = (0, _lib.useDispatch)();
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 originalDatasetName = props.originalDatasetName,
datasetName = props.datasetName,
saveData = props.saveData;
// get data by datasetName
var dataset = props[datasetName];
var data = dataset === null || dataset === void 0 ? void 0 : dataset.content;
(0, _react.useEffect)(function () {
function saveStandardizedData() {
return _saveStandardizedData.apply(this, arguments);
}
function _saveStandardizedData() {
_saveStandardizedData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var dataRecord, columnNames, numberOfRows, i, row, _iterator, _step, key, processedData;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
// convert column-wise data to a row-wise Record<string, number>[]
dataRecord = [];
columnNames = Object.keys(data);
numberOfRows = data[columnNames[0]].length;
for (i = 0; i < numberOfRows; i++) {
row = {};
_iterator = _createForOfIteratorHelper(columnNames);
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
key = _step.value;
row[key] = data[key][i];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
dataRecord.push(row);
}
_context3.next = 6;
return (0, _utils2.appendColumnsToDataset)(datasets, layers, originalDatasetName, dataRecord, datasetName);
case 6:
processedData = _context3.sent;
dispatch((0, _src.addDataToMap)({
datasets: processedData,
options: {
autoCreateLayers: true,
centerMap: false
}
}));
case 8:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _saveStandardizedData.apply(this, arguments);
}
if (saveData) {
saveStandardizedData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return /*#__PURE__*/_react["default"].createElement(_tables.DataTableComponent, props);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbGliIiwiX2dlb2RhIiwiX29zbSIsIl90YWJsZXMiLCJfdXRpbHMiLCJfc3JjIiwiX2xpc2FUb29sIiwiX3V0aWxzMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImdldEdlb1Rvb2xzIiwiYWlBc3Npc3RhbnQiLCJkYXRhc2V0cyIsImxheWVycyIsImxheWVyRGF0YSIsInRvb2xDYWNoZSIsIlRvb2xDYWNoZSIsImdldEluc3RhbmNlIiwiZ2V0VmFsdWVzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZGF0YXNldE5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsImFicnVwdCIsInN0b3AiLCJfeCIsIl94MiIsImdldEdlb21ldHJpZXMiLCJfcmVmMiIsIl9jYWxsZWUyIiwiZ2VvbXMiLCJkYXRhc2V0IiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZ2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0IiwiZ2V0RGF0YXNldCIsInR5cGUiLCJjb250ZW50IiwiZmVhdHVyZXMiLCJfeDMiLCJnZXRNYXBib3hUb2tlbiIsImNvbmZpZyIsIm1hcGJveFRva2VuIiwiRXJyb3IiLCJvblRvb2xDb21wbGV0ZWQiLCJ0b29sTmFtZSIsInJlc3VsdCIsImFkZERhdGFzZXQiLCJjbGFzc2lmeVRvb2wiLCJkYXRhQ2xhc3NpZnkiLCJjb250ZXh0Iiwid2VpZ2h0c1Rvb2wiLCJzcGF0aWFsV2VpZ2h0cyIsImdsb2JhbE1vcmFuVG9vbCIsImdsb2JhbE1vcmFuIiwicmVncmVzc2lvblRvb2wiLCJzcGF0aWFsUmVncmVzc2lvbiIsImxpc2FUb29sIiwibGlzYSIsImNvbXBvbmVudCIsIkxpc2FUb29sQ29tcG9uZW50Iiwic3BhdGlhbEpvaW5Ub29sIiwic3BhdGlhbEpvaW4iLCJTcGF0aWFsSm9pbkNvbXBvbmVudCIsInNwYXRpYWxGaWx0ZXJUb29sIiwic3BhdGlhbEZpbHRlciIsInJvdXRpbmdUb29sIiwicm91dGluZyIsImlzb2Nocm9uZVRvb2wiLCJpc29jaHJvbmUiLCJidWZmZXJUb29sIiwiYnVmZmVyIiwiY2VudHJvaWRUb29sIiwiY2VudHJvaWQiLCJkaXNzb2x2ZVRvb2wiLCJkaXNzb2x2ZSIsInJvYWRzVG9vbCIsInJvYWRzIiwibGVuZ3RoVG9vbCIsImFyZWFUb29sIiwiYXJlYSIsInBlcmltZXRlclRvb2wiLCJwZXJpbWV0ZXIiLCJ0aGllc3NlblBvbHlnb25zVG9vbCIsInRoaWVzc2VuUG9seWdvbnMiLCJtaW5pbXVtU3Bhbm5pbmdUcmVlVG9vbCIsIm1pbmltdW1TcGFubmluZ1RyZWUiLCJjYXJ0b2dyYW1Ub29sIiwiY2FydG9ncmFtIiwiZ3JpZFRvb2wiLCJncmlkIiwiZ2V0VXNTdGF0ZVRvb2wiLCJnZXRVc1N0YXRlR2VvanNvbiIsImdldFVzQ291bnR5VG9vbCIsImdldFVzQ291bnR5R2VvanNvbiIsImdldFVzWmlwY29kZVRvb2wiLCJnZXRVc1ppcGNvZGVHZW9qc29uIiwic3RhbmRhcmRpemVWYXJpYWJsZVRvb2wiLCJzdGFuZGFyZGl6ZVZhcmlhYmxlIiwiQ3VzdG9tRGF0YVRhYmxlQ29tcG9uZW50IiwicmF0ZVRvb2wiLCJyYXRlIiwicXVlcnlVU1ppcGNvZGVzIiwiZ2VvY29kaW5nIiwicHJvcHMiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwidXNlU2VsZWN0b3IiLCJzdGF0ZSIsImRlbW8iLCJrZXBsZXJHbCIsIm1hcCIsInZpc1N0YXRlIiwib3JpZ2luYWxEYXRhc2V0TmFtZSIsInNhdmVEYXRhIiwiZGF0YSIsInVzZUVmZmVjdCIsInNhdmVTdGFuZGFyZGl6ZWREYXRhIiwiX3NhdmVTdGFuZGFyZGl6ZWREYXRhIiwiX2NhbGxlZTMiLCJkYXRhUmVjb3JkIiwiY29sdW1uTmFtZXMiLCJudW1iZXJPZlJvd3MiLCJyb3ciLCJfaXRlcmF0b3IiLCJfc3RlcCIsImtleSIsInByb2Nlc3NlZERhdGEiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJlcnIiLCJhcHBlbmRDb2x1bW5zVG9EYXRhc2V0Iiwic2VudCIsImFkZERhdGFUb01hcCIsIm9wdGlvbnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiY2VudGVyTWFwIiwiY3JlYXRlRWxlbWVudCIsIkRhdGFUYWJsZUNvbXBvbmVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9haS1hc3Npc3RhbnQvc3JjL3Rvb2xzL2dlby10b29scy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNoLCB1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtcbiAgZGF0YUNsYXNzaWZ5LFxuICBEYXRhQ2xhc3NpZnlUb29sLFxuICBzcGF0aWFsV2VpZ2h0cyxcbiAgU3BhdGlhbFdlaWdodHNUb29sLFxuICBnbG9iYWxNb3JhbixcbiAgR2xvYmFsTW9yYW5Ub29sLFxuICBzcGF0aWFsUmVncmVzc2lvbixcbiAgU3BhdGlhbFJlZ3Jlc3Npb25Ub29sLFxuICBsaXNhLFxuICBMaXNhVG9vbCxcbiAgc3BhdGlhbEpvaW4sXG4gIFNwYXRpYWxKb2luVG9vbCxcbiAgc3BhdGlhbEZpbHRlcixcbiAgYnVmZmVyLFxuICBCdWZmZXJUb29sLFxuICBjZW50cm9pZCxcbiAgQ2VudHJvaWRUb29sLFxuICBkaXNzb2x2ZSxcbiAgRGlzc29sdmVUb29sLFxuICBsZW5ndGgsXG4gIGFyZWEsXG4gIHBlcmltZXRlcixcbiAgZ3JpZCxcbiAgR3JpZFRvb2wsXG4gIHN0YW5kYXJkaXplVmFyaWFibGUsXG4gIFN0YW5kYXJkaXplVmFyaWFibGVUb29sLFxuICB0aGllc3NlblBvbHlnb25zLFxuICBUaGllc3NlblBvbHlnb25zVG9vbCxcbiAgbWluaW11bVNwYW5uaW5nVHJlZSxcbiAgTWluaW11bVNwYW5uaW5nVHJlZVRvb2wsXG4gIGNhcnRvZ3JhbSxcbiAgQ2FydG9ncmFtVG9vbCxcbiAgcmF0ZSxcbiAgUmF0ZVRvb2xcbn0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZ2VvZGEnO1xuaW1wb3J0IHtcbiAgZ2V0VXNTdGF0ZUdlb2pzb24sXG4gIGdldFVzQ291bnR5R2VvanNvbixcbiAgZ2V0VXNaaXBjb2RlR2VvanNvbixcbiAgcXVlcnlVU1ppcGNvZGVzLFxuICBnZW9jb2RpbmcsXG4gIHJvdXRpbmcsXG4gIGlzb2Nocm9uZSxcbiAgSXNvY2hyb25lVG9vbCxcbiAgUm91dGluZ1Rvb2wsXG4gIHJvYWRzLFxuICBHZXRVc1N0YXRlR2VvanNvblRvb2wsXG4gIEdldFVzQ291bnR5R2VvanNvblRvb2wsXG4gIEdldFVzWmlwY29kZUdlb2pzb25Ub29sXG59IGZyb20gJ0BvcGVuYXNzaXN0YW50L29zbSc7XG5pbXBvcnQge1xuICBTcGF0aWFsSm9pbkNvbXBvbmVudCxcbiAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICBEYXRhVGFibGVDb21wb25lbnRQcm9wc1xufSBmcm9tICdAb3BlbmFzc2lzdGFudC90YWJsZXMnO1xuaW1wb3J0IHtUb29sQ2FjaGV9IGZyb20gJ0BvcGVuYXNzaXN0YW50L3V0aWxzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmltcG9ydCB7TGlzYVRvb2xDb21wb25lbnR9IGZyb20gJy4vbGlzYS10b29sJztcbmltcG9ydCB7YXBwZW5kQ29sdW1uc1RvRGF0YXNldCwgZ2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0LCBnZXRWYWx1ZXNGcm9tRGF0YXNldH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge0FpQXNzaXN0YW50U3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzJztcbmltcG9ydCB7U3RhdGV9IGZyb20gJy4uL2NvbXBvbmVudHMvYWktYXNzaXN0YW50LW1hbmFnZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvVG9vbHMoXG4gIGFpQXNzaXN0YW50OiBBaUFzc2lzdGFudFN0YXRlLFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgbGF5ZXJEYXRhOiBhbnlbXVxuKSB7XG4gIC8vIHRvb2wgY2FjaGVcbiAgY29uc3QgdG9vbENhY2hlID0gVG9vbENhY2hlLmdldEluc3RhbmNlKCk7XG5cbiAgLy8gY29udGV4dCBmb3IgZ2VvIHRvb2xzXG4gIGNvbnN0IGdldFZhbHVlcyA9IGFzeW5jIChkYXRhc2V0TmFtZTogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IGdldFZhbHVlc0Zyb21EYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIGRhdGFzZXROYW1lLCB2YXJpYWJsZU5hbWUpO1xuICAgIHJldHVybiB2YWx1ZXMgYXMgbnVtYmVyW107XG4gIH07XG5cbiAgY29uc3QgZ2V0R2VvbWV0cmllcyA9IGFzeW5jIChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbGV0IGdlb21zID0gZ2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIGxheWVyRGF0YSwgZGF0YXNldE5hbWUpO1xuXG4gICAgaWYgKGdlb21zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHRvb2wgZGF0YXNldCBzaG91bGQgYmUgc2F2ZWQgYnkgJ3NhdmVEYXRhVG9NYXBUb29sJyxcbiAgICAgIC8vIHdlIHN0aWxsIHRyeSB0byBnZXQgdGhlIGRhdGFzZXQgZnJvbSB0b29sIGNhY2hlLCBlLmcuIHJvdXRlLCBpc29jaHJvbmUgZXRjLlxuICAgICAgY29uc3QgZGF0YXNldCA9IHRvb2xDYWNoZS5nZXREYXRhc2V0KGRhdGFzZXROYW1lKTtcbiAgICAgIC8vIGNoZWNrIGlmIGRhdGFzZXQgaXMgYSBHZW9KU09OIG9iamVjdFxuICAgICAgaWYgKGRhdGFzZXQgJiYgZGF0YXNldC50eXBlID09PSAnZ2VvanNvbicpIHtcbiAgICAgICAgZ2VvbXMgPSBkYXRhc2V0LmNvbnRlbnQuZmVhdHVyZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZW9tcztcbiAgfTtcblxuICBjb25zdCBnZXRNYXBib3hUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAoYWlBc3Npc3RhbnQuY29uZmlnLm1hcGJveFRva2VuKSB7XG4gICAgICByZXR1cm4gYWlBc3Npc3RhbnQuY29uZmlnLm1hcGJveFRva2VuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcGJveCB0b2tlbiBpcyBub3QgcHJvdmlkZWQnKTtcbiAgfTtcblxuICAvLyBvblRvb2xDb21wbGV0ZWRcbiAgY29uc3Qgb25Ub29sQ29tcGxldGVkID0gKHRvb2xOYW1lOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bikgPT4ge1xuICAgIHRvb2xDYWNoZS5hZGREYXRhc2V0KHRvb2xOYW1lLCByZXN1bHQpO1xuICB9O1xuXG4gIC8vIGdlbyB0b29sc1xuICBjb25zdCBjbGFzc2lmeVRvb2w6IERhdGFDbGFzc2lmeVRvb2wgPSB7XG4gICAgLi4uZGF0YUNsYXNzaWZ5LFxuICAgIGNvbnRleHQ6IHtnZXRWYWx1ZXN9XG4gIH07XG5cbiAgY29uc3Qgd2VpZ2h0c1Rvb2w6IFNwYXRpYWxXZWlnaHRzVG9vbCA9IHtcbiAgICAuLi5zcGF0aWFsV2VpZ2h0cyxcbiAgICBjb250ZXh0OiB7Z2V0R2VvbWV0cmllc31cbiAgfTtcblxuICBjb25zdCBnbG9iYWxNb3JhblRvb2w6IEdsb2JhbE1vcmFuVG9vbCA9IHtcbiAgICAuLi5nbG9iYWxNb3JhbixcbiAgICBjb250ZXh0OiB7Z2V0VmFsdWVzfVxuICB9O1xuXG4gIGNvbnN0IHJlZ3Jlc3Npb25Ub29sOiBTcGF0aWFsUmVncmVzc2lvblRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbFJlZ3Jlc3Npb24sXG4gICAgY29udGV4dDoge2dldFZhbHVlc31cbiAgfTtcblxuICBjb25zdCBsaXNhVG9vbDogTGlzYVRvb2wgPSB7XG4gICAgLi4ubGlzYSxcbiAgICBjb250ZXh0OiB7Z2V0VmFsdWVzfSxcbiAgICBjb21wb25lbnQ6IExpc2FUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgc3BhdGlhbEpvaW5Ub29sOiBTcGF0aWFsSm9pblRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbEpvaW4sXG4gICAgY29udGV4dDoge2dldFZhbHVlcywgZ2V0R2VvbWV0cmllc30sXG4gICAgb25Ub29sQ29tcGxldGVkLFxuICAgIGNvbXBvbmVudDogU3BhdGlhbEpvaW5Db21wb25lbnRcbiAgfTtcblxuICBjb25zdCBzcGF0aWFsRmlsdGVyVG9vbCA9IHtcbiAgICAuLi5zcGF0aWFsRmlsdGVyLFxuICAgIGNvbnRleHQ6IHtnZXRWYWx1ZXMsIGdldEdlb21ldHJpZXN9LFxuICAgIG9uVG9vbENvbXBsZXRlZCxcbiAgICBjb21wb25lbnQ6IFNwYXRpYWxKb2luQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgcm91dGluZ1Rvb2w6IFJvdXRpbmdUb29sID0ge1xuICAgIC4uLnJvdXRpbmcsXG4gICAgY29udGV4dDoge2dldE1hcGJveFRva2VufSxcbiAgICBvblRvb2xDb21wbGV0ZWRcbiAgfTtcblxuICBjb25zdCBpc29jaHJvbmVUb29sOiBJc29jaHJvbmVUb29sID0ge1xuICAgIC4uLmlzb2Nocm9uZSxcbiAgICBjb250ZXh0OiB7Z2V0TWFwYm94VG9rZW59LFxuICAgIG9uVG9vbENvbXBsZXRlZFxuICB9O1xuXG4gIGNvbnN0IGJ1ZmZlclRvb2w6IEJ1ZmZlclRvb2wgPSB7XG4gICAgLi4uYnVmZmVyLFxuICAgIGNvbnRleHQ6IHtnZXRHZW9tZXRyaWVzfSxcbiAgICBvblRvb2xDb21wbGV0ZWRcbiAgfTtcblxuICBjb25zdCBjZW50cm9pZFRvb2w6IENlbnRyb2lkVG9vbCA9IHtcbiAgICAuLi5jZW50cm9pZCxcbiAgICBjb250ZXh0OiB7Z2V0R2VvbWV0cmllc30sXG4gICAgb25Ub29sQ29tcGxldGVkXG4gIH07XG5cbiAgY29uc3QgZGlzc29sdmVUb29sOiBEaXNzb2x2ZVRvb2wgPSB7XG4gICAgLi4uZGlzc29sdmUsXG4gICAgY29udGV4dDoge1xuICAgICAgZ2V0R2VvbWV0cmllcyxcbiAgICAgIGdldFZhbHVlc1xuICAgIH0sXG4gICAgb25Ub29sQ29tcGxldGVkXG4gIH07XG5cbiAgY29uc3Qgcm9hZHNUb29sID0ge1xuICAgIC4uLnJvYWRzLFxuICAgIGNvbnRleHQ6IHtnZXRHZW9tZXRyaWVzfSxcbiAgICBvblRvb2xDb21wbGV0ZWRcbiAgfTtcblxuICBjb25zdCBsZW5ndGhUb29sID0ge1xuICAgIC4uLmxlbmd0aCxcbiAgICBjb250ZXh0OiB7Z2V0R2VvbWV0cmllc31cbiAgfTtcblxuICBjb25zdCBhcmVhVG9vbCA9IHtcbiAgICAuLi5hcmVhLFxuICAgIGNvbnRleHQ6IHtnZXRHZW9tZXRyaWVzfVxuICB9O1xuXG4gIGNvbnN0IHBlcmltZXRlclRvb2wgPSB7XG4gICAgLi4ucGVyaW1ldGVyLFxuICAgIGNvbnRleHQ6IHtnZXRHZW9tZXRyaWVzfVxuICB9O1xuXG4gIGNvbnN0IHRoaWVzc2VuUG9seWdvbnNUb29sOiBUaGllc3NlblBvbHlnb25zVG9vbCA9IHtcbiAgICAuLi50aGllc3NlblBvbHlnb25zLFxuICAgIGNvbnRleHQ6IHtnZXRHZW9tZXRyaWVzfSxcbiAgICBvblRvb2xDb21wbGV0ZWRcbiAgfTtcblxuICBjb25zdCBtaW5pbXVtU3Bhbm5pbmdUcmVlVG9vbDogTWluaW11bVNwYW5uaW5nVHJlZVRvb2wgPSB7XG4gICAgLi4ubWluaW11bVNwYW5uaW5nVHJlZSxcbiAgICBjb250ZXh0OiB7Z2V0R2VvbWV0cmllc30sXG4gICAgb25Ub29sQ29tcGxldGVkXG4gIH07XG5cbiAgY29uc3QgY2FydG9ncmFtVG9vbDogQ2FydG9ncmFtVG9vbCA9IHtcbiAgICAuLi5jYXJ0b2dyYW0sXG4gICAgY29udGV4dDoge2dldEdlb21ldHJpZXMsIGdldFZhbHVlc30sXG4gICAgb25Ub29sQ29tcGxldGVkXG4gIH07XG5cbiAgY29uc3QgZ3JpZFRvb2w6IEdyaWRUb29sID0ge1xuICAgIC4uLmdyaWQsXG4gICAgY29udGV4dDoge2dldEdlb21ldHJpZXN9LFxuICAgIG9uVG9vbENvbXBsZXRlZFxuICB9O1xuXG4gIGNvbnN0IGdldFVzU3RhdGVUb29sOiBHZXRVc1N0YXRlR2VvanNvblRvb2wgPSB7XG4gICAgLi4uZ2V0VXNTdGF0ZUdlb2pzb24sXG4gICAgb25Ub29sQ29tcGxldGVkXG4gIH07XG5cbiAgY29uc3QgZ2V0VXNDb3VudHlUb29sOiBHZXRVc0NvdW50eUdlb2pzb25Ub29sID0ge1xuICAgIC4uLmdldFVzQ291bnR5R2VvanNvbixcbiAgICBvblRvb2xDb21wbGV0ZWRcbiAgfTtcblxuICBjb25zdCBnZXRVc1ppcGNvZGVUb29sOiBHZXRVc1ppcGNvZGVHZW9qc29uVG9vbCA9IHtcbiAgICAuLi5nZXRVc1ppcGNvZGVHZW9qc29uLFxuICAgIG9uVG9vbENvbXBsZXRlZFxuICB9O1xuXG4gIGNvbnN0IHN0YW5kYXJkaXplVmFyaWFibGVUb29sOiBTdGFuZGFyZGl6ZVZhcmlhYmxlVG9vbCA9IHtcbiAgICAuLi5zdGFuZGFyZGl6ZVZhcmlhYmxlLFxuICAgIGNvbnRleHQ6IHtnZXRWYWx1ZXN9LFxuICAgIGNvbXBvbmVudDogQ3VzdG9tRGF0YVRhYmxlQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3QgcmF0ZVRvb2w6IFJhdGVUb29sID0ge1xuICAgIC4uLnJhdGUsXG4gICAgY29udGV4dDoge2dldFZhbHVlc30sXG4gICAgY29tcG9uZW50OiBDdXN0b21EYXRhVGFibGVDb21wb25lbnRcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNsYXNzaWZ5VG9vbCxcbiAgICB3ZWlnaHRzVG9vbCxcbiAgICBnbG9iYWxNb3JhblRvb2wsXG4gICAgcmVncmVzc2lvblRvb2wsXG4gICAgbGlzYVRvb2wsXG4gICAgc3BhdGlhbEpvaW5Ub29sLFxuICAgIHNwYXRpYWxGaWx0ZXJUb29sLFxuICAgIGdyaWRUb29sLFxuICAgIGJ1ZmZlclRvb2wsXG4gICAgY2VudHJvaWRUb29sLFxuICAgIGRpc3NvbHZlVG9vbCxcbiAgICBsZW5ndGhUb29sLFxuICAgIGFyZWFUb29sLFxuICAgIHBlcmltZXRlclRvb2wsXG4gICAgZ2V0VXNTdGF0ZVRvb2wsXG4gICAgZ2V0VXNDb3VudHlUb29sLFxuICAgIGdldFVzWmlwY29kZVRvb2wsXG4gICAgcXVlcnlVU1ppcGNvZGVzLFxuICAgIGdlb2NvZGluZyxcbiAgICByb3V0aW5nOiByb3V0aW5nVG9vbCxcbiAgICBpc29jaHJvbmU6IGlzb2Nocm9uZVRvb2wsXG4gICAgcm9hZHM6IHJvYWRzVG9vbCxcbiAgICBzdGFuZGFyZGl6ZVZhcmlhYmxlOiBzdGFuZGFyZGl6ZVZhcmlhYmxlVG9vbCxcbiAgICB0aGllc3NlblBvbHlnb25zOiB0aGllc3NlblBvbHlnb25zVG9vbCxcbiAgICBtaW5pbXVtU3Bhbm5pbmdUcmVlOiBtaW5pbXVtU3Bhbm5pbmdUcmVlVG9vbCxcbiAgICBjYXJ0b2dyYW06IGNhcnRvZ3JhbVRvb2wsXG4gICAgcmF0ZTogcmF0ZVRvb2xcbiAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b21pemUgdGhlIERhdGFUYWJsZUNvbXBvbmVudCBmb3IgU3RhbmRhcmRpemVWYXJpYWJsZVRvb2wgYW5kIFJhdGVUb29sXG4gKi9cbmZ1bmN0aW9uIEN1c3RvbURhdGFUYWJsZUNvbXBvbmVudChwcm9wczogRGF0YVRhYmxlQ29tcG9uZW50UHJvcHMpIHtcbiAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuICBjb25zdCBkYXRhc2V0cyA9IHVzZVNlbGVjdG9yKChzdGF0ZTogU3RhdGUpID0+IHN0YXRlLmRlbW8ua2VwbGVyR2wubWFwLnZpc1N0YXRlLmRhdGFzZXRzKTtcbiAgY29uc3QgbGF5ZXJzID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5rZXBsZXJHbC5tYXAudmlzU3RhdGUubGF5ZXJzKTtcbiAgY29uc3Qge29yaWdpbmFsRGF0YXNldE5hbWUsIGRhdGFzZXROYW1lLCBzYXZlRGF0YX0gPSBwcm9wcztcblxuICAvLyBnZXQgZGF0YSBieSBkYXRhc2V0TmFtZVxuICBjb25zdCBkYXRhc2V0ID0gcHJvcHNbZGF0YXNldE5hbWVdIGFzIHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgY29udGVudDogUmVjb3JkPHN0cmluZywgbnVtYmVyW10+O1xuICB9O1xuXG4gIGNvbnN0IGRhdGEgPSBkYXRhc2V0Py5jb250ZW50O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gc2F2ZVN0YW5kYXJkaXplZERhdGEoKSB7XG4gICAgICAvLyBjb252ZXJ0IGNvbHVtbi13aXNlIGRhdGEgdG8gYSByb3ctd2lzZSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+W11cbiAgICAgIGNvbnN0IGRhdGFSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5bXSA9IFtdO1xuICAgICAgY29uc3QgY29sdW1uTmFtZXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICAgIGNvbnN0IG51bWJlck9mUm93cyA9IGRhdGFbY29sdW1uTmFtZXNbMF1dLmxlbmd0aDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgICAgcm93W2tleV0gPSBkYXRhW2tleV1baV07XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVJlY29yZC5wdXNoKHJvdyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBhd2FpdCBhcHBlbmRDb2x1bW5zVG9EYXRhc2V0KFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBvcmlnaW5hbERhdGFzZXROYW1lLFxuICAgICAgICBkYXRhUmVjb3JkLFxuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgKTtcbiAgICAgIGRpc3BhdGNoKFxuICAgICAgICBhZGREYXRhVG9NYXAoe2RhdGFzZXRzOiBwcm9jZXNzZWREYXRhLCBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiBmYWxzZX19KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNhdmVEYXRhKSB7XG4gICAgICBzYXZlU3RhbmRhcmRpemVkRGF0YSgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICByZXR1cm4gPERhdGFUYWJsZUNvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQW9DQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFlQSxJQUFBSSxPQUFBLEdBQUFKLE9BQUE7QUFLQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxJQUFBLEdBQUFOLE9BQUE7QUFFQSxJQUFBTyxTQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxPQUFBLEdBQUFSLE9BQUE7QUFBK0YsU0FBQVMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFYLHdCQUFBVyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtB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
;