kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
237 lines (234 loc) • 31 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("react"));
var _reactRedux = require("react-redux");
var _geoda = require("@openassistant/geoda");
var _osm = require("@openassistant/osm");
var _processors = require("@kepler.gl/processors");
var _actions = require("@kepler.gl/actions");
var _lisaTool = require("./lisa-tool");
var _utils = 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 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) {
// 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, _utils.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, geojson;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
geoms = (0, _utils.getGeometriesFromDataset)(datasets, layers, layerData, datasetName);
if (geoms.length === 0) {
// get the geoms from the cache
geojson = (0, _osm.getCachedData)(datasetName);
if (geojson && 'features' in geojson) {
geoms = geojson.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');
};
// geo tools
var classifyTool = _objectSpread(_objectSpread({}, _geoda.dataClassify), {}, {
context: _objectSpread(_objectSpread({}, _geoda.dataClassify.context), {}, {
getValues: getValues
})
});
var weightsTool = _objectSpread(_objectSpread({}, _geoda.spatialWeights), {}, {
context: _objectSpread(_objectSpread({}, _geoda.spatialWeights.context), {}, {
getGeometries: getGeometries
})
});
var globalMoranTool = _objectSpread(_objectSpread({}, _geoda.globalMoran), {}, {
context: _objectSpread(_objectSpread({}, _geoda.globalMoran.context), {}, {
getValues: getValues
})
});
var regressionTool = _objectSpread(_objectSpread({}, _geoda.spatialRegression), {}, {
context: _objectSpread(_objectSpread({}, _geoda.spatialRegression.context), {}, {
getValues: getValues
})
});
var lisaTool = _objectSpread(_objectSpread({}, _geoda.lisa), {}, {
context: _objectSpread(_objectSpread({}, _geoda.lisa.context), {}, {
getValues: getValues
}),
component: _lisaTool.LisaToolComponent
});
var spatialJoinTool = _objectSpread(_objectSpread({}, _geoda.spatialJoin), {}, {
context: _objectSpread(_objectSpread({}, _geoda.spatialJoin.context), {}, {
getValues: getValues,
getGeometries: getGeometries
}),
component: CustomSpatialJoinToolComponent
});
var spatialFilterTool = _objectSpread(_objectSpread({}, _geoda.spatialFilter), {}, {
context: _objectSpread(_objectSpread({}, _geoda.spatialFilter.context), {}, {
getValues: getValues,
getGeometries: getGeometries
}),
component: CustomSpatialJoinToolComponent
});
var routingTool = _objectSpread(_objectSpread({}, _osm.routing), {}, {
context: _objectSpread(_objectSpread({}, _osm.routing.context), {}, {
getMapboxToken: getMapboxToken
})
});
var isochroneTool = _objectSpread(_objectSpread({}, _osm.isochrone), {}, {
context: _objectSpread(_objectSpread({}, _osm.isochrone.context), {}, {
getMapboxToken: getMapboxToken
})
});
var bufferTool = _objectSpread(_objectSpread({}, _geoda.buffer), {}, {
context: _objectSpread(_objectSpread({}, _geoda.buffer.context), {}, {
getGeometries: getGeometries
})
});
var centroidTool = _objectSpread(_objectSpread({}, _geoda.centroid), {}, {
context: _objectSpread(_objectSpread({}, _geoda.centroid.context), {}, {
getGeometries: getGeometries
})
});
var dissolveTool = _objectSpread(_objectSpread({}, _geoda.dissolve), {}, {
context: _objectSpread(_objectSpread({}, _geoda.dissolve.context), {}, {
getGeometries: getGeometries
})
});
var lengthTool = _objectSpread(_objectSpread({}, _geoda.length), {}, {
context: _objectSpread(_objectSpread({}, _geoda.length.context), {}, {
getGeometries: getGeometries
})
});
var areaTool = _objectSpread(_objectSpread({}, _geoda.area), {}, {
context: _objectSpread(_objectSpread({}, _geoda.area.context), {}, {
getGeometries: getGeometries
})
});
var perimeterTool = _objectSpread(_objectSpread({}, _geoda.perimeter), {}, {
context: _objectSpread(_objectSpread({}, _geoda.perimeter.context), {}, {
getGeometries: getGeometries
})
});
var roadsTool = _objectSpread(_objectSpread({}, _osm.roads), {}, {
context: _objectSpread(_objectSpread({}, _osm.roads.context), {}, {
getGeometries: getGeometries
})
});
return {
classifyTool: classifyTool,
weightsTool: weightsTool,
globalMoranTool: globalMoranTool,
regressionTool: regressionTool,
lisaTool: lisaTool,
spatialJoinTool: spatialJoinTool,
spatialFilterTool: spatialFilterTool,
bufferTool: bufferTool,
centroidTool: centroidTool,
dissolveTool: dissolveTool,
lengthTool: lengthTool,
areaTool: areaTool,
perimeterTool: perimeterTool,
getUsStateGeojson: _osm.getUsStateGeojson,
getUsCountyGeojson: _osm.getUsCountyGeojson,
getUsZipcodeGeojson: _osm.getUsZipcodeGeojson,
queryUSZipcodes: _osm.queryUSZipcodes,
geocoding: _osm.geocoding,
routing: routingTool,
isochrone: isochroneTool,
roads: roadsTool
};
}
/**
* Use SpatialJoinToolComponent to add the join result to kepler.gl
*/
function CustomSpatialJoinToolComponent(props) {
var dispatch = (0, _reactRedux.useDispatch)();
(0, _react.useEffect)(function () {
function addJoinedDatasetToMap() {
return _addJoinedDatasetToMap.apply(this, arguments);
}
function _addJoinedDatasetToMap() {
_addJoinedDatasetToMap = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var parsedData;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
if (!(props.joinedDatasetId && props.joinedDataset)) {
_context3.next = 5;
break;
}
_context3.next = 3;
return (0, _processors.processFileData)({
content: {
data: props.joinedDataset,
fileName: props.joinedDatasetId
},
fileCache: []
});
case 3:
parsedData = _context3.sent;
dispatch((0, _actions.addDataToMap)({
datasets: parsedData,
options: {
autoCreateLayers: true,
centerMap: false
}
}));
case 5:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _addJoinedDatasetToMap.apply(this, arguments);
}
addJoinedDatasetToMap();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return /*#__PURE__*/_react["default"].createElement(_geoda.SpatialJoinToolComponent, props);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9nZW9kYSIsIl9vc20iLCJfcHJvY2Vzc29ycyIsIl9hY3Rpb25zIiwiX2xpc2FUb29sIiwiX3V0aWxzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZ2V0R2VvVG9vbHMiLCJhaUFzc2lzdGFudCIsImRhdGFzZXRzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwiZ2V0VmFsdWVzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZGF0YXNldE5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0VmFsdWVzRnJvbURhdGFzZXQiLCJhYnJ1cHQiLCJzdG9wIiwiX3giLCJfeDIiLCJnZXRHZW9tZXRyaWVzIiwiX3JlZjIiLCJfY2FsbGVlMiIsImdlb21zIiwiZ2VvanNvbiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImdldEdlb21ldHJpZXNGcm9tRGF0YXNldCIsImdldENhY2hlZERhdGEiLCJmZWF0dXJlcyIsIl94MyIsImdldE1hcGJveFRva2VuIiwiY29uZmlnIiwibWFwYm94VG9rZW4iLCJFcnJvciIsImNsYXNzaWZ5VG9vbCIsImRhdGFDbGFzc2lmeSIsImNvbnRleHQiLCJ3ZWlnaHRzVG9vbCIsInNwYXRpYWxXZWlnaHRzIiwiZ2xvYmFsTW9yYW5Ub29sIiwiZ2xvYmFsTW9yYW4iLCJyZWdyZXNzaW9uVG9vbCIsInNwYXRpYWxSZWdyZXNzaW9uIiwibGlzYVRvb2wiLCJsaXNhIiwiY29tcG9uZW50IiwiTGlzYVRvb2xDb21wb25lbnQiLCJzcGF0aWFsSm9pblRvb2wiLCJzcGF0aWFsSm9pbiIsIkN1c3RvbVNwYXRpYWxKb2luVG9vbENvbXBvbmVudCIsInNwYXRpYWxGaWx0ZXJUb29sIiwic3BhdGlhbEZpbHRlciIsInJvdXRpbmdUb29sIiwicm91dGluZyIsImlzb2Nocm9uZVRvb2wiLCJpc29jaHJvbmUiLCJidWZmZXJUb29sIiwiYnVmZmVyIiwiY2VudHJvaWRUb29sIiwiY2VudHJvaWQiLCJkaXNzb2x2ZVRvb2wiLCJkaXNzb2x2ZSIsImxlbmd0aFRvb2wiLCJhcmVhVG9vbCIsImFyZWEiLCJwZXJpbWV0ZXJUb29sIiwicGVyaW1ldGVyIiwicm9hZHNUb29sIiwicm9hZHMiLCJnZXRVc1N0YXRlR2VvanNvbiIsImdldFVzQ291bnR5R2VvanNvbiIsImdldFVzWmlwY29kZUdlb2pzb24iLCJxdWVyeVVTWmlwY29kZXMiLCJnZW9jb2RpbmciLCJwcm9wcyIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJ1c2VFZmZlY3QiLCJhZGRKb2luZWREYXRhc2V0VG9NYXAiLCJfYWRkSm9pbmVkRGF0YXNldFRvTWFwIiwiX2NhbGxlZTMiLCJwYXJzZWREYXRhIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiam9pbmVkRGF0YXNldElkIiwiam9pbmVkRGF0YXNldCIsInByb2Nlc3NGaWxlRGF0YSIsImNvbnRlbnQiLCJkYXRhIiwiZmlsZU5hbWUiLCJmaWxlQ2FjaGUiLCJzZW50IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJjcmVhdGVFbGVtZW50IiwiU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dlby10b29scy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNofSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge1xuICBkYXRhQ2xhc3NpZnksXG4gIERhdGFDbGFzc2lmeVRvb2wsXG4gIHNwYXRpYWxXZWlnaHRzLFxuICBTcGF0aWFsV2VpZ2h0c1Rvb2wsXG4gIGdsb2JhbE1vcmFuLFxuICBHbG9iYWxNb3JhblRvb2wsXG4gIHNwYXRpYWxSZWdyZXNzaW9uLFxuICBTcGF0aWFsUmVncmVzc2lvblRvb2wsXG4gIGxpc2EsXG4gIExpc2FUb29sLFxuICBzcGF0aWFsSm9pbixcbiAgU3BhdGlhbEpvaW5Ub29sLFxuICBzcGF0aWFsRmlsdGVyLFxuICBTcGF0aWFsSm9pblRvb2xDb21wb25lbnQsXG4gIGJ1ZmZlcixcbiAgY2VudHJvaWQsXG4gIGRpc3NvbHZlLFxuICBsZW5ndGgsXG4gIGFyZWEsXG4gIHBlcmltZXRlcixcbiAgQnVmZmVyVG9vbCxcbiAgQ2VudHJvaWRUb29sLFxuICBEaXNzb2x2ZVRvb2xcbn0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZ2VvZGEnO1xuaW1wb3J0IHtcbiAgZ2V0VXNTdGF0ZUdlb2pzb24sXG4gIGdldFVzQ291bnR5R2VvanNvbixcbiAgZ2V0VXNaaXBjb2RlR2VvanNvbixcbiAgcXVlcnlVU1ppcGNvZGVzLFxuICBnZW9jb2RpbmcsXG4gIHJvdXRpbmcsXG4gIGlzb2Nocm9uZSxcbiAgZ2V0Q2FjaGVkRGF0YSxcbiAgSXNvY2hyb25lVG9vbCxcbiAgUm91dGluZ1Rvb2wsXG4gIHJvYWRzXG59IGZyb20gJ0BvcGVuYXNzaXN0YW50L29zbSc7XG5pbXBvcnQge0RhdGFzZXRzfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7cHJvY2Vzc0ZpbGVEYXRhfSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmltcG9ydCB7TGlzYVRvb2xDb21wb25lbnR9IGZyb20gJy4vbGlzYS10b29sJztcbmltcG9ydCB7Z2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0LCBnZXRWYWx1ZXNGcm9tRGF0YXNldH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge0FpQXNzaXN0YW50U3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb1Rvb2xzKFxuICBhaUFzc2lzdGFudDogQWlBc3Npc3RhbnRTdGF0ZSxcbiAgZGF0YXNldHM6IERhdGFzZXRzLFxuICBsYXllcnM6IExheWVyW10sXG4gIGxheWVyRGF0YTogYW55W11cbikge1xuICAvLyBjb250ZXh0IGZvciBnZW8gdG9vbHNcbiAgY29uc3QgZ2V0VmFsdWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgZGF0YXNldE5hbWUsIHZhcmlhYmxlTmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlcyBhcyBudW1iZXJbXTtcbiAgfTtcblxuICBjb25zdCBnZXRHZW9tZXRyaWVzID0gYXN5bmMgKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgZ2VvbXMgPSBnZXRHZW9tZXRyaWVzRnJvbURhdGFzZXQoZGF0YXNldHMsIGxheWVycywgbGF5ZXJEYXRhLCBkYXRhc2V0TmFtZSk7XG4gICAgaWYgKGdlb21zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gZ2V0IHRoZSBnZW9tcyBmcm9tIHRoZSBjYWNoZVxuICAgICAgY29uc3QgZ2VvanNvbiA9IGdldENhY2hlZERhdGEoZGF0YXNldE5hbWUpO1xuICAgICAgaWYgKGdlb2pzb24gJiYgJ2ZlYXR1cmVzJyBpbiBnZW9qc29uKSB7XG4gICAgICAgIGdlb21zID0gZ2VvanNvbi5mZWF0dXJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb21zO1xuICB9O1xuXG4gIGNvbnN0IGdldE1hcGJveFRva2VuID0gKCkgPT4ge1xuICAgIGlmIChhaUFzc2lzdGFudC5jb25maWcubWFwYm94VG9rZW4pIHtcbiAgICAgIHJldHVybiBhaUFzc2lzdGFudC5jb25maWcubWFwYm94VG9rZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTWFwYm94IHRva2VuIGlzIG5vdCBwcm92aWRlZCcpO1xuICB9O1xuXG4gIC8vIGdlbyB0b29sc1xuICBjb25zdCBjbGFzc2lmeVRvb2w6IERhdGFDbGFzc2lmeVRvb2wgPSB7XG4gICAgLi4uZGF0YUNsYXNzaWZ5LFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmRhdGFDbGFzc2lmeS5jb250ZXh0LFxuICAgICAgZ2V0VmFsdWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHdlaWdodHNUb29sOiBTcGF0aWFsV2VpZ2h0c1Rvb2wgPSB7XG4gICAgLi4uc3BhdGlhbFdlaWdodHMsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uc3BhdGlhbFdlaWdodHMuY29udGV4dCxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2xvYmFsTW9yYW5Ub29sOiBHbG9iYWxNb3JhblRvb2wgPSB7XG4gICAgLi4uZ2xvYmFsTW9yYW4sXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uZ2xvYmFsTW9yYW4uY29udGV4dCxcbiAgICAgIGdldFZhbHVlc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZWdyZXNzaW9uVG9vbDogU3BhdGlhbFJlZ3Jlc3Npb25Ub29sID0ge1xuICAgIC4uLnNwYXRpYWxSZWdyZXNzaW9uLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLnNwYXRpYWxSZWdyZXNzaW9uLmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbGlzYVRvb2w6IExpc2FUb29sID0ge1xuICAgIC4uLmxpc2EsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4ubGlzYS5jb250ZXh0LFxuICAgICAgZ2V0VmFsdWVzXG4gICAgfSxcbiAgICBjb21wb25lbnQ6IExpc2FUb29sQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgc3BhdGlhbEpvaW5Ub29sOiBTcGF0aWFsSm9pblRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbEpvaW4sXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uc3BhdGlhbEpvaW4uY29udGV4dCxcbiAgICAgIGdldFZhbHVlcyxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9LFxuICAgIGNvbXBvbmVudDogQ3VzdG9tU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50XG4gIH07XG5cbiAgY29uc3Qgc3BhdGlhbEZpbHRlclRvb2wgPSB7XG4gICAgLi4uc3BhdGlhbEZpbHRlcixcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5zcGF0aWFsRmlsdGVyLmNvbnRleHQsXG4gICAgICBnZXRWYWx1ZXMsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfSxcbiAgICBjb21wb25lbnQ6IEN1c3RvbVNwYXRpYWxKb2luVG9vbENvbXBvbmVudFxuICB9O1xuXG4gIGNvbnN0IHJvdXRpbmdUb29sOiBSb3V0aW5nVG9vbCA9IHtcbiAgICAuLi5yb3V0aW5nLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLnJvdXRpbmcuY29udGV4dCxcbiAgICAgIGdldE1hcGJveFRva2VuXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGlzb2Nocm9uZVRvb2w6IElzb2Nocm9uZVRvb2wgPSB7XG4gICAgLi4uaXNvY2hyb25lLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmlzb2Nocm9uZS5jb250ZXh0LFxuICAgICAgZ2V0TWFwYm94VG9rZW5cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYnVmZmVyVG9vbDogQnVmZmVyVG9vbCA9IHtcbiAgICAuLi5idWZmZXIsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4uYnVmZmVyLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNlbnRyb2lkVG9vbDogQ2VudHJvaWRUb29sID0ge1xuICAgIC4uLmNlbnRyb2lkLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmNlbnRyb2lkLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3NvbHZlVG9vbDogRGlzc29sdmVUb29sID0ge1xuICAgIC4uLmRpc3NvbHZlLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmRpc3NvbHZlLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxlbmd0aFRvb2wgPSB7XG4gICAgLi4ubGVuZ3RoLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmxlbmd0aC5jb250ZXh0LFxuICAgICAgZ2V0R2VvbWV0cmllc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhcmVhVG9vbCA9IHtcbiAgICAuLi5hcmVhLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLmFyZWEuY29udGV4dCxcbiAgICAgIGdldEdlb21ldHJpZXNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcGVyaW1ldGVyVG9vbCA9IHtcbiAgICAuLi5wZXJpbWV0ZXIsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4ucGVyaW1ldGVyLmNvbnRleHQsXG4gICAgICBnZXRHZW9tZXRyaWVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJvYWRzVG9vbCA9IHtcbiAgICAuLi5yb2FkcyxcbiAgICBjb250ZXh0OiB7XG4gICAgICAuLi5yb2Fkcy5jb250ZXh0LFxuICAgICAgZ2V0R2VvbWV0cmllc1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNsYXNzaWZ5VG9vbCxcbiAgICB3ZWlnaHRzVG9vbCxcbiAgICBnbG9iYWxNb3JhblRvb2wsXG4gICAgcmVncmVzc2lvblRvb2wsXG4gICAgbGlzYVRvb2wsXG4gICAgc3BhdGlhbEpvaW5Ub29sLFxuICAgIHNwYXRpYWxGaWx0ZXJUb29sLFxuICAgIGJ1ZmZlclRvb2wsXG4gICAgY2VudHJvaWRUb29sLFxuICAgIGRpc3NvbHZlVG9vbCxcbiAgICBsZW5ndGhUb29sLFxuICAgIGFyZWFUb29sLFxuICAgIHBlcmltZXRlclRvb2wsXG4gICAgZ2V0VXNTdGF0ZUdlb2pzb24sXG4gICAgZ2V0VXNDb3VudHlHZW9qc29uLFxuICAgIGdldFVzWmlwY29kZUdlb2pzb24sXG4gICAgcXVlcnlVU1ppcGNvZGVzLFxuICAgIGdlb2NvZGluZyxcbiAgICByb3V0aW5nOiByb3V0aW5nVG9vbCxcbiAgICBpc29jaHJvbmU6IGlzb2Nocm9uZVRvb2wsXG4gICAgcm9hZHM6IHJvYWRzVG9vbFxuICB9O1xufVxuXG4vKipcbiAqIFVzZSBTcGF0aWFsSm9pblRvb2xDb21wb25lbnQgdG8gYWRkIHRoZSBqb2luIHJlc3VsdCB0byBrZXBsZXIuZ2xcbiAqL1xuZnVuY3Rpb24gQ3VzdG9tU3BhdGlhbEpvaW5Ub29sQ29tcG9uZW50KHByb3BzKSB7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGFkZEpvaW5lZERhdGFzZXRUb01hcCgpIHtcbiAgICAgIGlmIChwcm9wcy5qb2luZWREYXRhc2V0SWQgJiYgcHJvcHMuam9pbmVkRGF0YXNldCkge1xuICAgICAgICAvLyBhZGQgdGhlIGpvaW5lZCBkYXRhc2V0IHRvIGtlcGxlci5nbFxuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBkYXRhOiBwcm9wcy5qb2luZWREYXRhc2V0LFxuICAgICAgICAgICAgZmlsZU5hbWU6IHByb3BzLmpvaW5lZERhdGFzZXRJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsZUNhY2hlOiBbXVxuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe2RhdGFzZXRzOiBwYXJzZWREYXRhLCBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiBmYWxzZX19KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRKb2luZWREYXRhc2V0VG9NYXAoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICByZXR1cm4gPFNwYXRpYWxKb2luVG9vbENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQXlCQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFlQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxTQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFBdUUsU0FBQVEseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQs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
;