kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
174 lines (139 loc) • 17.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.featureToDeckGlGeoType = void 0;
exports.getGeojsonBounds = getGeojsonBounds;
exports.getGeojsonDataMaps = getGeojsonDataMaps;
exports.getGeojsonFeatureTypes = getGeojsonFeatureTypes;
exports.parseGeoJsonRawFeature = parseGeoJsonRawFeature;
exports.parseGeometryFromString = parseGeometryFromString;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _wellknown = _interopRequireDefault(require("wellknown"));
var _geojsonNormalize = _interopRequireDefault(require("@mapbox/geojson-normalize"));
var _bbox = _interopRequireDefault(require("@turf/bbox"));
var _dataUtils = require("../../utils/data-utils");
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; }
function parseGeoJsonRawFeature(rawFeature) {
if ((0, _typeof2["default"])(rawFeature) === 'object') {
// Support GeoJson feature as object
// probably need to normalize it as well
var normalized = (0, _geojsonNormalize["default"])(rawFeature);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize GeoJson
return null;
}
return normalized.features[0];
} else if (typeof rawFeature === 'string') {
return parseGeometryFromString(rawFeature);
} else if (Array.isArray(rawFeature)) {
// Support GeoJson LineString as an array of points
return {
type: 'Feature',
geometry: {
// why do we need to flip it...
coordinates: rawFeature.map(function (pts) {
return [pts[1], pts[0]];
}),
type: 'LineString'
}
};
}
return null;
}
/**
* Parse raw data to GeoJson feature
* @param allData
* @param getFeature
* @returns {{}}
*/
function getGeojsonDataMaps(allData, getFeature) {
var acceptableTypes = ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon', 'GeometryCollection'];
var dataToFeature = [];
for (var index = 0; index < allData.length; index++) {
var feature = parseGeoJsonRawFeature(getFeature(allData[index]));
if (feature && feature.geometry && acceptableTypes.includes(feature.geometry.type)) {
// store index of the data in feature properties
feature.properties = _objectSpread(_objectSpread({}, feature.properties || {}), {}, {
index: index
});
dataToFeature[index] = feature;
}
}
return dataToFeature;
}
/**
* Parse geojson from string
* @param {String} geoString
* @returns {null | Object} geojson object or null if failed
*/
function parseGeometryFromString(geoString) {
var parsedGeo; // try parse as geojson string
// {"type":"Polygon","coordinates":[[[-74.158491,40.83594]]]}
try {
parsedGeo = JSON.parse(geoString);
} catch (e) {} // keep trying to parse
// try parse as wkt
if (!parsedGeo) {
try {
parsedGeo = (0, _wellknown["default"])(geoString);
} catch (e) {
return null;
}
}
if (!parsedGeo) {
return null;
}
var normalized = (0, _geojsonNormalize["default"])(parsedGeo);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize geojson
return null;
}
return normalized.features[0];
}
function getGeojsonBounds() {
var features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
// 70 ms for 10,000 polygons
// here we only pick couple
var maxCount = 10000;
var samples = features.length > maxCount ? (0, _dataUtils.getSampleData)(features, maxCount) : features;
var nonEmpty = samples.filter(function (d) {
return d && d.geometry && d.geometry.coordinates && d.geometry.coordinates.length;
});
try {
return (0, _bbox["default"])({
type: 'FeatureCollection',
features: nonEmpty
});
} catch (e) {
return null;
}
}
var featureToDeckGlGeoType = exports.featureToDeckGlGeoType = {
Point: 'point',
MultiPoint: 'point',
LineString: 'line',
MultiLineString: 'line',
Polygon: 'polygon',
MultiPolygon: 'polygon'
};
/**
* Parse geojson from string
* @param {Array<Object>} allFeatures
* @returns {Object} mapping of feature type existence
*/
function getGeojsonFeatureTypes(allFeatures) {
var featureTypes = {};
for (var f = 0; f < allFeatures.length; f++) {
var feature = allFeatures[f];
var geoType = featureToDeckGlGeoType[feature && feature.geometry && feature.geometry.type];
if (geoType) {
featureTypes[geoType] = true;
}
}
return featureTypes;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYmFja2VuZC1nZW9qc29uLWxheWVyL2dlb2pzb24tdXRpbHMuanMiXSwibmFtZXMiOlsicGFyc2VHZW9Kc29uUmF3RmVhdHVyZSIsInJhd0ZlYXR1cmUiLCJub3JtYWxpemVkIiwiQXJyYXkiLCJpc0FycmF5IiwiZmVhdHVyZXMiLCJwYXJzZUdlb21ldHJ5RnJvbVN0cmluZyIsInR5cGUiLCJnZW9tZXRyeSIsImNvb3JkaW5hdGVzIiwibWFwIiwicHRzIiwiZ2V0R2VvanNvbkRhdGFNYXBzIiwiYWxsRGF0YSIsImdldEZlYXR1cmUiLCJhY2NlcHRhYmxlVHlwZXMiLCJkYXRhVG9GZWF0dXJlIiwiaW5kZXgiLCJsZW5ndGgiLCJmZWF0dXJlIiwiaW5jbHVkZXMiLCJwcm9wZXJ0aWVzIiwiZ2VvU3RyaW5nIiwicGFyc2VkR2VvIiwiSlNPTiIsInBhcnNlIiwiZSIsImdldEdlb2pzb25Cb3VuZHMiLCJtYXhDb3VudCIsInNhbXBsZXMiLCJub25FbXB0eSIsImZpbHRlciIsImQiLCJmZWF0dXJlVG9EZWNrR2xHZW9UeXBlIiwiUG9pbnQiLCJNdWx0aVBvaW50IiwiTGluZVN0cmluZyIsIk11bHRpTGluZVN0cmluZyIsIlBvbHlnb24iLCJNdWx0aVBvbHlnb24iLCJnZXRHZW9qc29uRmVhdHVyZVR5cGVzIiwiYWxsRmVhdHVyZXMiLCJmZWF0dXJlVHlwZXMiLCJmIiwiZ2VvVHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7QUFFTyxTQUFTQSxzQkFBVCxDQUFnQ0MsVUFBaEMsRUFBNEM7QUFDakQsTUFBSSx5QkFBT0EsVUFBUCxNQUFzQixRQUExQixFQUFvQztBQUNsQztBQUNBO0FBQ0EsUUFBTUMsVUFBVSxHQUFHLGtDQUFVRCxVQUFWLENBQW5COztBQUNBLFFBQUksQ0FBQ0MsVUFBRCxJQUFlLENBQUNDLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixVQUFVLENB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Q0FBRCxDQUEzQjtBQUNBLFFBQU1DLE9BQU8sR0FDWFgsc0JBQXNCLENBQ3BCZCxPQUFPLElBQUlBLE9BQU8sQ0FBQ1gsUUFBbkIsSUFBK0JXLE9BQU8sQ0FBQ1gsUUFBUixDQUFpQkQsSUFENUIsQ0FEeEI7O0FBSUEsUUFBSXFDLE9BQUosRUFBYTtBQUNYRixNQUFBQSxZQUFZLENBQUNFLE9BQUQsQ0FBWixHQUF3QixJQUF4QjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0YsWUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHdrdFBhcnNlciBmcm9tICd3ZWxsa25vd24nO1xuaW1wb3J0IG5vcm1hbGl6ZSBmcm9tICdAbWFwYm94L2dlb2pzb24tbm9ybWFsaXplJztcbmltcG9ydCBiYm94IGZyb20gJ0B0dXJmL2Jib3gnO1xuXG5pbXBvcnQge2dldFNhbXBsZURhdGF9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHZW9Kc29uUmF3RmVhdHVyZShyYXdGZWF0dXJlKSB7XG4gIGlmICh0eXBlb2YgcmF3RmVhdHVyZSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBTdXBwb3J0IEdlb0pzb24gZmVhdHVyZSBhcyBvYmplY3RcbiAgICAvLyBwcm9iYWJseSBuZWVkIHRvIG5vcm1hbGl6ZSBpdCBhcyB3ZWxsXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZShyYXdGZWF0dXJlKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQgfHwgIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZC5mZWF0dXJlcykpIHtcbiAgICAgIC8vIGZhaWwgdG8gbm9ybWFsaXplIEdlb0pzb25cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkLmZlYXR1cmVzWzBdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByYXdGZWF0dXJlID09PSAnc3RyaW5nJykge1xuXG4gICAgcmV0dXJuIHBhcnNlR2VvbWV0cnlGcm9tU3RyaW5nKHJhd0ZlYXR1cmUpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmF3RmVhdHVyZSkpIHtcbiAgICAvLyBTdXBwb3J0IEdlb0pzb24gIExpbmVTdHJpbmcgYXMgYW4gYXJyYXkgb2YgcG9pbnRzXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIC8vIHdoeSBkbyB3ZSBuZWVkIHRvIGZsaXAgaXQuLi5cbiAgICAgICAgY29vcmRpbmF0ZXM6IHJhd0ZlYXR1cmUubWFwKHB0cyA9PiBbcHRzWzFdLCBwdHNbMF1dKSxcbiAgICAgICAgdHlwZTogJ0xpbmVTdHJpbmcnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBQYXJzZSByYXcgZGF0YSB0byBHZW9Kc29uIGZlYXR1cmVcbiAqIEBwYXJhbSBhbGxEYXRhXG4gKiBAcGFyYW0gZ2V0RmVhdHVyZVxuICogQHJldHVybnMge3t9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkRhdGFNYXBzKGFsbERhdGEsIGdldEZlYXR1cmUpIHtcblxuICBjb25zdCBhY2NlcHRhYmxlVHlwZXMgPSBbXG4gICAgJ1BvaW50JyxcbiAgICAnTXVsdGlQb2ludCcsXG4gICAgJ0xpbmVTdHJpbmcnLFxuICAgICdNdWx0aUxpbmVTdHJpbmcnLFxuICAgICdQb2x5Z29uJyxcbiAgICAnTXVsdGlQb2x5Z29uJyxcbiAgICAnR2VvbWV0cnlDb2xsZWN0aW9uJ1xuICBdO1xuXG4gIGNvbnN0IGRhdGFUb0ZlYXR1cmUgPSBbXTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWxsRGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gcGFyc2VHZW9Kc29uUmF3RmVhdHVyZShnZXRGZWF0dXJlKGFsbERhdGFbaW5kZXhdKSk7XG5cbiAgICBpZiAoXG4gICAgICBmZWF0dXJlICYmXG4gICAgICBmZWF0dXJlLmdlb21ldHJ5ICYmXG4gICAgICBhY2NlcHRhYmxlVHlwZXMuaW5jbHVkZXMoZmVhdHVyZS5nZW9tZXRyeS50eXBlKVxuICAgICkge1xuICAgICAgLy8gc3RvcmUgaW5kZXggb2YgdGhlIGRhdGEgaW4gZmVhdHVyZSBwcm9wZXJ0aWVzXG4gICAgICBmZWF0dXJlLnByb3BlcnRpZXMgPSB7XG4gICAgICAgIC4uLihmZWF0dXJlLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgICBpbmRleFxuICAgICAgfTtcblxuICAgICAgZGF0YVRvRmVhdHVyZVtpbmRleF0gPSBmZWF0dXJlO1xuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIGRhdGFUb0ZlYXR1cmU7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VvanNvbiBmcm9tIHN0cmluZ1xuICogQHBhcmFtIHtTdHJpbmd9IGdlb1N0cmluZ1xuICogQHJldHVybnMge251bGwgfCBPYmplY3R9IGdlb2pzb24gb2JqZWN0IG9yIG51bGwgaWYgZmFpbGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdlb21ldHJ5RnJvbVN0cmluZyhnZW9TdHJpbmcpIHtcbiAgbGV0IHBhcnNlZEdlbztcblxuICAvLyB0cnkgcGFyc2UgYXMgZ2VvanNvbiBzdHJpbmdcbiAgLy8ge1widHlwZVwiOlwiUG9seWdvblwiLFwiY29vcmRpbmF0ZXNcIjpbW1stNzQuMTU4NDkxLDQwLjgzNTk0XV1dfVxuICB0cnkge1xuICAgIHBhcnNlZEdlbyA9IEpTT04ucGFyc2UoZ2VvU3RyaW5nKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHBhcnNlXG4gIH1cblxuICAvLyB0cnkgcGFyc2UgYXMgd2t0XG4gIGlmICghcGFyc2VkR2VvKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZEdlbyA9IHdrdFBhcnNlcihnZW9TdHJpbmcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcGFyc2VkR2VvKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHBhcnNlZEdlbyk7XG5cbiAgaWYgKCFub3JtYWxpemVkIHx8ICFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQuZmVhdHVyZXMpKSB7XG4gICAgLy8gZmFpbCB0byBub3JtYWxpemUgZ2VvanNvblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQuZmVhdHVyZXNbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW9qc29uQm91bmRzKGZlYXR1cmVzID0gW10pIHtcbiAgLy8gNzAgbXMgZm9yIDEwLDAwMCBwb2x5Z29uc1xuICAvLyBoZXJlIHdlIG9ubHkgcGljayBjb3VwbGVcbiAgY29uc3QgbWF4Q291bnQgPSAxMDAwMDtcbiAgY29uc3Qgc2FtcGxlcyA9XG4gICAgZmVhdHVyZXMubGVuZ3RoID4gbWF4Q291bnQgPyBnZXRTYW1wbGVEYXRhKGZlYXR1cmVzLCBtYXhDb3VudCkgOiBmZWF0dXJlcztcblxuICBjb25zdCBub25FbXB0eSA9IHNhbXBsZXMuZmlsdGVyKFxuICAgIGQgPT5cbiAgICAgIGQgJiYgZC5nZW9tZXRyeSAmJiBkLmdlb21ldHJ5LmNvb3JkaW5hdGVzICYmIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoXG4gICk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYmJveCh7XG4gICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgZmVhdHVyZXM6IG5vbkVtcHR5XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZmVhdHVyZVRvRGVja0dsR2VvVHlwZSA9IHtcbiAgUG9pbnQ6ICdwb2ludCcsXG4gIE11bHRpUG9pbnQ6ICdwb2ludCcsXG4gIExpbmVTdHJpbmc6ICdsaW5lJyxcbiAgTXVsdGlMaW5lU3RyaW5nOiAnbGluZScsXG4gIFBvbHlnb246ICdwb2x5Z29uJyxcbiAgTXVsdGlQb2x5Z29uOiAncG9seWdvbidcbn07XG5cbi8qKlxuICogUGFyc2UgZ2VvanNvbiBmcm9tIHN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBhbGxGZWF0dXJlc1xuICogQHJldHVybnMge09iamVjdH0gbWFwcGluZyBvZiBmZWF0dXJlIHR5cGUgZXhpc3RlbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW9qc29uRmVhdHVyZVR5cGVzKGFsbEZlYXR1cmVzKSB7XG4gIGNvbnN0IGZlYXR1cmVUeXBlcyA9IHt9O1xuICBmb3IgKGxldCBmID0gMDsgZiA8IGFsbEZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgY29uc3QgZmVhdHVyZSA9IGFsbEZlYXR1cmVzW2ZdO1xuICAgIGNvbnN0IGdlb1R5cGUgPVxuICAgICAgZmVhdHVyZVRvRGVja0dsR2VvVHlwZVtcbiAgICAgICAgZmVhdHVyZSAmJiBmZWF0dXJlLmdlb21ldHJ5ICYmIGZlYXR1cmUuZ2VvbWV0cnkudHlwZVxuICAgICAgXTtcbiAgICBpZiAoZ2VvVHlwZSkge1xuICAgICAgZmVhdHVyZVR5cGVzW2dlb1R5cGVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZVR5cGVzO1xufVxuIl19