kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
138 lines (131 loc) • 18.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.coordHasLength4 = coordHasLength4;
exports.getAnimationDomainFromTimestamps = getAnimationDomainFromTimestamps;
exports.isTripGeoJsonField = isTripGeoJsonField;
exports.parseTripGeoJsonTimestamp = parseTripGeoJsonTimestamp;
var _geojsonUtils = require("../geojson-layer/geojson-utils");
var _utils = require("@kepler.gl/utils");
var _commonUtils = require("@kepler.gl/common-utils");
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Parse geojson from string
* @param {array} samples feature object values
* @returns whether the geometry coordinates has length of 4
*/
function coordHasLength4(samples) {
var hasLength4 = true;
for (var i = 0; i < samples.length; i += 1) {
var _samples$i;
hasLength4 = Array.isArray((_samples$i = samples[i]) === null || _samples$i === void 0 || (_samples$i = _samples$i.geometry) === null || _samples$i === void 0 ? void 0 : _samples$i.coordinates) && !samples[i].geometry.coordinates.find(function (c) {
return c.length < 4;
});
if (!hasLength4) {
break;
}
}
return hasLength4;
}
/**
* Check if geojson features are trip layer animatable by meeting 3 conditions
* @param dataContainer geojson feature objects container
* @param {object} field array of geojson feature objects
* @returns whether it is trip layer animatable
*/
function isTripGeoJsonField(dataContainer, field) {
if (dataContainer.numRows() < 1) {
return false;
}
var maxCount = 10000;
var sampleRawFeatures = dataContainer.numRows() > maxCount ? (0, _utils.getSampleContainerData)(dataContainer, maxCount) : dataContainer;
var features = sampleRawFeatures.mapIndex(field.valueAccessor).map(_geojsonUtils.parseGeoJsonRawFeature).filter(_commonUtils.notNullorUndefined);
var featureTypes = (0, _geojsonUtils.getGeojsonFeatureTypes)(features);
// condition 1: contain line string
if (!featureTypes.line) {
return false;
}
// condition 2:sample line strings contain 4 coordinates
if (!coordHasLength4(features)) {
return false;
}
var geom = features[0].geometry;
if (!geom || geom.type === 'GeometryCollection' || !('coordinates' in geom)) {
return false;
}
var tsHolder = geom.coordinates.map(function (coord) {
return String(coord[3]);
});
return Boolean((0, _commonUtils.containValidTime)(tsHolder));
}
/**
* Get unix timestamp from animatable geojson for deck.gl trip layer
* @param dataToFeature array of geojson feature objects, can be null
* @returns
*/
function parseTripGeoJsonTimestamp(dataToFeature) {
// Analyze type based on coordinates of the 1st lineString
// select a sample trip to analyze time format
var empty = {
dataToTimeStamp: [],
animationDomain: null
};
var sampleTrip = dataToFeature.find(function (f) {
var _f$geometry;
return (f === null || f === void 0 || (_f$geometry = f.geometry) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry.coordinates) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry[0]) === null || _f$geometry === void 0 ? void 0 : _f$geometry.length) > 3;
});
// if no valid geometry
if (!sampleTrip) {
return empty;
}
var analyzedType = (0, _commonUtils.containValidTime)(sampleTrip.geometry.coordinates.map(function (coord) {
return coord[3];
}));
if (!analyzedType) {
return empty;
}
var format = analyzedType.format;
var getTimeValue = function getTimeValue(coord) {
return coord && (0, _commonUtils.notNullorUndefined)(coord[3]) ? (0, _utils.timeToUnixMilli)(coord[3], format) : null;
};
var dataToTimeStamp = dataToFeature.map(function (f) {
return f && f.geometry && Array.isArray(f.geometry.coordinates) ? f.geometry.coordinates.map(getTimeValue) : null;
});
var animationDomain = getAnimationDomainFromTimestamps(dataToTimeStamp);
return {
dataToTimeStamp: dataToTimeStamp,
animationDomain: animationDomain
};
}
function findMinFromSorted(list) {
// check if list is null since the default value [] will only be applied when the param is undefined
return (list === null || list === void 0 ? void 0 : list.find(function (d) {
return (0, _commonUtils.notNullorUndefined)(d) && Number.isFinite(d);
})) || null;
}
function findMaxFromSorted() {
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var i = list.length - 1;
while (i > 0) {
if ((0, _commonUtils.notNullorUndefined)(list[i]) && Number.isFinite(list[i])) {
return list[i];
}
i--;
}
return null;
}
function getAnimationDomainFromTimestamps() {
var dataToTimeStamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
return dataToTimeStamp.reduce(function (accu, tss) {
var tsMin = findMinFromSorted(tss);
var tsMax = findMaxFromSorted(tss);
if ((0, _commonUtils.notNullorUndefined)(tsMin) && (0, _commonUtils.notNullorUndefined)(tsMax) && Number.isFinite(tsMin) && Number.isFinite(tsMax)) {
accu[0] = Math.min(accu[0], tsMin);
accu[1] = Math.max(accu[1], tsMax);
}
return accu;
}, [Infinity, -Infinity]);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvanNvblV0aWxzIiwicmVxdWlyZSIsIl91dGlscyIsIl9jb21tb25VdGlscyIsImNvb3JkSGFzTGVuZ3RoNCIsInNhbXBsZXMiLCJoYXNMZW5ndGg0IiwiaSIsImxlbmd0aCIsIl9zYW1wbGVzJGkiLCJBcnJheSIsImlzQXJyYXkiLCJnZW9tZXRyeSIsImNvb3JkaW5hdGVzIiwiZmluZCIsImMiLCJpc1RyaXBHZW9Kc29uRmllbGQiLCJkYXRhQ29udGFpbmVyIiwiZmllbGQiLCJudW1Sb3dzIiwibWF4Q291bnQiLCJzYW1wbGVSYXdGZWF0dXJlcyIsImdldFNhbXBsZUNvbnRhaW5lckRhdGEiLCJmZWF0dXJlcyIsIm1hcEluZGV4IiwidmFsdWVBY2Nlc3NvciIsIm1hcCIsInBhcnNlR2VvSnNvblJhd0ZlYXR1cmUiLCJmaWx0ZXIiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJmZWF0dXJlVHlwZXMiLCJnZXRHZW9qc29uRmVhdHVyZVR5cGVzIiwibGluZSIsImdlb20iLCJ0eXBlIiwidHNIb2xkZXIiLCJjb29yZCIsIlN0cmluZyIsIkJvb2xlYW4iLCJjb250YWluVmFsaWRUaW1lIiwicGFyc2VUcmlwR2VvSnNvblRpbWVzdGFtcCIsImRhdGFUb0ZlYXR1cmUiLCJlbXB0eSIsImRhdGFUb1RpbWVTdGFtcCIsImFuaW1hdGlvbkRvbWFpbiIsInNhbXBsZVRyaXAiLCJmIiwiX2YkZ2VvbWV0cnkiLCJhbmFseXplZFR5cGUiLCJmb3JtYXQiLCJnZXRUaW1lVmFsdWUiLCJ0aW1lVG9Vbml4TWlsbGkiLCJnZXRBbmltYXRpb25Eb21haW5Gcm9tVGltZXN0YW1wcyIsImZpbmRNaW5Gcm9tU29ydGVkIiwibGlzdCIsImQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImZpbmRNYXhGcm9tU29ydGVkIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicmVkdWNlIiwiYWNjdSIsInRzcyIsInRzTWluIiwidHNNYXgiLCJNYXRoIiwibWluIiwibWF4IiwiSW5maW5pdHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJpcC1sYXllci90cmlwLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7cGFyc2VHZW9Kc29uUmF3RmVhdHVyZSwgZ2V0R2VvanNvbkZlYXR1cmVUeXBlc30gZnJvbSAnLi4vZ2VvanNvbi1sYXllci9nZW9qc29uLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgZ2V0U2FtcGxlQ29udGFpbmVyRGF0YSwgdGltZVRvVW5peE1pbGxpfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Y29udGFpblZhbGlkVGltZSwgbm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0ZlYXR1cmV9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuaW1wb3J0IHtHZW9Kc29uUHJvcGVydGllcywgR2VvbWV0cnl9IGZyb20gJ2dlb2pzb24nO1xuXG4vKipcbiAqIFBhcnNlIGdlb2pzb24gZnJvbSBzdHJpbmdcbiAqIEBwYXJhbSB7YXJyYXl9IHNhbXBsZXMgZmVhdHVyZSBvYmplY3QgdmFsdWVzXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnZW9tZXRyeSBjb29yZGluYXRlcyBoYXMgbGVuZ3RoIG9mIDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkSGFzTGVuZ3RoNChzYW1wbGVzKTogYm9vbGVhbiB7XG4gIGxldCBoYXNMZW5ndGg0ID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaGFzTGVuZ3RoNCA9XG4gICAgICBBcnJheS5pc0FycmF5KHNhbXBsZXNbaV0/Lmdlb21ldHJ5Py5jb29yZGluYXRlcykgJiZcbiAgICAgICFzYW1wbGVzW2ldLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmZpbmQoYyA9PiBjLmxlbmd0aCA8IDQpO1xuXG4gICAgaWYgKCFoYXNMZW5ndGg0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc0xlbmd0aDQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgZ2VvanNvbiBmZWF0dXJlcyBhcmUgdHJpcCBsYXllciBhbmltYXRhYmxlIGJ5IG1lZXRpbmcgMyBjb25kaXRpb25zXG4gKiBAcGFyYW0gZGF0YUNvbnRhaW5lciBnZW9qc29uIGZlYXR1cmUgb2JqZWN0cyBjb250YWluZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBhcnJheSBvZiBnZW9qc29uIGZlYXR1cmUgb2JqZWN0c1xuICogQHJldHVybnMgd2hldGhlciBpdCBpcyB0cmlwIGxheWVyIGFuaW1hdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJpcEdlb0pzb25GaWVsZChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBmaWVsZCk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkgPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWF4Q291bnQgPSAxMDAwMDtcbiAgY29uc3Qgc2FtcGxlUmF3RmVhdHVyZXMgPVxuICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gbWF4Q291bnRcbiAgICAgID8gZ2V0U2FtcGxlQ29udGFpbmVyRGF0YShkYXRhQ29udGFpbmVyLCBtYXhDb3VudClcbiAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICBjb25zdCBmZWF0dXJlczogRmVhdHVyZTxHZW9tZXRyeSwgR2VvSnNvblByb3BlcnRpZXM+W10gPSBzYW1wbGVSYXdGZWF0dXJlc1xuICAgIC5tYXBJbmRleChmaWVsZC52YWx1ZUFjY2Vzc29yKVxuICAgIC5tYXAocGFyc2VHZW9Kc29uUmF3RmVhdHVyZSlcbiAgICAuZmlsdGVyKG5vdE51bGxvclVuZGVmaW5lZCk7XG4gIGNvbnN0IGZlYXR1cmVUeXBlcyA9IGdldEdlb2pzb25GZWF0dXJlVHlwZXMoZmVhdHVyZXMpO1xuXG4gIC8vIGNvbmRpdGlvbiAxOiBjb250YWluIGxpbmUgc3RyaW5nXG4gIGlmICghZmVhdHVyZVR5cGVzLmxpbmUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjb25kaXRpb24gMjpzYW1wbGUgbGluZSBzdHJpbmdzIGNvbnRhaW4gNCBjb29yZGluYXRlc1xuICBpZiAoIWNvb3JkSGFzTGVuZ3RoNChmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnZW9tID0gZmVhdHVyZXNbMF0uZ2VvbWV0cnk7XG4gIGlmICghZ2VvbSB8fCBnZW9tLnR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nIHx8ICEoJ2Nvb3JkaW5hdGVzJyBpbiBnZW9tKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0c0hvbGRlciA9IChnZW9tLmNvb3JkaW5hdGVzIGFzIG51bWJlcltdW10pLm1hcChjb29yZCA9PiBTdHJpbmcoY29vcmRbM10pKTtcblxuICByZXR1cm4gQm9vbGVhbihjb250YWluVmFsaWRUaW1lKHRzSG9sZGVyKSk7XG59XG5cbi8qKlxuICogR2V0IHVuaXggdGltZXN0YW1wIGZyb20gYW5pbWF0YWJsZSBnZW9qc29uIGZvciBkZWNrLmdsIHRyaXAgbGF5ZXJcbiAqIEBwYXJhbSBkYXRhVG9GZWF0dXJlIGFycmF5IG9mIGdlb2pzb24gZmVhdHVyZSBvYmplY3RzLCBjYW4gYmUgbnVsbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHJpcEdlb0pzb25UaW1lc3RhbXAoZGF0YVRvRmVhdHVyZTogYW55W10pIHtcbiAgLy8gQW5hbHl6ZSB0eXBlIGJhc2VkIG9uIGNvb3JkaW5hdGVzIG9mIHRoZSAxc3QgbGluZVN0cmluZ1xuICAvLyBzZWxlY3QgYSBzYW1wbGUgdHJpcCB0byBhbmFseXplIHRpbWUgZm9ybWF0XG4gIGNvbnN0IGVtcHR5ID0ge2RhdGFUb1RpbWVTdGFtcDogW10sIGFuaW1hdGlvbkRvbWFpbjogbnVsbH07XG4gIGNvbnN0IHNhbXBsZVRyaXAgPSBkYXRhVG9GZWF0dXJlLmZpbmQoZiA9PiBmPy5nZW9tZXRyeT8uY29vcmRpbmF0ZXM/LlswXT8ubGVuZ3RoID4gMyk7XG5cbiAgLy8gaWYgbm8gdmFsaWQgZ2VvbWV0cnlcbiAgaWYgKCFzYW1wbGVUcmlwKSB7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgY29uc3QgYW5hbHl6ZWRUeXBlID0gY29udGFpblZhbGlkVGltZShzYW1wbGVUcmlwLmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcChjb29yZCA9PiBjb29yZFszXSkpO1xuXG4gIGlmICghYW5hbHl6ZWRUeXBlKSB7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgY29uc3Qge2Zvcm1hdH0gPSBhbmFseXplZFR5cGU7XG4gIGNvbnN0IGdldFRpbWVWYWx1ZSA9IGNvb3JkID0+XG4gICAgY29vcmQgJiYgbm90TnVsbG9yVW5kZWZpbmVkKGNvb3JkWzNdKSA/IHRpbWVUb1VuaXhNaWxsaShjb29yZFszXSwgZm9ybWF0KSA6IG51bGw7XG5cbiAgY29uc3QgZGF0YVRvVGltZVN0YW1wOiBudW1iZXJbXVtdID0gZGF0YVRvRmVhdHVyZS5tYXAoZiA9PlxuICAgIGYgJiYgZi5nZW9tZXRyeSAmJiBBcnJheS5pc0FycmF5KGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXG4gICAgICA/IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKGdldFRpbWVWYWx1ZSlcbiAgICAgIDogbnVsbFxuICApO1xuXG4gIGNvbnN0IGFuaW1hdGlvbkRvbWFpbiA9IGdldEFuaW1hdGlvbkRvbWFpbkZyb21UaW1lc3RhbXBzKGRhdGFUb1RpbWVTdGFtcCk7XG5cbiAgcmV0dXJuIHtkYXRhVG9UaW1lU3RhbXAsIGFuaW1hdGlvbkRvbWFpbn07XG59XG5cbmZ1bmN0aW9uIGZpbmRNaW5Gcm9tU29ydGVkKGxpc3Q6IG51bWJlcltdKSB7XG4gIC8vIGNoZWNrIGlmIGxpc3QgaXMgbnVsbCBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBbXSB3aWxsIG9ubHkgYmUgYXBwbGllZCB3aGVuIHRoZSBwYXJhbSBpcyB1bmRlZmluZWRcbiAgcmV0dXJuIGxpc3Q/LmZpbmQoZCA9PiBub3ROdWxsb3JVbmRlZmluZWQoZCkgJiYgTnVtYmVyLmlzRmluaXRlKGQpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF4RnJvbVNvcnRlZChsaXN0OiBudW1iZXJbXSA9IFtdKSB7XG4gIGxldCBpID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKGxpc3RbaV0pICYmIE51bWJlci5pc0Zpbml0ZShsaXN0W2ldKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaV07XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuaW1hdGlvbkRvbWFpbkZyb21UaW1lc3RhbXBzKGRhdGFUb1RpbWVTdGFtcDogbnVtYmVyW11bXSA9IFtdKSB7XG4gIHJldHVybiBkYXRhVG9UaW1lU3RhbXAucmVkdWNlKFxuICAgIChhY2N1OiBbbnVtYmVyLCBudW1iZXJdLCB0c3MpID0+IHtcbiAgICAgIGNvbnN0IHRzTWluID0gZmluZE1pbkZyb21Tb3J0ZWQodHNzKTtcbiAgICAgIGNvbnN0IHRzTWF4ID0gZmluZE1heEZyb21Tb3J0ZWQodHNzKTtcbiAgICAgIGlmIChcbiAgICAgICAgbm90TnVsbG9yVW5kZWZpbmVkKHRzTWluKSAmJlxuICAgICAgICBub3ROdWxsb3JVbmRlZmluZWQodHNNYXgpICYmXG4gICAgICAgIE51bWJlci5pc0Zpbml0ZSh0c01pbikgJiZcbiAgICAgICAgTnVtYmVyLmlzRmluaXRlKHRzTWF4KVxuICAgICAgKSB7XG4gICAgICAgIGFjY3VbMF0gPSBNYXRoLm1pbihhY2N1WzBdLCB0c01pbik7XG4gICAgICAgIGFjY3VbMV0gPSBNYXRoLm1heChhY2N1WzFdLCB0c01heCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9LFxuICAgIFtJbmZpbml0eSwgLUluZmluaXR5XVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFMQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxlQUFlQSxDQUFDQyxPQUFPLEVBQVc7RUFDaEQsSUFBSUMsVUFBVSxHQUFHLElBQUk7RUFDckIsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdGLE9BQU8sQ0FBQ0csTUFBTSxFQUFFRCxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQUEsSUFBQUUsVUFBQTtJQUMxQ0gsVUFBVSxHQUNSSSxLQUFLLENBQUNDLE9BQU8sRUFBQUYsVUFBQSxHQUFDSixPQUFPLENBQUNFLENBQUMsQ0FBQyxjQUFBRSxVQUFBLGdCQUFBQSxVQUFBLEdBQVZBLFVBQUEsQ0FBWUcsUUFBUSxjQUFBSCxVQUFBLHVCQUFwQkEsVUFBQSxDQUFzQkksV0FBVyxDQUFDLElBQ2hELENBQUNSLE9BQU8sQ0FBQ0UsQ0FBQyxDQUFDLENBQUNLLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDQyxJQUFJLENBQUMsVUFBQUMsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ1AsTUFBTSxHQUFHLENBQUM7SUFBQSxFQUFDO0lBRTFELElBQUksQ0FBQ0YsVUFBVSxFQUFFO01BQ2Y7SUFDRjtFQUNGO0VBQ0EsT0FBT0EsVUFBVTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxrQkFBa0JBLENBQUNDLGFBQXFDLEVBQUVDLEtBQUssRUFBVztFQUN4RixJQUFJRCxhQUFhLENBQUNFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lB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